Files
php_task_1/assets/js/vendor_full.js
T
2022-06-30 05:46:02 -04:00

290 lines
5.7 MiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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 '<div class="se-file-browser-content"><div class="se-file-browser-header"><button type="button" data-command="close" class="se-btn se-file-browser-close" class="close" aria-label="Close" title="' + e.lang.dialogBox.close + '">' + e.icons.cancel + '</button><span class="se-file-browser-title"></span><div class="se-file-browser-tags"></div></div><div class="se-file-browser-body"><div class="se-loading-box sun-editor-common"><div class="se-loading-effect"></div></div><div class="se-file-browser-list"></div></div></div>' }, _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 = '<div class="se-file-item-column">', 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 += '</div><div class="se-file-item-column">'), 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 += '<a title="' + e + '">' + e + "</a>"); d += "</div>", 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 = '<div class="se-list-inner">'; 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 += '<div class="se-selector-color">' + t(o) + "</div>", o = []), "object" == typeof e && (s += '<div class="se-selector-color">' + t(e) + "</div>"))); return s += '<form class="se-form-group"><input type="text" maxlength="9" class="_se_color_picker_input se-color-input"/><button type="submit" class="se-btn-primary _se_color_picker_submit" title="' + i.dialogBox.submitButton + '">' + e.icons.checked + '</button><button type="button" class="se-btn _se_color_picker_remove" title="' + i.toolbar.removeFormat + '">' + e.icons.erase + "</button></form></div>", s }, _makeColorList: function (e) { let t = ""; t += '<ul class="se-color-pallet">'; for (let n, i = 0, l = e.length; i < l; i++)n = e[i], "string" == typeof n && (t += '<li><button type="button" data-value="' + n + '" title="' + n + '" style="background-color:' + n + ';"></button></li>'); return t += "</ul>", 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 = '<div class="se-submenu se-list-inner"><ul class="se-list-basic">'; for (let e, n = 0, l = t.length; n < l; n++)e = t[n], i += '<li><button type="button" class="se-btn-list" data-value="' + n + '" title="' + e.name + '">' + e.name + "</button></li>"; return i += "</ul></div>", 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 '<div class="se-select-list"></div>' }, createList: function (e, t, n) { e.form.innerHTML = "<ul>" + n + "</ul>", 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 = '<div class="se-dialog-body"><div class="se-dialog-form"><label>' + t.dialogBox.linkBox.url + '</label><div class="se-dialog-form-files"><input class="se-input-form se-input-url" type="text" placeholder="' + (e.options.protocol || "") + '" /><button type="button" class="se-btn se-dialog-files-edge-button _se_bookmark_button" title="' + t.dialogBox.linkBox.bookmark + '">' + l.bookmark + "</button>" + e.plugins.selectMenu.setForm() + '</div><div class="se-anchor-preview-form"><span class="se-svg se-anchor-preview-icon _se_anchor_bookmark_icon">' + l.bookmark + '</span><span class="se-svg se-anchor-preview-icon _se_anchor_download_icon">' + l.download + '</span><pre class="se-link-preview"></pre></div></div><div class="se-dialog-form"><label>' + t.dialogBox.linkBox.text + '</label><input class="se-input-form _se_anchor_text" type="text" /></div><div class="se-dialog-form-footer"><label><input type="checkbox" class="se-dialog-btn-check _se_anchor_check" />&nbsp;' + t.dialogBox.linkBox.newWindowCheck + '</label><label><input type="checkbox" class="se-dialog-btn-check _se_anchor_download" />&nbsp;' + t.dialogBox.linkBox.downloadLinkCheck + "</label>"; if (n.length > 0) { s += '<div class="se-anchor-rel"><button type="button" class="se-btn se-btn-select se-anchor-rel-btn">&lt;rel&gt;</button><div class="se-anchor-rel-wrapper"><pre class="se-link-preview se-anchor-rel-preview"></pre></div><div class="se-list-layer"><div class="se-list-inner"><ul class="se-list-basic se-list-checked">'; for (let e, t = 0, o = n.length; t < o; t++)e = n[t], s += '<li><button type="button" class="se-btn-list' + (i.indexOf(e) > -1 ? " se-checked" : "") + '" data-command="' + e + '" title="' + e + '"><span class="se-svg">' + l.checked + "</span>" + e + "</button></li>"; s += "</ul></div></div></div>" } return s += "</div></div>", 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 += '<li class="se-select-item" data-index="' + t + '">' + e.textContent + "</li>"); 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 = '<form><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="' + t.dialogBox.close + '">' + i.cancel + '</button><span class="se-modal-title">' + t.dialogBox.linkBox.title + "</span></div>" + e.context.anchor.forms.innerHTML + '<div class="se-dialog-footer"><button type="submit" class="se-btn-primary" title="' + t.dialogBox.submitButton + '"><span>' + t.dialogBox.submitButton + "</span></button></div></form>"; 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 = '<div class="se-arrow se-arrow-up"></div><div class="link-content"><span><a target="_blank" href=""></a>&nbsp;</span><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">' + n.edit + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.edit + '</span></span></button><button type="button" data-command="unlink" tabindex="-1" class="se-btn se-tooltip">' + n.unlink + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.unlink + '</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">' + n.delete + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.remove + "</span></span></button></div></div>", 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 = '<div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" class="close" aria-label="Close" title="' + n.dialogBox.close + '">' + e.icons.cancel + '</button><span class="se-modal-title">' + n.dialogBox.imageBox.title + '</span></div><div class="se-dialog-tabs"><button type="button" class="_se_tab_link active" data-tab-link="image">' + n.toolbar.image + '</button><button type="button" class="_se_tab_link" data-tab-link="url">' + n.toolbar.link + '</button></div><form method="post" enctype="multipart/form-data"><div class="_se_tab_content _se_tab_content_image"><div class="se-dialog-body"><div style="border-bottom: 1px dashed #ccc;">'; if (t.imageFileInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.imageBox.file + '</label><div class="se-dialog-form-files"><input class="se-input-form _se_image_file" type="file" accept="' + t.imageAccept + '"' + (t.imageMultipleFile ? ' multiple="multiple"' : "") + '/><button type="button" class="se-btn se-dialog-files-edge-button se-file-remove" title="' + n.controller.remove + '">' + e.icons.cancel + "</button></div></div>"), t.imageUrlInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.imageBox.url + '</label><div class="se-dialog-form-files"><input class="se-input-form se-input-url _se_image_url" type="text" />' + (t.imageGalleryUrl && e.plugins.imageGallery ? '<button type="button" class="se-btn se-dialog-files-edge-button __se__gallery" title="' + n.toolbar.imageGallery + '">' + e.icons.image_gallery + "</button>" : "") + '</div><pre class="se-link-preview"></pre></div>'), l += '</div><div class="se-dialog-form"><label>' + n.dialogBox.imageBox.altText + '</label><input class="se-input-form _se_image_alt" type="text" /></div>', t.imageResizing) { const i = t.imageSizeOnlyPercentage, o = i ? ' style="display: none !important;"' : "", s = t.imageHeightShow ? "" : ' style="display: none !important;"'; l += '<div class="se-dialog-form">', i || !t.imageHeightShow ? l += '<div class="se-dialog-size-text"><label class="size-w">' + n.dialogBox.size + "</label></div>" : l += '<div class="se-dialog-size-text"><label class="size-w">' + n.dialogBox.width + '</label><label class="se-dialog-size-x">&nbsp;</label><label class="size-h">' + n.dialogBox.height + "</label></div>", l += '<input class="se-input-control _se_image_size_x" placeholder="auto"' + (i ? ' type="number" min="1"' : 'type="text"') + (i ? ' max="100"' : "") + ' /><label class="se-dialog-size-x"' + s + ">" + (i ? "%" : "x") + '</label><input type="text" class="se-input-control _se_image_size_y" placeholder="auto"' + o + (i ? ' max="100"' : "") + s + "/><label" + o + s + '><input type="checkbox" class="se-dialog-btn-check _se_image_check_proportion" checked/>&nbsp;' + n.dialogBox.proportion + '</label><button type="button" title="' + n.dialogBox.revertButton + '" class="se-btn se-dialog-btn-revert" style="float: right;">' + e.icons.revert + "</button></div>" } return l += '<div class="se-dialog-form se-dialog-form-footer"><label><input type="checkbox" class="se-dialog-btn-check _se_image_check_caption" />&nbsp;' + n.dialogBox.caption + '</label></div></div></div><div class="_se_tab_content _se_tab_content_url" style="display: none">' + e.context.anchor.forms.innerHTML + '</div><div class="se-dialog-footer"><div><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="none" checked>' + n.dialogBox.basic + '</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="left">' + n.dialogBox.left + '</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="center">' + n.dialogBox.center + '</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="right">' + n.dialogBox.right + '</label></div><button type="submit" class="se-btn-primary" title="' + n.dialogBox.submitButton + '"><span>' + n.dialogBox.submitButton + "</span></button></div></form>", 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 = '<form method="post" enctype="multipart/form-data"><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="' + n.dialogBox.close + '">' + e.icons.cancel + '</button><span class="se-modal-title">' + n.dialogBox.videoBox.title + '</span></div><div class="se-dialog-body">'; if (t.videoFileInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.videoBox.file + '</label><div class="se-dialog-form-files"><input class="se-input-form _se_video_file" type="file" accept="' + t.videoAccept + '"' + (t.videoMultipleFile ? ' multiple="multiple"' : "") + '/><button type="button" data-command="filesRemove" class="se-btn se-dialog-files-edge-button se-file-remove" title="' + n.controller.remove + '">' + e.icons.cancel + "</button></div></div>"), t.videoUrlInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.videoBox.url + '</label><input class="se-input-form se-input-url" type="text" /><pre class="se-link-preview"></pre></div>'), 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 += '<div class="se-dialog-form"><div class="se-dialog-size-text"><label class="size-w">' + n.dialogBox.width + '</label><label class="se-dialog-size-x">&nbsp;</label><label class="size-h"' + r + ">" + n.dialogBox.height + '</label><label class="size-h"' + c + ">(" + n.dialogBox.ratio + ')</label></div><input class="se-input-control _se_video_size_x" placeholder="100%"' + (s ? ' type="number" min="1"' : 'type="text"') + (s ? ' max="100"' : "") + '/><label class="se-dialog-size-x"' + d + ">" + (s ? "%" : "x") + '</label><input class="se-input-control _se_video_size_y" placeholder="' + 100 * t.videoRatio + '%"' + (s ? ' type="number" min="1"' : 'type="text"') + (s ? ' max="100"' : "") + r + '/><select class="se-input-select se-video-ratio" title="' + n.dialogBox.ratio + '"' + c + ">", r || (l += '<option value=""> - </option>'); for (let e = 0, t = i.length; e < t; e++)l += '<option value="' + i[e].value + '"' + (o.toString() === i[e].value.toString() ? " selected" : "") + ">" + i[e].name + "</option>"; l += '</select><button type="button" title="' + n.dialogBox.revertButton + '" class="se-btn se-dialog-btn-revert" style="float: right;">' + e.icons.revert + '</button></div><div class="se-dialog-form se-dialog-form-footer"' + a + d + '><label><input type="checkbox" class="se-dialog-btn-check _se_video_check_proportion" checked/>&nbsp;' + n.dialogBox.proportion + "</label></div>" } return l += '</div><div class="se-dialog-footer"><div><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="none" checked>' + n.dialogBox.basic + '</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="left">' + n.dialogBox.left + '</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="center">' + n.dialogBox.center + '</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="right">' + n.dialogBox.right + '</label></div><button type="submit" class="se-btn-primary" title="' + n.dialogBox.submitButton + '"><span>' + n.dialogBox.submitButton + "</span></button></div></form>", 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(); /^<iframe.*\/iframe>$/.test(i) ? (e._linkValue = i, this.textContent = '<IFrame :src=".."></IFrame>') : 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 (/^<iframe.*\/iframe>$/.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 = '<form method="post" enctype="multipart/form-data"><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="' + n.dialogBox.close + '">' + e.icons.cancel + '</button><span class="se-modal-title">' + n.dialogBox.audioBox.title + '</span></div><div class="se-dialog-body">'; return t.audioFileInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.audioBox.file + '</label><div class="se-dialog-form-files"><input class="se-input-form _se_audio_files" type="file" accept="' + t.audioAccept + '"' + (t.audioMultipleFile ? ' multiple="multiple"' : "") + '/><button type="button" data-command="filesRemove" class="se-btn se-dialog-files-edge-button se-file-remove" title="' + n.controller.remove + '">' + e.icons.cancel + "</button></div></div>"), t.audioUrlInput && (l += '<div class="se-dialog-form"><label>' + n.dialogBox.audioBox.url + '</label><input class="se-input-form se-input-url" type="text" /><pre class="se-link-preview"></pre></div>'), l += '</div><div class="se-dialog-footer"><button type="submit" class="se-btn-primary" title="' + n.dialogBox.submitButton + '"><span>' + n.dialogBox.submitButton + "</span></button></div></form>", 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 = '<div class="se-arrow se-arrow-up"></div><div class="link-content"><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-tooltip">' + n.edit + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.edit + '</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-tooltip">' + n.delete + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.remove + "</span></span></button></div></div>", 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 = '<form><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="' + t.dialogBox.close + '">' + e.icons.cancel + '</button><span class="se-modal-title">' + t.dialogBox.mathBox.title + '</span></div><div class="se-dialog-body"><div class="se-dialog-form"><label>' + t.dialogBox.mathBox.inputLabel + ' (<a href="https://katex.org/docs/supported.html" target="_blank">KaTeX</a>)</label><textarea class="se-input-form se-math-exp" type="text"></textarea></div><div class="se-dialog-form"><label>' + t.dialogBox.mathBox.fontSizeLabel + '</label><select class="se-input-select se-math-size">'; for (let e, t = 0, n = i.length; t < n; t++)e = i[t], e.default && (l = e.value), o += '<option value="' + e.value + '"' + (e.default ? " selected" : "") + ">" + e.text + "</option>"; return o += '</select></div><div class="se-dialog-form"><label>' + t.dialogBox.mathBox.previewLabel + '</label><p class="se-math-preview"></p></div></div><div class="se-dialog-footer"><button type="submit" class="se-btn-primary" title="' + t.dialogBox.submitButton + '"><span>' + t.dialogBox.submitButton + "</span></button></div></form>", 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 = '<div class="se-arrow se-arrow-up"></div><div class="link-content"><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">' + e.icons.edit + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.edit + '</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">' + e.icons.delete + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.remove + "</span></span></button></div></div>", 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 = '<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyleft" data-value="left" title="' + t.toolbar.alignLeft + '"><span class="se-list-icon">' + n.align_left + "</span>" + t.toolbar.alignLeft + "</button></li>", s = '<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyright" data-value="right" title="' + t.toolbar.alignRight + '"><span class="se-list-icon">' + n.align_right + "</span>" + t.toolbar.alignRight + "</button></li>"; return i.className = "se-submenu se-list-layer se-list-align", i.innerHTML = '<div class="se-list-inner"><ul class="se-list-basic">' + (l ? o : s) + '<li><button type="button" class="se-btn-list se-btn-align" data-command="justifycenter" data-value="center" title="' + t.toolbar.alignCenter + '"><span class="se-list-icon">' + n.align_center + "</span>" + t.toolbar.alignCenter + "</button></li>" + (l ? s : o) + '<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyfull" data-value="justify" title="' + t.toolbar.alignJustify + '"><span class="se-list-icon">' + n.align_justify + "</span>" + t.toolbar.alignJustify + "</button></li></ul></div>", 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 = '<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="' + n.toolbar.default + '">(' + n.toolbar.default + ")</button></li>"; for (s = 0, a = r.length; s < a; s++)l = r[s], o = l.split(",")[0], c += '<li><button type="button" class="se-btn-list" data-value="' + l + '" data-txt="' + o + '" title="' + o + '" style="font-family:' + l + ';">' + o + "</button></li>"; return c += "</ul></div>", 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 = '<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="' + n.toolbar.default + '">(' + n.toolbar.default + ")</button></li>"; for (let e, n = 0, i = t.fontSizeUnit, s = l.length; n < s; n++)e = l[n], o += '<li><button type="button" class="se-btn-list" data-value="' + e + i + '" title="' + e + i + '" style="font-size:' + e + i + ';">' + e + "</button></li>"; return o += "</ul></div>", 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 = '<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="solid" title="' + t.toolbar.hr_solid + '"><hr style="border-width: 1px 0 0; border-style: solid none none; border-color: black; border-image: initial; height: 1px;" /></button></li><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="dotted" title="' + t.toolbar.hr_dotted + '"><hr style="border-width: 1px 0 0; border-style: dotted none none; border-color: black; border-image: initial; height: 1px;" /></button></li><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="dashed" title="' + t.toolbar.hr_dashed + '"><hr style="border-width: 1px 0 0; border-style: dashed none none; border-color: black; border-image: initial; height: 1px;" /></button></li></ul></div>', 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 = '<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list se-tooltip" data-command="OL" title="' + t.toolbar.orderList + '">' + e.icons.list_number + '</button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="UL" title="' + t.toolbar.unorderList + '">' + e.icons.list_bullets + "</button></li></ul></div>", 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 = "<br>"), t.innerHTML += n.outerHTML, e && (t.innerHTML += "<br>") } 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 = '<div class="se-table-size"><div class="se-table-size-picker se-controller-table-picker"></div><div class="se-table-size-highlighted"></div><div class="se-table-size-unhighlighted"></div></div><div class="se-table-size-display">1 x 1</div>', 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 = '<div><div class="se-btn-group"><button type="button" data-command="resize" class="se-btn se-tooltip _se_table_resize">' + n.expansion + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.maxSize + '</span></span></button><button type="button" data-command="layout" class="se-btn se-tooltip _se_table_fixed_column">' + n.fixed_column_width + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.fixedColumnWidth + '</span></span></button><button type="button" data-command="header" class="se-btn se-tooltip _se_table_header">' + n.table_header + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.tableHeader + '</span></span></button><button type="button" data-command="remove" class="se-btn se-tooltip">' + n.delete + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.remove + "</span></span></button></div></div>", 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 ? "" : '<div class="se-arrow se-arrow-up"></div>') + '<div class="se-btn-group"><button type="button" data-command="insert" data-value="row" data-option="up" class="se-btn se-tooltip _se_table_insert_row_a">' + i.insert_row_above + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.insertRowAbove + '</span></span></button><button type="button" data-command="insert" data-value="row" data-option="down" class="se-btn se-tooltip _se_table_insert_row_b">' + i.insert_row_below + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.insertRowBelow + '</span></span></button><button type="button" data-command="delete" data-value="row" class="se-btn se-tooltip">' + i.delete_row + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.deleteRow + '</span></span></button><button type="button" data-command="merge" class="_se_table_merge_button se-btn se-tooltip" disabled>' + i.merge_cell + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.mergeCells + '</span></span></button></div><div class="se-btn-group" style="padding-top: 0;"><button type="button" data-command="insert" data-value="cell" data-option="left" class="se-btn se-tooltip">' + i.insert_column_left + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.insertColumnBefore + '</span></span></button><button type="button" data-command="insert" data-value="cell" data-option="right" class="se-btn se-tooltip">' + i.insert_column_right + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.insertColumnAfter + '</span></span></button><button type="button" data-command="delete" data-value="cell" class="se-btn se-tooltip">' + i.delete_column + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.deleteColumn + '</span></span></button><button type="button" data-command="onsplit" class="_se_table_split_button se-btn se-tooltip">' + i.split_cell + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + n.controller.splitCells + '</span></span></button><div class="se-btn-group-sub sun-editor-common se-list-layer se-table-split"><div class="se-list-inner"><ul class="se-list-basic"><li class="se-btn-list" data-command="split" data-value="vertical" style="line-height:32px;" title="' + n.controller.VerticalSplit + '">' + n.controller.VerticalSplit + '</li><li class="se-btn-list" data-command="split" data-value="horizontal" style="line-height:32px;" title="' + n.controller.HorizontalSplit + '">' + n.controller.HorizontalSplit + "</li></ul></div></div></div>", 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 = "<tbody>"; for (; i > 0;)l += "<tr>" + t.call(this, "td", n) + "</tr>", --i; l += "</tbody>", 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 = "<div><br></div>", t } { let n = ""; for (; t > 0;)n += "<" + e + "><div><br></div></" + 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 += "<tbody><tr>" + n.createCells.call(this, "td", i._logical_cellCnt, !1) + "</tr></tbody>") } } 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 = "<tr>" + this.plugins.table.createCells.call(this, "th", this.context.table._logical_cellCnt, !1) + "</tr>", 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 = '<div class="se-list-inner"><ul class="se-list-basic">'; 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 += '<li><button type="button" class="se-btn-list" data-command="' + i + '" data-value="' + t + '" data-class="' + d + '" title="' + a + '"><' + t + c + ">" + a + "</" + t + "></button></li>"; return s += "</ul></div>", 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 += "<BR>" + a.innerHTML, r.removeItem(a)), n = l.cloneNode(!1), h = !0), c = n.innerHTML, n.innerHTML = (h || !o || !c || /<br>$/i.test(o) ? o : o + "<BR>") + c, 0 === u) { t.insertBefore(n, i), a = i.nextSibling, a && n.nodeName === a.nodeName && r.isSameAttributes(n, a) && (n.innerHTML += "<BR>" + a.innerHTML, r.removeItem(a)); const e = n.previousSibling; e && n.nodeName === e.nodeName && r.isSameAttributes(n, e) && (e.innerHTML += "<BR>" + 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 = '<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="' + n.toolbar.default + '">(' + n.toolbar.default + ")</button></li>"; for (let e, t = 0, n = l.length; t < n; t++)e = l[t], o += '<li><button type="button" class="se-btn-list" data-value="' + e.value + '" title="' + e.text + '">' + e.text + "</button></li>"; return o += "</ul></div>", 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 = '<div class="se-list-inner"><ul class="se-list-basic">'; 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 += '<li><button type="button" class="se-btn-list' + (i ? " " + i : "") + '" data-value="' + e.class + '" title="' + t + '"><div' + n + ">" + t + "</div></button></li>" } return s += "</ul></div>", 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 = '<div class="se-list-inner"><ul class="se-list-basic">'; 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 += '<li><button type="button" class="se-btn-list' + (c ? " " + c : "") + '" data-command="' + t + '" data-value="' + r + '" title="' + n + '"><' + t + s + ">" + n + "</" + t + "></button></li>" } return o += "</ul></div>", 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 '<div class="se-file-item-img"><img src="' + e.src + '" alt="' + (e.alt || t) + '" data-command="pick"><div class="se-file-img-name se-file-name-back"></div><div class="se-file-img-name __se__img_name">' + (e.name || t) + "</div></div>" }, 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: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.5 15.8" xml:space="preserve"><g><path d="M0.3,0.1c0.3,0,0.5,0,0.7,0c1,0.1,1.7,0.1,2.2,0.1H4L7.2,0l0.2,1.1H7c-0.5,0-1,0.1-1.5,0.3v0.4l0.3,1.9L6,4.4L6.3,6 l0.1,0.4l0.1,0.5c0.1,0.2,0.1,0.4,0.2,0.7s0.1,0.6,0.2,0.9L7,9.1l0.6,2.8l0.3,1.4c0.1,0.4,0.2,0.7,0.4,1c0.4,0.2,0.8,0.3,1.2,0.4 l0.8,0.2l0.2,0.9l-1.1,0c-0.9-0.1-1.5-0.1-1.8-0.1h-2c-0.9,0.1-1.4,0.2-1.5,0.2c-0.1,0-0.2,0-0.3,0H3.4c-0.1,0-0.2,0-0.2,0 l-0.1-0.4c0-0.2-0.1-0.4-0.1-0.6l0.7-0.1c0.4,0,0.8-0.1,1.2-0.2c0-0.1,0-0.2,0-0.3l-0.1-0.5l-0.4-2.4L4,9.6L3.4,6.4 C3.2,5.7,3,4.7,2.7,3.3c0-0.3-0.1-0.5-0.1-0.8C2.5,2.1,2.4,1.9,2.3,1.6C2,1.4,1.6,1.3,1.3,1.2C0.9,1.2,0.5,1.1,0.2,0.9L0,0.4L0,0 L0.3,0.1L0.3,0.1z"/></g></svg>', indent: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><g><path d="M15.5,10.1L15.5,10.1c0.1,0,0.3,0.1,0.3,0.3v1.7c0,0.1,0,0.1-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1l-15.2,0 c-0.1,0-0.1,0-0.2-0.1C0,12.2,0,12.2,0,12.1l0-1.7c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C0.3,10.1,15.5,10.1,15.5,10.1z M9.8,6.7c0.1,0,0.1,0,0.2,0.1C10.1,6.9,10.1,7,10.1,7v1.7c0,0.1,0,0.2-0.1,0.2C10,9,9.9,9,9.8,9L0.3,9C0.2,9,0.1,9,0.1,8.9 C0,8.9,0,8.8,0,8.7V7C0,7,0,6.9,0.1,6.8c0.1-0.1,0.1-0.1,0.2-0.1C0.3,6.7,9.8,6.7,9.8,6.7z M0.3,3.4h9.6h0c0.1,0,0.3,0.1,0.3,0.3 v1.7v0c0,0.1-0.1,0.3-0.3,0.3H0.3c-0.1,0-0.1,0-0.2-0.1C0,5.5,0,5.4,0,5.3V3.6c0-0.1,0-0.1,0.1-0.2C0.1,3.4,0.2,3.4,0.3,3.4 L0.3,3.4z M0.3,0l15.2,0c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2V2c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H0.3 c-0.1,0-0.1,0-0.2-0.1C0,2.1,0,2,0,2l0-1.7c0-0.1,0-0.1,0.1-0.2C0.1,0,0.2,0,0.3,0z"/></g><path d="M13.1,3.5L15.7,6c0.1,0.1,0.1,0.3,0,0.4l-2.5,2.5C13.1,9,13,9,12.9,9c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2V3.7 c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C13,3.4,13.1,3.4,13.1,3.5z"/></g></svg>', outdent: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><g><path d="M15.5,10.1L15.5,10.1c0.1,0,0.3,0.1,0.3,0.3v1.7c0,0.1,0,0.1-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1l-15.2,0 c-0.1,0-0.1,0-0.2-0.1C0,12.2,0,12.2,0,12.1l0-1.7c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C0.3,10.1,15.5,10.1,15.5,10.1z M9.8,6.7c0.1,0,0.1,0,0.2,0.1C10.1,6.9,10.1,7,10.1,7v1.7c0,0.1,0,0.2-0.1,0.2C10,9,9.9,9,9.8,9L0.3,9C0.2,9,0.1,9,0.1,8.9 C0,8.9,0,8.8,0,8.7V7C0,7,0,6.9,0.1,6.8c0.1-0.1,0.1-0.1,0.2-0.1C0.3,6.7,9.8,6.7,9.8,6.7z M0.3,3.4h9.6h0c0.1,0,0.3,0.1,0.3,0.3 v1.7v0c0,0.1-0.1,0.3-0.3,0.3H0.3c-0.1,0-0.1,0-0.2-0.1C0,5.5,0,5.4,0,5.3V3.6c0-0.1,0-0.1,0.1-0.2C0.1,3.4,0.2,3.4,0.3,3.4 L0.3,3.4z M0.3,0l15.2,0c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2V2c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H0.3 c-0.1,0-0.1,0-0.2-0.1C0,2.1,0,2,0,2l0-1.7c0-0.1,0-0.1,0.1-0.2C0.1,0,0.2,0,0.3,0z"/></g><path d="M15.5,3.4c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2v5.1c0,0.1,0,0.1-0.1,0.2C15.6,9,15.5,9,15.5,9 c-0.1,0-0.1,0-0.2-0.1l-2.5-2.5c-0.1-0.1-0.1-0.3,0-0.4l2.5-2.5C15.3,3.4,15.4,3.4,15.5,3.4z"/></g></svg>', list_bullets: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><path d="M12.4,10.7c0,0.9,0.8,1.7,1.7,1.7c0.9,0,1.7-0.8,1.7-1.7C15.7,9.8,15,9,14.1,9c-0.4,0-0.9,0.2-1.2,0.5 C12.5,9.8,12.4,10.2,12.4,10.7C12.4,10.7,12.4,10.7,12.4,10.7z M12.4,6.2c0,0.9,0.8,1.7,1.7,1.7c0.4,0,0.9-0.2,1.2-0.5 c0.3-0.3,0.4-0.7,0.4-1.1c0-0.9-0.7-1.7-1.6-1.7C13.1,4.6,12.4,5.3,12.4,6.2C12.4,6.2,12.4,6.2,12.4,6.2z M0,9.8v1.7 c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1l10.7,0c0,0,0,0,0,0c0.1,0,0.3-0.1,0.3-0.3V9.8c0-0.1,0-0.1-0.1-0.2 C11.1,9.6,11,9.6,11,9.6l-10.7,0c-0.1,0-0.1,0-0.2,0.1C0,9.7,0,9.8,0,9.8L0,9.8z M12.9,2.9c0.3,0.3,0.7,0.5,1.2,0.5 c0.4,0,0.9-0.2,1.2-0.5c0.7-0.7,0.7-1.7,0-2.4C14.9,0.2,14.5,0,14.1,0c-0.4,0-0.9,0.2-1.2,0.5c-0.3,0.3-0.5,0.7-0.5,1.2 C12.4,2.1,12.5,2.6,12.9,2.9z M0,5.3V7c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1H11c0.1,0,0.1,0,0.2-0.1 c0.1-0.1,0.1-0.1,0.1-0.2V5.3c0,0,0,0,0,0c0-0.1-0.1-0.3-0.3-0.3H0.3c-0.1,0-0.1,0-0.2,0.1C0,5.2,0,5.3,0,5.3L0,5.3z M0,0.8v1.7 c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1h10.7c0.1,0,0.1,0,0.2-0.1c0,0,0.1-0.1,0.1-0.2V0.8c0-0.1,0-0.1-0.1-0.2 c0-0.1-0.1-0.1-0.2-0.1H0.3c-0.1,0-0.1,0-0.2,0.1C0,0.7,0,0.8,0,0.8L0,0.8z"/></g></svg>', list_number: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M0,11.5l0,1.7c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1H11c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2v-1.7 c0-0.1,0-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1H0.3c-0.1,0-0.2,0-0.2,0.1C0,11.4,0,11.4,0,11.5L0,11.5z M0,8.7c0,0.1,0,0.1,0.1,0.2 C0.1,8.9,0.2,9,0.3,9H11c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2V7c0-0.1,0-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1l-10.7,0 c-0.1,0-0.2,0-0.2,0.1C0,6.8,0,6.9,0,7C0,7,0,8.7,0,8.7z M0,2.5v1.7c0,0.1,0,0.1,0.1,0.2c0,0,0.1,0.1,0.2,0.1l10.7,0 c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2V2.4c0-0.1,0-0.1-0.1-0.2c-0.1,0-0.1,0-0.2,0H0.3c-0.1,0-0.1,0-0.2,0 C0,2.3,0,2.4,0,2.5L0,2.5z"/></g><path d="M15.6,14.2c0-0.3-0.1-0.6-0.3-0.8c-0.2-0.2-0.4-0.4-0.7-0.4l0.9-1v-0.8h-2.9v1.3h0.9v-0.5h0.9l0,0c-0.1,0.1-0.2,0.2-0.3,0.3 s-0.2,0.3-0.4,0.5l-0.3,0.3l0.2,0.5c0.6,0,0.9,0.1,0.9,0.5c0,0.1-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.1-0.4,0.1c-0.3,0-0.7-0.1-0.9-0.3 l-0.5,0.8c0.4,0.4,0.9,0.6,1.5,0.6c0.4,0,0.9-0.1,1.2-0.4C15.5,15.1,15.6,14.7,15.6,14.2z"/><path d="M15.6,8.7h-0.9v0.5h-1.1c0-0.2,0.2-0.4,0.4-0.5c0.2-0.2,0.4-0.3,0.7-0.4c0.3-0.2,0.5-0.3,0.7-0.6c0.2-0.2,0.3-0.5,0.3-0.8 c0-0.4-0.2-0.8-0.5-1c-0.6-0.4-1.4-0.5-2-0.1c-0.3,0.2-0.5,0.4-0.6,0.7L13.3,7c0.1-0.3,0.4-0.5,0.7-0.5c0.1,0,0.3,0,0.3,0.1 c0.1,0.1,0.1,0.2,0.1,0.3c0,0.2-0.1,0.3-0.2,0.4c-0.2,0.1-0.3,0.3-0.5,0.4c-0.2,0.1-0.4,0.3-0.6,0.4c-0.2,0.2-0.4,0.4-0.5,0.6 c-0.1,0.2-0.2,0.5-0.2,0.8c0,0.2,0,0.3,0,0.5h3.2L15.6,8.7L15.6,8.7z"/><path d="M15.6,3.6h-1V0h-0.9l-1.2,1.1l0.6,0.7c0.2-0.1,0.3-0.3,0.4-0.5l0,0v2.2h-0.9v0.9h3L15.6,3.6L15.6,3.6z"/></svg>', link: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M7.4,9.9l3.1,3.1c0.3,0.3,0.8,0.5,1.3,0.5c0.5,0,0.9-0.2,1.3-0.5c0,0,0,0,0,0c0.7-0.7,0.7-1.9,0-2.6L9.9,7.3 c0-0.1,0-0.2,0-0.3C9.9,7,10,7,10.1,7l2.2-0.2c0.1,0,0.1,0,0.2,0.1l2.1,2.1c0.4,0.4,0.7,0.8,0.9,1.3c0.2,0.5,0.3,1,0.3,1.5 c0,0.5-0.1,1-0.3,1.5c-0.8,2-3.2,3-5.2,2.2c-0.5-0.2-0.9-0.5-1.3-0.9l-2.1-2.1c-0.1,0-0.1-0.1-0.1-0.2L7,10.1C7,10,7,9.9,7.1,9.9 C7.2,9.8,7.3,9.9,7.4,9.9z M1.2,1.1C1.6,0.7,2,0.4,2.5,0.3c1-0.4,2.1-0.4,3.1,0C6,0.4,6.5,0.7,6.8,1.1L9,3.2C9,3.3,9.1,3.3,9,3.4 L8.8,5.6c0,0.1-0.1,0.2-0.2,0.2c-0.1,0.1-0.2,0.1-0.3,0L5.3,2.7C5,2.3,4.5,2.1,4,2.1c-0.5,0-0.9,0.2-1.3,0.5c0,0,0,0,0,0 C2,3.4,2,4.5,2.7,5.2l3.1,3.2c0.1,0.1,0.1,0.2,0,0.3c0,0.1-0.1,0.1-0.2,0.1L3.5,9C3.4,9,3.4,9,3.3,8.9L1.2,6.8c0,0,0,0,0,0 C-0.4,5.2-0.4,2.7,1.2,1.1L1.2,1.1z M14.3,6h-2.6c0,0,0,0,0,0c-0.1,0-0.2-0.1-0.2-0.2c0-0.1,0-0.2,0.1-0.3l2.5-0.7 c0.1,0,0.1,0,0.2,0c0.1,0,0.1,0.1,0.1,0.2l0.1,0.8c0,0.1,0,0.1-0.1,0.2C14.5,6,14.4,6,14.3,6L14.3,6z M10.2,4.1 c0,0.1-0.1,0.2-0.2,0.2l0,0c0,0,0,0,0,0C9.8,4.2,9.7,4.1,9.8,4L9.7,1.4c0-0.1,0-0.1,0.1-0.2c0.1,0,0.1,0,0.2,0h0.8 c0.1,0,0.1,0,0.2,0.1c0,0.1,0,0.1,0,0.2L10.2,4.1L10.2,4.1z M1.5,9.7h1.3h1.3c0.1,0,0.2,0.1,0.2,0.2c0,0.1,0,0.2-0.1,0.3l-2.5,0.6 H1.6c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.1-0.2L1.2,9.9c0-0.1,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.2-0.1L1.5,9.7z M5.6,11.6 C5.6,11.6,5.6,11.6,5.6,11.6c0-0.1,0.1-0.2,0.3-0.1c0,0,0,0,0,0c0.1,0,0.2,0.1,0.2,0.2v2.6c0,0.1,0,0.1-0.1,0.2 c0,0-0.1,0.1-0.2,0.1L5,14.5c-0.1,0-0.1,0-0.2-0.1c0-0.1,0-0.1,0-0.2L5.6,11.6L5.6,11.6z"/></g></svg>', unlink: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M14.6,14.6c1.6-1.6,1.6-4.1,0-5.7l0,0l-3.1-3.1l-1.2,1.6l2.9,2.9c0.4,0.4,0.6,0.9,0.6,1.5c0,1.1-0.9,2.1-2.1,2.1l0,0 c-0.6,0-1.1-0.2-1.5-0.6l-0.4-0.4l-1.7,1l0.8,0.8C10.4,16.2,13,16.2,14.6,14.6L14.6,14.6L14.6,14.6z M3.6,6C3,5.9,2.6,5.5,2.3,5 S1.9,4,2.1,3.4C2.3,2.9,2.6,2.5,3,2.2C3.5,2,4.1,1.9,4.6,2l3.3,1.4l0.5-2L5.1,0.1C4-0.1,2.9,0,2,0.5C1.1,1.1,0.4,1.9,0.2,3 C-0.1,4,0,5.1,0.6,6C1.1,6.9,1.9,7.6,3,7.8l5.4,2l0.5-2L6.2,6.9L3.6,6z"/></g></svg>' }, redo: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.59 14.18"><g><path d="M11.58,18.48a6.84,6.84,0,1,1,6.85-6.85s0,.26,0,.67a8,8,0,0,1-.22,1.44l.91-.55a.51.51,0,0,1,.36,0,.45.45,0,0,1,.29.22.47.47,0,0,1,.06.36.45.45,0,0,1-.22.29L17.42,15.3l-.12,0h-.25l-.12-.06-.09-.09-.06-.07,0-.06-.87-2.12a.43.43,0,0,1,0-.37.49.49,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26l.44,1.09a6.51,6.51,0,0,0,.24-1.36,4.58,4.58,0,0,0,0-.64,5.83,5.83,0,0,0-1.73-4.17,5.88,5.88,0,0,0-8.34,0,5.9,5.9,0,0,0,4.17,10.06.51.51,0,0,1,.33.15.48.48,0,0,1,0,.68.53.53,0,0,1-.33.12Z" transform="translate(-4.48 -4.54)"/></g></svg>', undo: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.59 14.18"><g><path d="M5,14a.43.43,0,0,1-.22-.29.46.46,0,0,1,.06-.36.43.43,0,0,1,.29-.22.56.56,0,0,1,.36,0l.91.55a8.27,8.27,0,0,1-.22-1.45,5.07,5.07,0,0,1,0-.67A6.85,6.85,0,1,1,13,18.47a.44.44,0,0,1-.33-.13.48.48,0,0,1,0-.68.51.51,0,0,1,.33-.15A5.89,5.89,0,0,0,17.15,7.45a5.88,5.88,0,0,0-8.33,0,5.84,5.84,0,0,0-1.73,4.17s0,.25,0,.65a6.49,6.49,0,0,0,.24,1.37l.44-1.09a.57.57,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26.43.43,0,0,1,0,.37L7.82,15l0,.09-.09.09-.1.07-.06,0H7.28l-.13,0-1.09-.63c-.65-.36-1-.57-1.1-.63Z" transform="translate(-4.49 -4.53)"/></g></svg>', bold: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.76 15.75"><g><path d="M6.4,3.76V19.5h6.76a5.55,5.55,0,0,0,2-.32,4.93,4.93,0,0,0,1.52-1,4.27,4.27,0,0,0,1.48-3.34,3.87,3.87,0,0,0-.69-2.37,5.74,5.74,0,0,0-.71-.83,3.44,3.44,0,0,0-1.1-.65,3.6,3.6,0,0,0,1.58-1.36,3.66,3.66,0,0,0,.53-1.93,3.7,3.7,0,0,0-1.21-2.87,4.65,4.65,0,0,0-3.25-1.1H6.4Zm2.46,6.65V5.57h3.52a4.91,4.91,0,0,1,1.36.15,2.3,2.3,0,0,1,.85.45,2.06,2.06,0,0,1,.74,1.71,2.3,2.3,0,0,1-.78,1.92,2.54,2.54,0,0,1-.86.46,4.7,4.7,0,0,1-1.32.15H8.86Zm0,7.27V12.15H12.7a4.56,4.56,0,0,1,1.38.17,3.43,3.43,0,0,1,.95.49,2.29,2.29,0,0,1,.92,2,2.73,2.73,0,0,1-.83,2.1,2.66,2.66,0,0,1-.83.58,3.25,3.25,0,0,1-1.26.2H8.86Z" transform="translate(-6.4 -3.75)"/></g></svg>', underline: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 9.78 15.74"><g><path d="M14.64,3.76h2.52v7.72a4.51,4.51,0,0,1-.59,2.31,3.76,3.76,0,0,1-1.71,1.53,6.12,6.12,0,0,1-2.64.53,5,5,0,0,1-3.57-1.18,4.17,4.17,0,0,1-1.27-3.24V3.76H9.9v7.3a3,3,0,0,0,.55,2,2.3,2.3,0,0,0,1.83.65,2.26,2.26,0,0,0,1.8-.65,3.09,3.09,0,0,0,.55-2V3.76Zm2.52,13.31V19.5H7.39V17.08h9.77Z" transform="translate(-7.38 -3.76)"/></g></svg>', italic: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.49 15.76"><g><path d="M17.16,3.79l.37,0-.06.38-.14.52A10,10,0,0,1,16.21,5a9.37,9.37,0,0,0-1,.32,6.68,6.68,0,0,0-.25.89c-.06.31-.11.59-.14.85-.3,1.36-.52,2.41-.68,3.14l-.61,3.18L13.1,15l-.43,2.4-.12.46a.62.62,0,0,0,0,.28c.44.1.85.17,1.23.22l.68.11a4.51,4.51,0,0,1-.08.6l-.09.42a.92.92,0,0,0-.23,0l-.43,0a1.37,1.37,0,0,1-.29,0c-.13,0-.63-.08-1.49-.16l-2,0c-.28,0-.87,0-1.78.12L7,19.5l.17-.88.8-.2A6.61,6.61,0,0,0,9.19,18,2.62,2.62,0,0,0,9.61,17l.28-1.41.58-2.75.12-.66c.05-.3.11-.58.17-.86s.12-.51.17-.69l.12-.48.12-.43.31-1.6.15-.65.31-1.91V5.14a3.86,3.86,0,0,0-1.48-.29l-.38,0,.2-1.06,3.24.14.75,0c.45,0,1.18,0,2.18-.09.23,0,.46,0,.71,0Z" transform="translate(-7.04 -3.76)"/></g></svg>', strike: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.9"><g><path d="M12.94,13a4.27,4.27,0,0,1,1.32.58,1.46,1.46,0,0,1,.55,1.2,1.87,1.87,0,0,1-.88,1.64,4.17,4.17,0,0,1-2.35.59,4.44,4.44,0,0,1-2.74-.71,2.72,2.72,0,0,1-1-2.17H5.57a4.56,4.56,0,0,0,1.55,3.7,7,7,0,0,0,4.47,1.23,6,6,0,0,0,4.07-1.3,4.24,4.24,0,0,0,1.52-3.37,4,4,0,0,0-.26-1.4h-4ZM6.37,10.24A3.27,3.27,0,0,1,6,8.68a4,4,0,0,1,1.48-3.3,5.92,5.92,0,0,1,3.88-1.21,5.58,5.58,0,0,1,3.91,1.24,4.36,4.36,0,0,1,1.45,3.17H14.44a2.12,2.12,0,0,0-.91-1.81,4.45,4.45,0,0,0-2.44-.55,3.69,3.69,0,0,0-2,.51A1.64,1.64,0,0,0,8.3,8.22a1.3,1.3,0,0,0,.48,1.11,7,7,0,0,0,2.1.78l.28.06.28.08H6.37Zm13.09.68a.73.73,0,0,1,.49.21.66.66,0,0,1,.2.48.64.64,0,0,1-.2.48.71.71,0,0,1-.49.19H5.1a.67.67,0,0,1-.49-.19.66.66,0,0,1-.2-.48.64.64,0,0,1,.2-.48.73.73,0,0,1,.49-.21H19.46Z" transform="translate(-4.41 -4.17)"/></g></svg>', subscript: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 14.61"><g><path d="M15.38,4.33H12.74L11.19,7c-.28.46-.51.87-.69,1.21L10.07,9h0l-.44-.8c-.22-.4-.45-.81-.71-1.23L7.34,4.33H4.68L8.26,10,4.4,16.08H7.1l1.69-2.83c.38-.63.72-1.22,1-1.78l.25-.46h0l.49.92c.24.45.48.89.74,1.32L13,16.08h2.61L11.84,10l1.77-2.84,1.77-2.85Zm4.77,13.75H17v-.15c0-.4.05-.64.16-.72a4.42,4.42,0,0,1,1.16-.31,3.3,3.3,0,0,0,1.54-.56A1.84,1.84,0,0,0,20.15,15a1.78,1.78,0,0,0-.44-1.41A2.8,2.8,0,0,0,18,13.25a2.71,2.71,0,0,0-1.69.37,1.83,1.83,0,0,0-.44,1.43v.23H17v-.23q0-.63.18-.78a1.62,1.62,0,0,1,.88-.15,1.59,1.59,0,0,1,.88.15q.18.15.18.75t-.18.75a3.58,3.58,0,0,1-1.18.33,3.33,3.33,0,0,0-1.52.51,1.57,1.57,0,0,0-.32,1.18v1.15h4.27v-.86Z" transform="translate(-4.4 -4.33)"/></g></svg>', superscript: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.42"><g><path d="M12,13.14l3.61-5.81H12.94L11.33,10c-.28.46-.51.88-.69,1.25l-.45.83h0l-.45-.85c-.22-.41-.45-.82-.71-1.24L7.4,7.33H4.68l3.66,5.81L4.4,19.33H7.14l1.74-2.87q.58-1,1-1.83l.25-.48h0l.51.94.75,1.37,1.72,2.87h2.67l-1.92-3.09c-1.12-1.8-1.76-2.83-1.92-3.1Zm4.84-4.41h0l0,.15h3.27v.86H15.77V8.58a1.66,1.66,0,0,1,.33-1.22,3.51,3.51,0,0,1,1.56-.51,3.68,3.68,0,0,0,1.21-.34c.13-.1.19-.36.19-.77S19,5.07,18.87,5A1.63,1.63,0,0,0,18,4.8a1.58,1.58,0,0,0-.91.17c-.13.11-.19.38-.19.8V6H15.78V5.76a1.87,1.87,0,0,1,.45-1.47A2.84,2.84,0,0,1,18,3.91a2.8,2.8,0,0,1,1.72.38,1.84,1.84,0,0,1,.45,1.44,1.91,1.91,0,0,1-.34,1.35,3.24,3.24,0,0,1-1.58.57A3.69,3.69,0,0,0,17,8c-.12.1-.17.35-.17.76Z" transform="translate(-4.4 -3.91)"/></g></svg>', erase: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.76"><g><path d="M13.69,17.2h6.46v1.31H8.56L4.41,14.37,14,4.75l6.06,6.06L16.89,14l-3.2,3.19Zm-4.61,0h2.77L14.09,15,9.88,10.75,6.25,14.38l1.41,1.41c.84.82,1.31,1.29,1.42,1.41Z" transform="translate(-4.41 -4.75)"/></g></svg>', indent: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.36"><g><path d="M19.87,15.57a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87ZM7.5,14.45a.25.25,0,0,1-.2-.09L4.76,11.84a.29.29,0,0,1,0-.4L7.3,8.9a.29.29,0,0,1,.4,0,.31.31,0,0,1,.07.2v5.06a.32.32,0,0,1-.08.21.26.26,0,0,1-.19.08ZM19.87,8.82a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm0,3.37a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm.2-6.66a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z" transform="translate(-4.41 -5.44)"/></g></svg>', outdent: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.36"><g><path d="M4.68,14.45a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V9.1a.27.27,0,0,1,.08-.19.28.28,0,0,1,.2-.08.25.25,0,0,1,.19.07l2.54,2.54a.29.29,0,0,1,0,.4L4.88,14.36a.24.24,0,0,1-.2.09Zm15.19,1.12a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87Zm0-3.38a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm0-3.37a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm.2-3.29a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z" transform="translate(-4.41 -5.44)"/></g></svg>', expansion: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M11.8,13.06l-5.1,5.1H9.51V19.5H4.41V14.4H5.75v2.81L8.3,14.66q2.25-2.23,2.55-2.55Zm8.35-9.3v5.1H18.81V6.05l-5.1,5.1-1-1,5.1-5.1H15.05V3.76Z" transform="translate(-4.41 -3.76)"/></g></svg>', reduction: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M14.91,10h2.87v1.38H12.55V6.12h1.38V9l5.24-5.24.48.49.49.48ZM6.77,11.92H12v5.23H10.62V14.26L5.37,19.5l-1-1L9.63,13.3H6.77Z" transform="translate(-4.4 -3.76)"/></g></svg>', code_view: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 11.8"><g><path d="M8.09,7.94a.76.76,0,0,1,.53.22.72.72,0,0,1,.21.52.76.76,0,0,1-.22.54L6.18,11.63l2.43,2.44a.69.69,0,0,1,.2.51.66.66,0,0,1-.21.51.75.75,0,0,1-.51.22.63.63,0,0,1-.51-.21h0L4.63,12.15a.7.7,0,0,1-.22-.53.67.67,0,0,1,.25-.55L7.57,8.16a.82.82,0,0,1,.52-.22Zm12.05,3.69a.7.7,0,0,1-.23.52L17,15.1h0a.66.66,0,0,1-.51.21.73.73,0,0,1-.51-.22.75.75,0,0,1-.22-.51.63.63,0,0,1,.21-.51l2.43-2.44L15.92,9.22a.73.73,0,0,1-.22-.53A.74.74,0,0,1,17,8.18h0l2.91,2.91a.67.67,0,0,1,.27.54Zm-5.9-5.9a.73.73,0,0,1,.61.32.71.71,0,0,1,.07.68L11,17a1,1,0,0,1-.22.32.6.6,0,0,1-.35.16.75.75,0,0,1-.69-.26.69.69,0,0,1-.12-.72L13.56,6.23a.75.75,0,0,1,.26-.35.74.74,0,0,1,.42-.15Z" transform="translate(-4.41 -5.73)"/></g></svg>', preview: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.65 15.66"><g><path d="M16.19,14.43l2.49,2.49a.73.73,0,0,1,.21.52.67.67,0,0,1-.22.51.7.7,0,0,1-.52.22.69.69,0,0,1-.51-.21l-2.49-2.48a5.17,5.17,0,0,1-1.34.69,4.64,4.64,0,0,1-1.48.24,4.78,4.78,0,1,1,0-9.56,4.79,4.79,0,0,1,1.84.36,4.9,4.9,0,0,1,1.56,1,4.77,4.77,0,0,1,.46,6.18ZM10,14a3.3,3.3,0,0,0,2.34.93A3.37,3.37,0,0,0,14.7,14a3.3,3.3,0,0,0-1.08-5.41,3.47,3.47,0,0,0-2.56,0A3,3,0,0,0,10,9.28,3.31,3.31,0,0,0,10,14ZM16,4a3.86,3.86,0,0,1,2.77,1.14A3.9,3.9,0,0,1,20,7.85v4a.77.77,0,0,1-.22.53.7.7,0,0,1-.52.21.72.72,0,0,1-.74-.74v-4a2.46,2.46,0,0,0-.72-1.73A2.37,2.37,0,0,0,16,5.45H8.53A2.42,2.42,0,0,0,6.08,7.89v7.52a2.41,2.41,0,0,0,.71,1.73,2.46,2.46,0,0,0,1.74.72h4.08a.73.73,0,0,1,0,1.46H8.53a3.85,3.85,0,0,1-2.78-1.14A3.93,3.93,0,0,1,4.6,15.4V7.87A3.94,3.94,0,0,1,5.76,5.09,3.88,3.88,0,0,1,8.54,4H16Z" transform="translate(-4.45 -3.8)"/></g></svg>', print: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16.05 16.04"><g><path d="M19.76,15.84a1.29,1.29,0,0,0,.39-.92V8.35A2.05,2.05,0,0,0,19.57,7a1.93,1.93,0,0,0-1.38-.57H6.37a1.95,1.95,0,0,0-2,2v6.56a1.23,1.23,0,0,0,.38.92,1.35,1.35,0,0,0,.93.38h2V14.9l-2,0V8.35a.67.67,0,0,1,.18-.47.62.62,0,0,1,.48-.19H18.18a.6.6,0,0,1,.46.19.66.66,0,0,1,.18.47V14.9h-2v1.32h2A1.35,1.35,0,0,0,19.76,15.84ZM17.52,7.69V5.06a1.31,1.31,0,0,0-.38-.92,1.34,1.34,0,0,0-.94-.38H8.34A1.3,1.3,0,0,0,7,5.06V7.69H8.34V5.06h7.87V7.69h1.31ZM8.34,12.93h7.87l0,5.26H8.34V12.93Zm7.87,5.26v0Zm.65,1.31a.6.6,0,0,0,.46-.19.72.72,0,0,0,.2-.47V12.29a.74.74,0,0,0-.2-.47.6.6,0,0,0-.46-.19H7.68a.6.6,0,0,0-.46.19.72.72,0,0,0-.2.47v6.55a.74.74,0,0,0,.2.47.6.6,0,0,0,.46.19h9.18ZM16.67,9.28a.7.7,0,0,0-.94,0,.63.63,0,0,0-.18.46.67.67,0,0,0,.18.47.68.68,0,0,0,.94,0,.66.66,0,0,0,.18-.47A.58.58,0,0,0,16.67,9.28Z" transform="translate(-4.25 -3.61)"/></g></svg>', template: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.27 15.64"><g><path d="M18.18,19.16a1,1,0,0,0,1-1V5.73a1,1,0,0,0-1-1h-2v1h2V18.19H6.37V5.73h2v-1h-2A.94.94,0,0,0,5.68,5a1,1,0,0,0-.29.7V18.18a.94.94,0,0,0,.29.69,1,1,0,0,0,.69.29H18.18ZM9.82,10.31h4.92a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.49.49,0,0,0-.15-.35.47.47,0,0,0-.35-.15H9.82a.49.49,0,0,0-.35.15.47.47,0,0,0-.15.35.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15Zm5.9,4.92H8.83a.49.49,0,0,0-.35.15.47.47,0,0,0-.15.35.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15h6.89a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.51.51,0,0,0-.5-.5ZM7.36,12.77a.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15h8.85a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.49.49,0,0,0-.15-.35.47.47,0,0,0-.35-.15H7.85a.49.49,0,0,0-.35.15.52.52,0,0,0-.14.35Z" transform="translate(-5.14 -3.77)"/><path d="M14.24,6.71a1,1,0,0,0,1-1,1,1,0,0,0-1-1,1,1,0,0,0-1-1h-2a.94.94,0,0,0-.69.28,1,1,0,0,0-.29.7A.94.94,0,0,0,9.62,5a.91.91,0,0,0-.29.69,1,1,0,0,0,.29.7,1,1,0,0,0,.69.29h3.93Z" transform="translate(-5.14 -3.77)"/></g></svg>', line_height: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 13.56"><g><path d="M4.4,4.88V8.26a2,2,0,0,0,.5.39s.1,0,.18-.12a.62.62,0,0,0,.17-.28c.06-.19.13-.44.21-.74s.14-.52.19-.66a.58.58,0,0,1,.21-.3,2.41,2.41,0,0,1,.63-.21,3.83,3.83,0,0,1,.88-.12,9.15,9.15,0,0,1,1.31.06.16.16,0,0,1,.11,0,.26.26,0,0,1,.06.14,4,4,0,0,1,0,.49v2l.05,3.77c0,1.41,0,2.68-.05,3.81a1.79,1.79,0,0,1-.11.49,10.68,10.68,0,0,1-1.4.45,1.12,1.12,0,0,0-.69.43v.31l0,.22.61,0c.85-.08,1.54-.12,2.06-.12a19.76,19.76,0,0,1,2.09.08,15.08,15.08,0,0,0,1.64.08,1.4,1.4,0,0,0,.29,0,1.58,1.58,0,0,0,0-.26l-.05-.43a2.26,2.26,0,0,0-.43-.17l-.77-.22-.15,0a2.55,2.55,0,0,1-.78-.28,2.56,2.56,0,0,1-.11-.75l0-1.29,0-3.15V7.53a10.51,10.51,0,0,1,.06-1.2,3.83,3.83,0,0,1,.6,0l1.88,0a2.18,2.18,0,0,1,.38,0,.45.45,0,0,1,.23.17.9.9,0,0,1,.05.25c0,.16.06.35.1.58a3.33,3.33,0,0,0,.14.55A6.39,6.39,0,0,0,15,9a2.91,2.91,0,0,0,.6-.15,2.77,2.77,0,0,0,0-.46l0-.51,0-2.95-.25,0-.38,0L15,4.94a.71.71,0,0,1-.18.15.45.45,0,0,1-.25.07l-.29,0H8.75l-.15,0H7.45a17,17,0,0,1-1.86,0L5.36,5l-.25-.13ZM19.75,16.14h-.69v-9h.69A.4.4,0,0,0,20.13,7c.06-.11,0-.24-.1-.39L18.92,5.15a.52.52,0,0,0-.86,0L17,6.58c-.12.15-.16.28-.1.39s.18.16.38.16h.69v9h-.69a.4.4,0,0,0-.38.16c-.06.11,0,.24.1.39l1.11,1.43a.52.52,0,0,0,.86,0L20,16.69c.12-.15.16-.28.1-.39a.4.4,0,0,0-.38-.16Z" transform="translate(-4.4 -4.86)"/></g></svg>', paragraph_style: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.81 15.74"><g><path d="M18.18,3.76v2h-2V19.5h-2V5.73h-2V19.5h-2V11.63a3.94,3.94,0,0,1,0-7.87h7.87Z" transform="translate(-6.37 -3.76)"/></g></svg>', text_style: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.76 15.74"><g><path d="M17.68,6.71a2.22,2.22,0,0,0,1.06-.22.74.74,0,0,0,.42-.7.73.73,0,0,0-.08-.33.67.67,0,0,0-.17-.22,1,1,0,0,0-.31-.15L18.26,5l-.45-.09A15.27,15.27,0,0,0,13.26,5V4.74c0-.66-.63-1-1.92-1-.24,0-.43.15-.59.46a4,4,0,0,0-.36,1.14h0v0a26.45,26.45,0,0,1-3.5.35A2,2,0,0,0,5.77,6a.84.84,0,0,0-.37.79,2.14,2.14,0,0,0,.41,1.29,1.23,1.23,0,0,0,1.05.63,16.62,16.62,0,0,0,3.29-.45l-.34,3.35c-.16,1.61-.29,2.9-.37,3.86s-.12,1.66-.12,2.09l0,.65a5.15,5.15,0,0,0,.05.6,1.28,1.28,0,0,0,.16.54.34.34,0,0,0,.28.18,1.16,1.16,0,0,0,.79-.46,3.66,3.66,0,0,0,.68-1,22.08,22.08,0,0,0,1-4.33q.49-3.1.78-6.15a24.69,24.69,0,0,1,4.62-.84Z" transform="translate(-5.4 -3.76)"/></g></svg>', save: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M18.53,19.5l.2-.05A1.78,1.78,0,0,0,20.13,18l0-.09V7.14a2,2,0,0,0-.28-.64A3.18,3.18,0,0,0,19.43,6c-.5-.52-1-1-1.55-1.54A2.59,2.59,0,0,0,17.37,4a1.83,1.83,0,0,0-.61-.25H6l-.21,0a1.78,1.78,0,0,0-1.4,1.49l0,.1V17.87a2.49,2.49,0,0,0,.09.37,1.79,1.79,0,0,0,1.44,1.23l.09,0Zm-6.25-.6H6.92a.61.61,0,0,1-.68-.48.78.78,0,0,1,0-.22V12.3a.62.62,0,0,1,.69-.68H17.64a.62.62,0,0,1,.69.69V18.2a.64.64,0,0,1-.71.69H12.28ZM12,9.81H8.15a.63.63,0,0,1-.72-.71v-4a.64.64,0,0,1,.72-.72h7.66a.64.64,0,0,1,.72.72v4a.65.65,0,0,1-.74.72ZM13.5,5V9.18h1.78V5Z" transform="translate(-4.41 -3.76)"/></g></svg>', blockquote: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 475.082 475.081"><g><path d="M164.45,219.27h-63.954c-7.614,0-14.087-2.664-19.417-7.994c-5.327-5.33-7.994-11.801-7.994-19.417v-9.132c0-20.177,7.139-37.401,21.416-51.678c14.276-14.272,31.503-21.411,51.678-21.411h18.271c4.948,0,9.229-1.809,12.847-5.424c3.616-3.617,5.424-7.898,5.424-12.847V54.819c0-4.948-1.809-9.233-5.424-12.85c-3.617-3.612-7.898-5.424-12.847-5.424h-18.271c-19.797,0-38.684,3.858-56.673,11.563c-17.987,7.71-33.545,18.132-46.68,31.267c-13.134,13.129-23.553,28.688-31.262,46.677C3.855,144.039,0,162.931,0,182.726v200.991c0,15.235,5.327,28.171,15.986,38.834c10.66,10.657,23.606,15.985,38.832,15.985h109.639c15.225,0,28.167-5.328,38.828-15.985c10.657-10.663,15.987-23.599,15.987-38.834V274.088c0-15.232-5.33-28.168-15.994-38.832C192.622,224.6,179.675,219.27,164.45,219.27z"/><path d="M459.103,235.256c-10.656-10.656-23.599-15.986-38.828-15.986h-63.953c-7.61,0-14.089-2.664-19.41-7.994c-5.332-5.33-7.994-11.801-7.994-19.417v-9.132c0-20.177,7.139-37.401,21.409-51.678c14.271-14.272,31.497-21.411,51.682-21.411h18.267c4.949,0,9.233-1.809,12.848-5.424c3.613-3.617,5.428-7.898,5.428-12.847V54.819c0-4.948-1.814-9.233-5.428-12.85c-3.614-3.612-7.898-5.424-12.848-5.424h-18.267c-19.808,0-38.691,3.858-56.685,11.563c-17.984,7.71-33.537,18.132-46.672,31.267c-13.135,13.129-23.559,28.688-31.265,46.677c-7.707,17.987-11.567,36.879-11.567,56.674v200.991c0,15.235,5.332,28.171,15.988,38.834c10.657,10.657,23.6,15.985,38.828,15.985h109.633c15.229,0,28.171-5.328,38.827-15.985c10.664-10.663,15.985-23.599,15.985-38.834V274.088C475.082,258.855,469.76,245.92,459.103,235.256z"/></g></svg>', arrow_down: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 8.67"><g><path d="M18.79,7.52a.8.8,0,0,1,.56-.23.82.82,0,0,1,.79.79.8.8,0,0,1-.23.56l-7.07,7.07a.79.79,0,0,1-.57.25.77.77,0,0,1-.57-.25h0L4.64,8.65a.8.8,0,0,1-.23-.57.82.82,0,0,1,.79-.79.8.8,0,0,1,.56.23L12.28,14l3.26-3.26,3.25-3.26Z" transform="translate(-4.41 -7.29)"/></g></svg>', align_justify: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm0,5.9H20.15v-2H4.41v2Zm0,3.94H20.15v-2H4.41v2Zm0,3.93h7.87v-2H4.41v2Z" transform="translate(-4.41 -4.74)"/></g></svg>', align_left: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm11.8,3.94H4.41v2H16.22v-2Zm-11.8,5.9H18.18v-2H4.41v2Zm0,3.93h9.84v-2H4.41v2Z" transform="translate(-4.41 -4.74)"/></g></svg>', align_right: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm3.93,5.9H20.15v-2H8.34v2Zm-2,3.94H20.14v-2H6.37v2Zm3.94,3.93h9.84v-2H10.31v2Z" transform="translate(-4.41 -4.74)"/></g></svg>', align_center: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm2,3.94v2H18.18v-2H6.37Zm-1,5.9H19.16v-2H5.39v2Zm2,3.93H17.2v-2H7.36v2Z" transform="translate(-4.41 -4.74)"/></g></svg>', font_color: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.61"><g><path d="M18.5,15.57,14.28,4.32h-3.4L6.65,15.57h3l.8-2.26h4.23l.8,2.26h3ZM14,11.07H11.14L12.54,7,13.25,9c.41,1.18.64,1.86.7,2ZM4.41,16.69v2.24H20.15V16.69H4.41Z" transform="translate(-4.41 -4.32)"/></g></svg>', highlight_color: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.66 15.74"><g><path d="M12.32,9.31,13.38,13H11.21l.52-1.83q.46-1.61.54-1.83ZM4.44,3.76H20.1V19.5H4.44V3.76ZM14.71,17.32h2.63L13.7,6H10.89L7.26,17.32H9.89l.63-2.24h3.55l.32,1.12c.18.65.29,1,.32,1.12Z" transform="translate(-4.44 -3.76)"/></g></svg>', list_bullets: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.37"><g><path d="M7.77,16.12a1.59,1.59,0,0,0-.49-1.18,1.62,1.62,0,0,0-1.19-.49,1.68,1.68,0,1,0,0,3.36,1.67,1.67,0,0,0,1.68-1.69Zm0-4.48A1.67,1.67,0,0,0,6.09,10,1.68,1.68,0,0,0,4.9,12.82a1.62,1.62,0,0,0,1.19.49,1.67,1.67,0,0,0,1.68-1.67Zm12.38,3.64a.27.27,0,0,0-.08-.19.28.28,0,0,0-.2-.09H9.19a.28.28,0,0,0-.2.08.29.29,0,0,0-.08.19V17a.27.27,0,0,0,.28.28H19.87a.27.27,0,0,0,.19-.08.24.24,0,0,0,.08-.2V15.28ZM7.77,7.13a1.63,1.63,0,0,0-.49-1.2,1.61,1.61,0,0,0-1.19-.49,1.61,1.61,0,0,0-1.19.49,1.71,1.71,0,0,0,0,2.4,1.62,1.62,0,0,0,1.19.49,1.61,1.61,0,0,0,1.19-.49,1.63,1.63,0,0,0,.49-1.2Zm12.38,3.66a.28.28,0,0,0-.08-.2.29.29,0,0,0-.19-.08H9.19a.27.27,0,0,0-.28.28v1.69a.27.27,0,0,0,.08.19.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08.25.25,0,0,0,.08-.19V10.79Zm0-4.5a.27.27,0,0,0-.08-.19A.25.25,0,0,0,19.88,6H9.19A.28.28,0,0,0,9,6.1a.26.26,0,0,0-.08.19V8A.27.27,0,0,0,9,8.17a.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08A.25.25,0,0,0,20.14,8V6.29Z" transform="translate(-4.41 -5.44)"/></g></svg>', list_number: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.69 15.74"><g><path d="M7.66,18a1.24,1.24,0,0,0-.26-.78,1.17,1.17,0,0,0-.72-.42l.85-1V15H4.58v1.34h.94v-.46l.85,0h0c-.11.11-.22.23-.32.35s-.23.27-.37.47L5.39,17l.23.51c.61-.05.92.11.92.49a.42.42,0,0,1-.18.37.79.79,0,0,1-.45.12A1.41,1.41,0,0,1,5,18.15l-.51.77A2.06,2.06,0,0,0,6,19.5a1.8,1.8,0,0,0,1.2-.41A1.38,1.38,0,0,0,7.66,18Zm0-5.54H6.75V13H5.63A.72.72,0,0,1,6,12.51a5.45,5.45,0,0,1,.66-.45,2.71,2.71,0,0,0,.67-.57,1.19,1.19,0,0,0,.31-.81,1.29,1.29,0,0,0-.45-1,1.86,1.86,0,0,0-2-.11,1.51,1.51,0,0,0-.62.7l.74.52A.87.87,0,0,1,6,10.28a.51.51,0,0,1,.35.12.42.42,0,0,1,.13.33.55.55,0,0,1-.21.4,3,3,0,0,1-.5.38c-.19.13-.39.27-.58.42a2,2,0,0,0-.5.6,1.63,1.63,0,0,0-.21.81,3.89,3.89,0,0,0,.05.48h3.2V12.44Zm12.45,2.82a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2V17a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V15.26ZM7.69,7.32h-1V3.76H5.8L4.6,4.88l.63.68a1.85,1.85,0,0,0,.43-.48h0l0,2.24H4.74V8.2h3V7.32Zm12.43,3.42a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2v1.71a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V10.74Zm0-4.52A.27.27,0,0,0,20,6,.28.28,0,0,0,19.83,6H9.1A.32.32,0,0,0,8.89,6a.24.24,0,0,0-.08.19V7.93a.27.27,0,0,0,.08.19.32.32,0,0,0,.21.08H19.83A.32.32,0,0,0,20,8.12a.26.26,0,0,0,.08-.2V6.22Z" transform="translate(-4.43 -3.76)"/></g></svg>', table: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M4.41,8.05V3.76H8.7V8.05H4.41Zm5.71,0V3.76h4.3V8.05h-4.3Zm5.74-4.29h4.29V8.05H15.86V3.76Zm-11.45,10V9.48H8.7v4.3H4.41Zm5.71,0V9.48h4.3v4.3h-4.3Zm5.74,0V9.48h4.29v4.3H15.86ZM4.41,19.5V15.21H8.7V19.5H4.41Zm5.71,0V15.21h4.3V19.5h-4.3Zm5.74,0V15.21h4.29V19.5H15.86Z" transform="translate(-4.41 -3.76)"/></g></svg>', horizontal_rule: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 2.24"><g><path d="M20.15,12.75V10.51H4.41v2.24H20.15Z" transform="translate(-4.41 -10.51)"/></g></svg>', show_blocks: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.66 15.67"><g><path d="M19.72,5.58a1.64,1.64,0,0,0-1.64-1.64H6.23a1.62,1.62,0,0,0-1.16.48,1.63,1.63,0,0,0-.48,1.16V9.63a1.6,1.6,0,0,0,.48,1.16,1.62,1.62,0,0,0,1.16.47H18.09a1.67,1.67,0,0,0,1.16-.47,1.62,1.62,0,0,0,.48-1.16V5.58Zm-.94,4.05a.68.68,0,0,1-.7.7H6.23a.66.66,0,0,1-.48-.2.74.74,0,0,1-.21-.5V5.58a.66.66,0,0,1,.2-.48.71.71,0,0,1,.48-.21H18.08a.74.74,0,0,1,.5.21.66.66,0,0,1,.2.48ZM6.48,7.72a.21.21,0,0,0,.17-.07.22.22,0,0,0,.07-.17V7.06a1.27,1.27,0,0,1,.11-.52.37.37,0,0,1,.36-.23H8.77A.25.25,0,0,0,9,6.17a.19.19,0,0,0,0-.23.27.27,0,0,0-.2-.12H7.19a.88.88,0,0,0-.72.39,1.51,1.51,0,0,0-.23.85v.42a.24.24,0,0,0,.24.24Zm-.19.81a.21.21,0,0,0,.17-.07.26.26,0,0,0,.07-.17.24.24,0,0,0-.24-.24.2.2,0,0,0-.16.09.2.2,0,0,0-.07.16.22.22,0,0,0,.07.17.23.23,0,0,0,.16.06Zm8.46,5.1a1.63,1.63,0,0,0-.47-1.16A1.61,1.61,0,0,0,13.12,12H6.23a1.6,1.6,0,0,0-1.16.46,1.62,1.62,0,0,0-.48,1.16v4.05a1.64,1.64,0,0,0,1.64,1.64h6.89a1.6,1.6,0,0,0,1.16-.48,1.62,1.62,0,0,0,.47-1.16Zm-.94,4a.7.7,0,0,1-.2.49.65.65,0,0,1-.5.2H6.23a.66.66,0,0,1-.48-.2.75.75,0,0,1-.21-.49v-4a.74.74,0,0,1,.21-.5.66.66,0,0,1,.48-.2h6.89a.68.68,0,0,1,.7.7v4Zm6.15,0v-4a1.6,1.6,0,0,0-.48-1.16A1.67,1.67,0,0,0,18.32,12H17.1a1.63,1.63,0,0,0-1.16.47,1.61,1.61,0,0,0-.47,1.16v4a1.67,1.67,0,0,0,.47,1.16,1.62,1.62,0,0,0,1.16.48h1.22A1.64,1.64,0,0,0,20,17.68Zm-.94-4v4a.75.75,0,0,1-.21.49.62.62,0,0,1-.48.2H17.11a.69.69,0,0,1-.5-.2.7.7,0,0,1-.2-.49v-4a.68.68,0,0,1,.7-.7h1.22a.66.66,0,0,1,.48.2.72.72,0,0,1,.21.5Z" transform="translate(-4.44 -3.79)"/></g></svg>', cancel: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M14.15,11.63l5.61,5.61a1.29,1.29,0,0,1,.38.93,1.27,1.27,0,0,1-.4.93,1.25,1.25,0,0,1-.92.4,1.31,1.31,0,0,1-.94-.4l-5.61-5.61L6.67,19.1a1.31,1.31,0,0,1-.94.4,1.24,1.24,0,0,1-.92-.4,1.27,1.27,0,0,1-.4-.93,1.33,1.33,0,0,1,.38-.93l5.61-5.63L4.79,6a1.26,1.26,0,0,1-.38-.93,1.22,1.22,0,0,1,.4-.92,1.28,1.28,0,0,1,.92-.39,1.38,1.38,0,0,1,.94.38l5.61,5.61,5.61-5.61a1.33,1.33,0,0,1,.94-.38,1.26,1.26,0,0,1,.92.39,1.24,1.24,0,0,1,.4.92,1.29,1.29,0,0,1-.39.93L17,8.81l-2.8,2.82Z" transform="translate(-4.41 -3.76)"/></g></svg>', image: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.77"><g><path d="M8.77,8.72a.88.88,0,0,1-.61-.27.82.82,0,0,1-.25-.61.89.89,0,0,1,.25-.62A.82.82,0,0,1,8.77,7a.81.81,0,0,1,.61.25.83.83,0,0,1,.27.62.81.81,0,0,1-.25.61.91.91,0,0,1-.63.27Zm9.62-5a1.74,1.74,0,0,1,1.76,1.76V17.76a1.74,1.74,0,0,1-1.76,1.76H6.16A1.74,1.74,0,0,1,4.4,17.76V5.51A1.74,1.74,0,0,1,6.16,3.75H18.39Zm0,1.75H6.16v8L8.53,11.8a.94.94,0,0,1,.54-.17.86.86,0,0,1,.54.2L11.09,13l3.64-4.55a.78.78,0,0,1,.34-.25.85.85,0,0,1,.42-.07.89.89,0,0,1,.39.12.78.78,0,0,1,.28.29l2.24,3.67V5.51Zm0,12.24V15.6L15.3,10.53,11.89,14.8a.89.89,0,0,1-.59.32.82.82,0,0,1-.64-.18L9,13.62,6.16,15.74v2Z" transform="translate(-4.4 -3.75)"/></g></svg>', video: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.55"><g><path d="M20.15,10.26V18.9l-3.94-1.57v1.2H4.41V10.66H16.22v1.23l2-.81,2-.82ZM14.64,17h0V12.54h0v-.31H6V17h8.67Zm3.94-.37v-4l-2.37,1v2l1.18.48,1.19.48ZM7.94,9.86A2.77,2.77,0,0,1,5.19,7.11a2.76,2.76,0,0,1,5.51,0A2.78,2.78,0,0,1,7.94,9.86Zm0-3.93a1.21,1.21,0,0,0-.83.35,1.15,1.15,0,0,0-.34.84A1.09,1.09,0,0,0,7.11,8,1.15,1.15,0,0,0,8,8.28,1.13,1.13,0,0,0,9.11,7.12,1.16,1.16,0,0,0,7.94,5.93Zm5.9,3.93a2.34,2.34,0,0,1-1.67-.68,2.3,2.3,0,0,1-.68-1.67,2.35,2.35,0,0,1,4-1.67,2.37,2.37,0,0,1,0,3.34,2.33,2.33,0,0,1-1.68.68Zm0-3.14a.75.75,0,1,0,.55.22.73.73,0,0,0-.55-.22Z" transform="translate(-4.41 -4.35)"/></g></svg>', link: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.72"><g><path d="M13.05,13.63a.24.24,0,0,1,.15.22L13.42,16a.19.19,0,0,1-.08.18l-2.12,2.14a4.08,4.08,0,0,1-1.29.85A4,4,0,0,1,4.71,17a3.92,3.92,0,0,1-.3-1.52A4,4,0,0,1,4.71,14a3.91,3.91,0,0,1,.87-1.3L7.7,10.56a.25.25,0,0,1,.2-.06l2.17.22a.21.21,0,0,1,.19.15.24.24,0,0,1,0,.25L7.12,14.23a1.81,1.81,0,0,0,0,2.58,1.78,1.78,0,0,0,1.29.52,1.74,1.74,0,0,0,1.28-.52L12.8,13.7a.24.24,0,0,1,.25-.07ZM19,4.92a4,4,0,0,1,0,5.66L16.86,12.7a.25.25,0,0,1-.17.08l-2.2-.23a.21.21,0,0,1-.19-.15.22.22,0,0,1,0-.25L17.44,9a1.81,1.81,0,0,0,0-2.58,1.78,1.78,0,0,0-1.29-.52,1.74,1.74,0,0,0-1.28.52L11.76,9.57a.21.21,0,0,1-.25,0,.24.24,0,0,1-.16-.21l-.22-2.17a.19.19,0,0,1,.08-.18l2.12-2.14a4.08,4.08,0,0,1,1.29-.85,4.05,4.05,0,0,1,3.06,0,3.85,3.85,0,0,1,1.3.85ZM5.84,9.82a.25.25,0,0,1-.18-.08.19.19,0,0,1-.07-.19l.11-.77a.2.2,0,0,1,.11-.17.24.24,0,0,1,.2,0l2.5.72a.25.25,0,0,1,.15.27.22.22,0,0,1-.23.21l-2.59,0Zm4.12-2-.73-2.5a.27.27,0,0,1,0-.2A.21.21,0,0,1,9.41,5L10.19,5a.25.25,0,0,1,.19,0,.23.23,0,0,1,.08.18l-.05,2.61a.2.2,0,0,1-.19.23h0A.22.22,0,0,1,10,7.85Zm8.76,5.58a.25.25,0,0,1,.18.08.23.23,0,0,1,.06.2l-.11.77a.25.25,0,0,1-.11.17.21.21,0,0,1-.12,0l-.08,0L16,14a.25.25,0,0,1-.15-.27.22.22,0,0,1,.22-.21l1.29,0,1.33,0Zm-4.12,2,.74,2.51a.28.28,0,0,1,0,.2.23.23,0,0,1-.18.11l-.8.11a.23.23,0,0,1-.17-.07.25.25,0,0,1-.08-.18l0-2.61a.22.22,0,0,1,.22-.22.21.21,0,0,1,.26.15Z" transform="translate(-4.41 -3.77)"/></g></svg>', math: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.81 15.73"><g><path d="M17.19,5.73a1,1,0,0,0,.71-.29,1,1,0,0,0,.28-.7,1,1,0,0,0-1-1H7.35a1,1,0,0,0-1,1,.77.77,0,0,0,.13.47h0l4.58,6.43L6.68,17.81a1.25,1.25,0,0,0-.29.71.94.94,0,0,0,.28.7.92.92,0,0,0,.69.28H17.2a1,1,0,0,0,.71-.28,1,1,0,0,0,0-1.39.92.92,0,0,0-.71-.29H9.26l3.87-5.43a.86.86,0,0,0,0-.95L9.26,5.73h7.93Z" transform="translate(-6.38 -3.77)"/></g></svg>', unlink: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.72"><g><path d="M19,18.32a4,4,0,0,0,0-5.68L15.85,9.5l-1.17,1.55L17.57,14a2,2,0,0,1,.61,1.47,2.08,2.08,0,0,1-2.09,2.09,2,2,0,0,1-1.47-.61l-.38-.37-1.74,1,.8.78a4,4,0,0,0,5.68,0ZM8,9.77a2,2,0,0,1-1.27-1,1.89,1.89,0,0,1-.21-1.57A2.1,2.1,0,0,1,7.45,6,2,2,0,0,1,9,5.76L12.27,7.2l.49-2L9.48,3.9a4,4,0,0,0-3.06.41A3.82,3.82,0,0,0,4.56,6.73a3.8,3.8,0,0,0,.4,3A3.78,3.78,0,0,0,7.39,11.6l5.38,2,.49-2-2.64-.94L8,9.77Z" transform="translate(-4.41 -3.76)"/></g></svg>', table_header: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.74"><g><path d="M17,19.5v-.78H15.5v.78H17Zm-3,0v-.78H12.5v.78H14Zm-3,0v-.78H9.53v.78H11Zm-3,0v-.78H6.53v.78H8Zm10.55,0a1.73,1.73,0,0,0,.85-.35,1.67,1.67,0,0,0,.56-.76l-.71-.31a1.21,1.21,0,0,1-.35.4,1.34,1.34,0,0,1-.53.23l.08.38c.06.24.09.38.1.41Zm-13.7-.63.55-.55A.77.77,0,0,1,5.25,18a1.31,1.31,0,0,1-.06-.38v-.38H4.41v.38a2,2,0,0,0,.12.68,1.6,1.6,0,0,0,.35.57Zm15.27-2.12V15.26h-.78v1.49h.78Zm-15-1V14.23H4.41v1.49h.78Zm15-2V12.26h-.78v1.49h.78Zm-15-1V11.22H4.41v1.51h.78Zm15-2V9.26h-.78v1.51h.78Zm-15-1V8.17H4.41V9.74h.78Zm15-2V6.28h-.78V7.77h.78Zm-15-1.11V5.33L4.48,5.1a.77.77,0,0,0-.07.27,2.72,2.72,0,0,0,0,.28v1h.79ZM19.21,5l.63-.4A1.62,1.62,0,0,0,19.16,4a1.94,1.94,0,0,0-.91-.22v.78a1.31,1.31,0,0,1,.56.12.88.88,0,0,1,.4.36ZM6,4.54H7.78V3.76H6a.82.82,0,0,0-.28.06l.12.35c.07.21.1.33.11.36Zm10.8,0V3.76H15.28v.78h1.49Zm-3,0V3.76H12.28v.78h1.49Zm-3,0V3.76H9.28v.78h1.51ZM6,10.84h12.6V6.91H6Z" transform="translate(-4.4 -3.76)"/></g></svg>', merge_cell: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 15.74"><g><path d="M18.92,13.5h1.23v4.15A1.84,1.84,0,0,1,18.3,19.5H14V18.27H18.3a.6.6,0,0,0,.44-.18.59.59,0,0,0,.18-.44V13.5ZM18.3,3.76a1.84,1.84,0,0,1,1.85,1.85V9.82H18.92V5.6a.6.6,0,0,0-.18-.44A.59.59,0,0,0,18.3,5H14V3.76H18.3Zm1.85,8.51H15.6L17.26,14l-.86.86-3.14-3.17L16.4,8.51l.86.86L15.62,11h4.54v1.24Zm-13.9,6h4.27V19.5H6.25A1.84,1.84,0,0,1,4.4,17.65V13.5H5.63v4.15a.61.61,0,0,0,.62.62Zm0-14.51h4.27V5H6.25a.6.6,0,0,0-.44.18.57.57,0,0,0-.17.43V9.81H4.41V5.6A1.83,1.83,0,0,1,6.25,3.76Zm5,7.9L8.15,14.83,7.3,14,9,12.27H4.41V11H8.94L7.3,9.38,7.73,9l.43-.43Z" transform="translate(-4.4 -3.76)"/></g></svg>', split_cell: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.74"><g><path d="M10.37,12.25H6.74L8.4,13.94l-.87.86L4.41,11.63,7.53,8.5l.87.86L6.74,11h3.62v1.23Zm9.78-.61L17,14.81,16.13,14l1.66-1.69H14.16V11h3.63L16.13,9.37l.43-.43A5.24,5.24,0,0,1,17,8.51ZM18.9,8.22V5.61a.57.57,0,0,0-.18-.43A.65.65,0,0,0,18.29,5H12.88V18.28h5.41a.7.7,0,0,0,.44-.18.57.57,0,0,0,.18-.43V15h1.23v2.64a1.84,1.84,0,0,1-1.85,1.83h-12A1.84,1.84,0,0,1,4.94,19a1.81,1.81,0,0,1-.54-1.29V15H5.63v2.64a.57.57,0,0,0,.18.43.67.67,0,0,0,.44.18h5.41V5H6.25a.7.7,0,0,0-.44.18.56.56,0,0,0-.17.43V8.22H4.41V5.61A1.8,1.8,0,0,1,5,4.31a1.91,1.91,0,0,1,1.31-.55h12a1.89,1.89,0,0,1,1.31.55,1.8,1.8,0,0,1,.54,1.3V8.23H18.9Z" transform="translate(-4.4 -3.76)"/></g></svg>', caption: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.79"><g><path d="M4.41,18.52H20.15v-2H4.41ZM20,4.73H18.07V6h.65v.65H20V4.73ZM17,6V4.73H14.55V6H17ZM13.49,6V4.73H11V6h2.47ZM10,6V4.73H7.5V6H10ZM5.79,6h.65V4.73H4.5V6.67H5.8V6ZM4.5,11.34H5.79V8.48H4.5ZM6.44,13.8H5.79v-.65H4.5v1.94H6.44ZM17,15.09V13.8H14.55v1.29H17Zm-3.52,0V13.8H11v1.29h2.47Zm-3.53,0V13.8H7.5v1.29H10ZM20,13.16H18.72v.65h-.65V15.1H20Zm-1.29-1.82H20V8.48h-1.3v2.86Z" transform="translate(-4.41 -4.73)"/></g></svg>', edit: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.73"><g><path d="M7.51,5.68h6l1.52-1.57H6.94a2.4,2.4,0,0,0-1.79.82A2.8,2.8,0,0,0,4.41,6.8V17a2.55,2.55,0,0,0,.75,1.8A2.48,2.48,0,0,0,7,19.5H17.22a2.57,2.57,0,0,0,1.83-.74,2.52,2.52,0,0,0,.77-1.8V8.83l-1.58,1.54v6a1.54,1.54,0,0,1-1.53,1.53H7.51A1.54,1.54,0,0,1,6,16.41V7.21A1.52,1.52,0,0,1,7.51,5.68Zm5.63,7.47h0L10.7,10.74l-1,3.38,1.71-.48,1.7-.49Zm.34-.34h0l5.36-5.32L16.4,5.08,11,10.4l1.23,1.21,1.21,1.2ZM19.93,6.4a.82.82,0,0,0,.22-.48A.54.54,0,0,0,20,5.47L18.45,4A.67.67,0,0,0,18,3.77a.7.7,0,0,0-.48.21l-.74.72,2.44,2.43.37-.37.35-.36Z" transform="translate(-4.41 -3.77)"/></g></svg>', delete: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 15.74"><g><path d="M19.16,6.71a.94.94,0,0,0,.69-.28.91.91,0,0,0,.29-.68A1,1,0,0,0,19.85,5a.93.93,0,0,0-.69-.3H14.24A.94.94,0,0,0,14,4.06a.92.92,0,0,0-.7-.3h-2a1,1,0,0,0-.7.3.93.93,0,0,0-.28.68H5.39A.92.92,0,0,0,4.7,5a1,1,0,0,0-.29.71.91.91,0,0,0,.29.68,1,1,0,0,0,.69.28H19.16Zm-12.79,1a1,1,0,0,0-.7.3.94.94,0,0,0-.28.69v8.85A1.88,1.88,0,0,0,6,18.93a1.9,1.9,0,0,0,1.39.57H17.2a1.87,1.87,0,0,0,1.39-.58,1.91,1.91,0,0,0,.58-1.39V8.68A1,1,0,0,0,18.88,8a.89.89,0,0,0-.7-.29,1,1,0,0,0-.69.29.92.92,0,0,0-.29.68v7.87a1,1,0,0,1-1,1H8.34a.94.94,0,0,1-.69-.28,1,1,0,0,1-.29-.71V8.68a1,1,0,0,0-1-1Z" transform="translate(-4.41 -3.76)"/></g></svg>', modify: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.74"><g><path d="M19.79,15.23a.66.66,0,0,1,.3.38.59.59,0,0,1-.07.48l-.8,1.38a.66.66,0,0,1-.38.3.59.59,0,0,1-.48-.07l-.68-.38a4.55,4.55,0,0,1-1.34.77v.78a.64.64,0,0,1-.18.45.61.61,0,0,1-.45.18h-1.6a.6.6,0,0,1-.44-.18.66.66,0,0,1-.19-.45v-.78a4.36,4.36,0,0,1-1.32-.77l-.69.38a.58.58,0,0,1-.48.07.66.66,0,0,1-.38-.3l-.38-.66h.83a1.77,1.77,0,0,0,1.23-.52,1.72,1.72,0,0,0,.51-1.23v-.18a3,3,0,0,0,.49-.28l.15.09a1.83,1.83,0,0,0,.88.23A1.75,1.75,0,0,0,15.84,14l.88-1.52a1.7,1.7,0,0,0,.17-1.32,1.66,1.66,0,0,0-.3-.61,1.84,1.84,0,0,0-.51-.45l-.15-.09,0-.29,0-.28.15-.09a1,1,0,0,0,.26-.18l0,.06v.78a4.34,4.34,0,0,1,1.34.77l.68-.38a.68.68,0,0,1,.48-.06.64.64,0,0,1,.38.29l.8,1.38a.58.58,0,0,1,.07.48.63.63,0,0,1-.3.38l-.68.4a3.84,3.84,0,0,1,.08.76,4.13,4.13,0,0,1-.08.78l.34.18.32.2ZM10.17,7.86a1.9,1.9,0,0,1,1.35,3.23,1.85,1.85,0,0,1-1.35.55A1.9,1.9,0,0,1,8.83,8.41a1.92,1.92,0,0,1,1.34-.55Zm1.58,7.2a.73.73,0,0,1-.21.49.66.66,0,0,1-.48.2H9.29a.68.68,0,0,1-.69-.69V14.2a4.75,4.75,0,0,1-1.48-.86l-.75.45a.73.73,0,0,1-.7,0,.63.63,0,0,1-.25-.26L4.54,12a.67.67,0,0,1-.08-.53.71.71,0,0,1,.32-.42l.75-.43a4.8,4.8,0,0,1-.08-.85,4.71,4.71,0,0,1,.08-.85l-.74-.44a.71.71,0,0,1-.32-.42.65.65,0,0,1,.07-.54L5.42,6a.66.66,0,0,1,.42-.32l.18,0a.73.73,0,0,1,.35.09l.75.43A4.68,4.68,0,0,1,8.6,5.33V4.45a.68.68,0,0,1,.69-.69h1.77a.64.64,0,0,1,.48.2.73.73,0,0,1,.21.49v.88a4.75,4.75,0,0,1,1.48.85L14,5.75a.67.67,0,0,1,.34-.09l.18,0a.71.71,0,0,1,.42.32l.89,1.54a.67.67,0,0,1,.06.52.73.73,0,0,1-.32.43l-.75.42a4.8,4.8,0,0,1,.08.85,4.71,4.71,0,0,1-.08.85l.75.43a.66.66,0,0,1,.32.42.73.73,0,0,1-.06.54l-.89,1.52a.69.69,0,0,1-.25.26.7.7,0,0,1-.35.09.64.64,0,0,1-.34-.09l-.75-.45a4.87,4.87,0,0,1-1.48.86v.87ZM7.23,9.75a3,3,0,0,0,.86,2.08,2.94,2.94,0,1,0,4.16-4.16,3,3,0,0,0-2.08-.85A2.94,2.94,0,0,0,7.23,9.75Z" transform="translate(-4.44 -3.76)"/></g></svg>', revert: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 14.69"><g><path d="M18.26,15V12.3l1.89-2V15a2.58,2.58,0,0,1-.24,1c-.2.58-.75.92-1.65,1H7.56v2L4.41,15.63,7.56,13v2h10.7ZM6.3,8.28V11L4.41,13V8.28a2.58,2.58,0,0,1,.24-1c.2-.58.75-.92,1.65-1H17v-2l3.15,3.34L17,10.3v-2H6.3Z" transform="translate(-4.4 -4.28)"/></g></svg>', auto_size: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M6.71,17.19,6.89,16l1.21-.15A6,6,0,0,1,6.81,13.9a5.78,5.78,0,0,1-.45-2.27A6,6,0,0,1,8.1,7.45a5.83,5.83,0,0,1,4.17-1.73l1-1-1-1A7.89,7.89,0,0,0,5,14.64a7.73,7.73,0,0,0,1.71,2.55Zm5.57,2.31h0A7.86,7.86,0,0,0,17.85,6.07L17.67,7.3l-1.21.15a5.9,5.9,0,0,1,1.29,1.92,5.81,5.81,0,0,1,.45,2.26,5.91,5.91,0,0,1-5.9,5.9l-1,1,.49.49.47.5Z" transform="translate(-4.41 -3.76)"/></g></svg>', insert_row_below: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M15.7,1.3c-0.1-0.1-0.1-0.2-0.2-0.2L15.3,1H0.4L0.3,1.1c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0.1-0.1,0.1L0,1.4v7.7l0.1,0.1c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h2.3V9.3l0.1-0.5L3,8.5l0.1-0.2c-0.1,0-0.2,0-0.3,0H1.2v-6h13.3v6h-1.6c-0.1,0-0.2,0-0.3,0l0.1,0.2l0.2,0.4C12.9,9,13,9.2,13,9.3v0.1h2.3l0.2-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1V1.4L15.7,1.3z"/><path d="M10.5,7.5C9.9,7.1,9.3,6.8,8.6,6.7c-0.2,0-0.5-0.1-0.7,0c-0.2,0-0.5,0-0.7,0C6.6,6.7,6.1,6.9,5.6,7.3C5.2,7.6,4.7,8,4.4,8.4C4.3,8.6,4.2,8.8,4.2,8.9C4.1,9.1,4,9.3,3.9,9.4C3.9,9.6,3.8,9.7,3.8,9.9c0,0.2-0.1,0.3-0.1,0.5v-0.1c-0.1,0.8,0.1,1.6,0.5,2.4c0.4,0.7,1,1.3,1.7,1.7c0.3,0.2,0.6,0.3,0.9,0.3c0.3,0.1,0.7,0.1,1,0.1c0.3,0,0.7,0,1-0.1c0.3-0.1,0.6-0.2,0.9-0.3c0.5-0.3,0.9-0.6,1.3-1c0.3-0.4,0.6-0.8,0.8-1.3c0.1-0.4,0.2-0.9,0.2-1.4c0-0.5-0.1-1-0.3-1.4C11.5,8.6,11.1,8,10.5,7.5z M10.1,11.3H8.5v1.6H8H7.9H7.3v0v-0.1v-1.4H5.7v-0.4v-0.2v-0.6h0h1.5V8.5h1.2v1.6h1.6V11.3z"/></g></svg>', insert_row_above: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M0.1,14.5c0.1,0.1,0.1,0.2,0.2,0.2l0.1,0.1h14.9l0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1l0.1-0.1V6.7l-0.1-0.1c0-0.1-0.1-0.1-0.2-0.2l-0.1-0.1h-2.3v0.1l-0.1,0.5l-0.2,0.4l-0.1,0.2c0.1,0,0.2,0,0.3,0h1.6v6H1.3v-6h1.6c0.1,0,0.2,0,0.3,0L3.1,7.3L2.9,6.9C2.8,6.8,2.8,6.6,2.7,6.5V6.3H0.4L0.3,6.4c-0.1,0-0.1,0.1-0.2,0.2L0,6.7v7.7L0.1,14.5z"/><path d="M5.3,8.3c0.6,0.5,1.2,0.8,1.9,0.9c0.2,0,0.5,0.1,0.7,0c0.2,0,0.5,0,0.7,0c0.6-0.1,1.1-0.3,1.6-0.6c0.5-0.3,0.9-0.7,1.2-1.2c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.4,0.2-0.5c0.1-0.1,0.1-0.3,0.1-0.4C12,5.8,12,5.6,12,5.4v0.1c0.1-0.8-0.1-1.6-0.5-2.4c-0.4-0.7-1-1.3-1.7-1.7C9.5,1.3,9.2,1.2,8.9,1.1C8.5,1,8.2,1,7.9,1c-0.3,0-0.7,0-1,0.1C6.6,1.2,6.3,1.3,6,1.4C5.5,1.7,5.1,2,4.7,2.4C4.4,2.8,4.1,3.3,3.9,3.8C3.8,4.2,3.7,4.7,3.7,5.2c0,0.5,0.1,1,0.3,1.4C4.3,7.2,4.7,7.8,5.3,8.3z M5.7,4.5h1.6V2.9h0.5h0.1h0.6v0v0.1v1.4H10v0.4v0.2v0.6h0H8.5v1.6H7.3V5.7H5.7V4.5z"/></g></svg>', insert_column_left: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M14.5,15.7c0.1-0.1,0.2-0.1,0.2-0.2l0.1-0.1V0.4l-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1L14.4,0H6.7L6.6,0.1c-0.1,0-0.1,0.1-0.2,0.2L6.3,0.4v2.3h0.1l0.5,0.1L7.3,3l0.2,0.1c0-0.1,0-0.2,0-0.3V1.2h6v13.3h-6v-1.6c0-0.1,0-0.2,0-0.3l-0.2,0.1l-0.4,0.2C6.7,12.9,6.6,13,6.4,13H6.3v2.3l0.1,0.2c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h7.7L14.5,15.7z"/><path d="M8.3,10.5C8.7,10,9,9.3,9.1,8.6c0-0.2,0.1-0.5,0-0.7c0-0.2,0-0.5,0-0.7C9,6.7,8.8,6.1,8.5,5.7C8.2,5.2,7.8,4.8,7.3,4.5C7.2,4.4,7,4.3,6.9,4.2C6.7,4.1,6.5,4,6.4,4C6.2,3.9,6.1,3.9,5.9,3.8c-0.2,0-0.3-0.1-0.5-0.1h0.1C4.7,3.7,3.8,3.9,3.1,4.3C2.4,4.7,1.8,5.3,1.4,6C1.3,6.3,1.2,6.6,1.1,6.9C1,7.2,1,7.6,1,7.9c0,0.3,0,0.7,0.1,1c0.1,0.3,0.2,0.6,0.3,0.9c0.3,0.5,0.6,0.9,1,1.3c0.4,0.3,0.8,0.6,1.3,0.8C4.2,12,4.7,12.1,5.1,12c0.5,0,1-0.1,1.4-0.3C7.2,11.5,7.8,11.1,8.3,10.5zM4.5,10.1V8.5H2.9V8V7.9V7.3h0H3h1.4V5.7h0.4h0.2h0.6v0v1.5h1.6v1.2H5.7v1.6H4.5z"/></g></svg>', insert_column_right: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M1.3,0.1C1.2,0.2,1.1,0.2,1.1,0.3L1,0.4v14.9l0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1l0.1,0.1h7.7l0.1-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1v-2.3H9.3l-0.5-0.1l-0.4-0.2l-0.2-0.1c0,0.1,0,0.2,0,0.3v1.6h-6V1.3h6v1.6c0,0.1,0,0.2,0,0.3l0.2-0.1l0.4-0.2C9,2.9,9.2,2.8,9.3,2.8h0.1V0.5L9.4,0.3c0-0.1-0.1-0.1-0.2-0.2L9.1,0H1.4L1.3,0.1z"/><path d="M7.5,5.3C7,5.8,6.7,6.5,6.6,7.2c0,0.2-0.1,0.5,0,0.7c0,0.2,0,0.5,0,0.7c0.1,0.6,0.3,1.1,0.6,1.6c0.3,0.5,0.7,0.9,1.2,1.2c0.2,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.2,0.5,0.2c0.1,0.1,0.3,0.1,0.4,0.1c0.2,0,0.3,0.1,0.5,0.1h-0.1c0.8,0.1,1.6-0.1,2.4-0.5c0.7-0.4,1.3-1,1.7-1.7c0.2-0.3,0.3-0.6,0.3-0.9c0.1-0.3,0.1-0.7,0.1-1c0-0.3,0-0.7-0.1-1c-0.1-0.3-0.2-0.6-0.3-0.9c-0.3-0.5-0.6-0.9-1-1.3C13,4.4,12.5,4.2,12,4c-0.4-0.1-0.9-0.2-1.4-0.2c-0.5,0-1,0.1-1.4,0.2C8.5,4.3,7.9,4.7,7.5,5.3z M11.3,5.7v1.6h1.6v0.5v0.1v0.6h0h-0.1h-1.4v1.6h-0.4h-0.2h-0.6v0V8.5H8.5V7.3h1.6V5.7H11.3z"/></g></svg>', delete_row: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 13.83"><g><path d="M4.7,18.46l.12.08H19.73l.12-.08a.58.58,0,0,0,.22-.22l.08-.12,0-7.69-.08-.11a.77.77,0,0,0-.18-.18l-.11-.08-2.31,0-.08.28-.1.29a1.58,1.58,0,0,1-.12.29l-.14.34s0,0,.18,0H18.9v6H5.64v-6H7.35c.14,0,.2,0,.18,0l-.14-.34a2.85,2.85,0,0,1-.12-.29l-.1-.29-.07-.27-2.31,0-.11.08a.77.77,0,0,0-.18.18l-.08.11,0,7.69.08.12a.47.47,0,0,0,.09.12l.13.09ZM12.11,13a4,4,0,0,0,1.46-.21,4.51,4.51,0,0,0,1.31-.71A4,4,0,0,0,16.26,10a4.32,4.32,0,0,0-.08-2.54,4.34,4.34,0,0,0-1-1.52,4.15,4.15,0,0,0-1.54-1,4.34,4.34,0,0,0-1.35-.22A4.07,4.07,0,0,0,11,4.93,3.94,3.94,0,0,0,9.24,6.07,3.92,3.92,0,0,0,8.15,8.88a3.91,3.91,0,0,0,.12.95A4.16,4.16,0,0,0,12.11,13Zm2.35-4.14v.58H10.09V8.27h4.37v.58Z" transform="translate(-4.4 -4.71)"/></g></svg>', delete_column: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.81 15.74"><g><path d="M5.66,19.42l.12.08,7.69,0,.11-.08a.77.77,0,0,0,.18-.18l.08-.11,0-2.32-.15,0-.45-.15-.42-.18-.17-.07a1,1,0,0,0,0,.27v1.63h-6V5h6V6.62a.9.9,0,0,0,0,.26l.17-.07.42-.17a3.91,3.91,0,0,1,.45-.15l.15,0,0-2.32L13.75,4a.77.77,0,0,0-.18-.18l-.11-.08H5.79l-.13.07a.63.63,0,0,0-.21.22l-.08.12V19.08l.08.12a.47.47,0,0,0,.09.12.35.35,0,0,0,.12.1Zm9-3.67a4.16,4.16,0,0,0,2.36-.51,4.08,4.08,0,0,0,1.67-1.72,4,4,0,0,0,.35-.91,3.79,3.79,0,0,0,.1-1,4.71,4.71,0,0,0-.11-1,5,5,0,0,0-.3-.87,4.25,4.25,0,0,0-1-1.25,4.49,4.49,0,0,0-1.34-.81A4.26,4.26,0,0,0,15,7.48a3.88,3.88,0,0,0-1.41.25A4.32,4.32,0,0,0,11.86,9,4,4,0,0,0,11,10.94a4.4,4.4,0,0,0-.05.68,4.5,4.5,0,0,0,.05.68,3.93,3.93,0,0,0,.61,1.57,4.22,4.22,0,0,0,1.18,1.2,4.59,4.59,0,0,0,.48.27c.2.1.37.17.5.22a2.44,2.44,0,0,0,.45.12,4.61,4.61,0,0,0,.5.07Zm2.54-4.12v.58H12.87V11h4.37v.59Z" transform="translate(-5.37 -3.76)"/></g></svg>', fixed_column_width: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6,5H18A1,1 0 0,1 19,6A1,1 0 0,1 18,7H6A1,1 0 0,1 5,6A1,1 0 0,1 6,5M21,2V4H3V2H21M15,8H17V22H15V8M7,8H9V22H7V8M11,8H13V22H11V8Z" /></svg>', rotate_left: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M0.5,10.2c0,0.1,0,0.2,0,0.3v0.2l0,0c0.1,0.3,0.3,0.6,0.4,0.9l0,0C1,11.8,1.3,12,1.5,11.9h0.1h0.2h0.1c0.1-0.1,0.3-0.3,0.4-0.5v-0.2c0-0.1,0-0.2-0.1-0.3l0,0c-0.2-0.2-0.3-0.4-0.3-0.7l0,0C1.8,10,1.7,9.9,1.5,9.8c-0.1,0-0.2,0-0.3,0H0.9C0.7,9.9,0.6,10,0.5,10.2L0.5,10.2z"/><path d="M2.2,11.5L2.2,11.5L2.2,11.5z"/><path d="M5.9,3.6L5.9,3.6L5.9,3.6z"/><path d="M0.1,7.9c0,0.3,0,0.6,0,0.9l0,0l0,0l0,0l0,0c0,0.2,0.1,0.3,0.2,0.4l0,0c0.2,0.1,0.3,0.2,0.5,0.2l0,0l0,0c0.2,0,0.4-0.1,0.5-0.3l0,0c0-0.1,0.1-0.3,0.1-0.4V8.6l0,0c0-0.2,0-0.5,0-0.7l0,0c0-0.2-0.1-0.4-0.2-0.5C1.1,7.3,0.9,7.2,0.7,7.2S0.3,7.3,0.2,7.4C0.1,7.5,0,7.7,0.1,7.9z"/><path d="M1.9,12.7L1.9,12.7c0,0.2,0,0.4,0.2,0.5l0,0l0.2,0.3l0,0c0.2,0.1,0.3,0.2,0.5,0.4l0,0l0,0l0,0l0,0C2.9,14,3,14.1,3.2,14.1s0.4-0.1,0.5-0.2c0.1-0.2,0.2-0.3,0.2-0.5v-0.1c0-0.2-0.1-0.4-0.2-0.5l0,0l-0.4-0.4l-0.2-0.2l0,0C3,12.1,2.8,12,2.6,12l0,0c-0.2,0-0.4,0.1-0.5,0.2l0,0C2,12.3,1.9,12.5,1.9,12.7z"/><path d="M6.6,15c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.2,0.4,0.3l0,0c0.3,0,0.5,0,0.7,0h0.3l0,0c0.2,0,0.4-0.1,0.5-0.2c0.1-0.2,0.2-0.3,0.2-0.5l0,0l0,0c0-0.2-0.1-0.4-0.2-0.5l0,0c-0.1-0.1-0.3-0.2-0.5-0.2l0,0H7.9c-0.1,0-0.3,0-0.5,0l0,0H7.3c-0.2-0.1-0.3,0-0.5,0.1l0,0C6.7,14.6,6.6,14.8,6.6,15L6.6,15L6.6,15L6.6,15z"/><path d="M4.2,7.4C4,7.5,4,7.7,4,7.9c0,0.2,0,0.4,0.2,0.5l0,0l3.2,3.2l0,0c0.1,0.1,0.3,0.2,0.5,0.2s0.3-0.1,0.5-0.2l0,0l3.2-3.2l0,0c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5l0,0C11.5,7.3,11,6.7,10,5.8l0,0L8.4,4.2l0,0C8.3,4.1,8.1,4,7.9,4S7.5,4.1,7.4,4.2L4.2,7.4L4.2,7.4z M6.8,9L5.7,7.9l2.2-2.2l2.3,2.2l-2.3,2.2C7.7,9.9,7.3,9.5,6.8,9L6.8,9z"/><path d="M4.1,14.1C4,14.2,4,14.3,4,14.4v0.2l0,0c0.1,0.1,0.2,0.3,0.4,0.4l0,0c0.3,0.1,0.6,0.2,0.9,0.4h0.1h0.1l0,0c0.2,0,0.3-0.1,0.5-0.1l0,0c0.2-0.1,0.3-0.3,0.3-0.4l0,0l0,0l0,0l0,0v-0.2c0-0.1-0.1-0.2-0.1-0.3l0,0C6.1,14.2,6,14.1,5.8,14l0,0c-0.3-0.1-0.5-0.2-0.8-0.2l0,0c-0.1-0.1-0.2-0.1-0.3-0.1H4.5C4.3,13.7,4.2,13.9,4.1,14.1z"/><path d="M9.3,14.4c0,0.1-0.1,0.3,0,0.4V15l0,0c0,0.1,0.1,0.3,0.5,0.4c0.1,0.1,0.3,0.1,0.4,0.1l0,0h0.1l0,0c0.3-0.1,0.6-0.2,0.9-0.3l0,0c0.1-0.1,0.2-0.2,0.3-0.4l0.1-0.3c0-0.1-0.1-0.2-0.1-0.3l0,0c-0.1-0.2-0.2-0.3-0.4-0.4l0,0h-0.3c-0.1,0-0.2,0-0.3,0l0,0c-0.2,0.1-0.5,0.2-0.8,0.3l0,0C9.5,14.1,9.4,14.2,9.3,14.4L9.3,14.4z"/><path d="M11.4,14.7L11.4,14.7L11.4,14.7z"/><path d="M9.5,15.3L9.5,15.3L9.5,15.3z"/><path d="M15.9,7.9c0-1-0.2-2-0.6-3l0,0c-0.4-1-1-1.9-1.7-2.6C12.8,1.6,12,1,11,0.6l0,0C10.1,0.2,9,0,8,0C7.3,0,6.5,0.1,5.8,0.3l0,0C5.2,0.5,4.6,0.8,4,1.1L3.1,0.2l0,0C2.9,0.1,2.8,0,2.6,0H2.4l0,0C2.2,0,2,0.2,1.9,0.4l0,0L0.1,4.9l0,0C0,5,0,5.1,0,5.2c0,0.2,0.1,0.4,0.2,0.5l0,0c0.2,0.1,0.3,0.2,0.5,0.2h0.1H1l0,0l4.7-1.8l0,0C5.9,4,6.1,3.8,6.1,3.6V3.4C6.1,3.2,6,3,5.9,2.9l0,0L5.1,2.1c0.4-0.2,0.8-0.4,1.3-0.5c0.5-0.1,1.1-0.2,1.7-0.2c0.9,0,1.7,0.2,2.5,0.5l0,0c0.8,0.3,1.5,0.8,2.1,1.4c0.6,0.6,1.1,1.3,1.4,2.1l0,0c0.3,0.8,0.5,1.6,0.5,2.5s-0.2,1.7-0.5,2.5l0,0c-0.3,0.8-0.8,1.5-1.4,2.1c-0.2,0.2-0.4,0.3-0.6,0.5l0,0c-0.2,0.1-0.3,0.3-0.3,0.5v0.1c0,0.1,0,0.3,0.1,0.4l0,0c0.1,0.2,0.3,0.3,0.5,0.3l0,0c0.1,0,0.3-0.1,0.4-0.2l0,0l0,0l0,0l0,0c0.2-0.2,0.5-0.4,0.7-0.6l0,0l0,0l0,0l0,0c0.7-0.8,1.3-1.6,1.7-2.6C15.6,10,15.8,9,15.9,7.9z M1.9,4C2,3.8,2.1,3.5,2.3,3.1l0,0L2.7,2l1.2,1.2L1.9,4z"/><path d="M6.8,15.5L6.8,15.5L6.8,15.5z"/></g></svg>', rotate_right: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M9.9,15.3L9.9,15.3L9.9,15.3z"/><path d="M6.9,15.1L6.9,15.1c0,0.1,0.1,0.3,0.2,0.4l0,0c0.1,0.2,0.3,0.3,0.5,0.3l0,0h0.3c0.2,0,0.4,0,0.7,0l0,0c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.2,0.2-0.4V15c0-0.2-0.1-0.4-0.2-0.4c-0.2-0.1-0.3-0.2-0.5-0.2H8.4l0,0c-0.1,0-0.3,0-0.5,0H7.6l0,0c-0.2,0-0.4,0.1-0.5,0.2C7,14.7,6.9,14.9,6.9,15.1z"/><path d="M6.5,14.4L6.5,14.4L6.5,14.4z"/><path d="M5.8,5.8L5.8,5.8c-1,0.9-1.5,1.5-1.7,1.6l0,0C4,7.5,4,7.7,4,7.9c0,0.2,0,0.4,0.2,0.5l0,0l3.2,3.2l0,0c0.2,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l0,0l3.2-3.2l0,0c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5l0,0L8.4,4.2C8.3,4.1,8.1,4,7.9,4C7.7,4,7.5,4.1,7.4,4.2l0,0L5.8,5.8z M5.6,7.9l2.3-2.2l2.2,2.2L9,9l0,0l0,0l0,0l0,0c-0.5,0.6-0.9,0.9-1.1,1.1L5.6,7.9z"/><path d="M9,15.5L9,15.5L9,15.5z"/><path d="M9.6,14.7v0.2l0,0l0,0l0,0l0,0c0.1,0.2,0.1,0.3,0.3,0.3c0.1,0.1,0.3,0.1,0.4,0.1l0,0h0.1h0.1c0.3-0.1,0.6-0.3,0.9-0.4l0,0c0.1-0.1,0.2-0.2,0.3-0.4l0,0v-0.2c0-0.1,0-0.2-0.1-0.3c-0.1-0.2-0.2-0.3-0.4-0.4H11c-0.1,0-0.2,0.1-0.3,0.1l0,0c-0.2,0.1-0.4,0.2-0.7,0.3l0,0l0,0c-0.1,0.1-0.3,0.2-0.4,0.4C9.6,14.5,9.6,14.6,9.6,14.7z"/><path d="M9,14.5L9,14.5L9,14.5z"/><path d="M9.6,14.4L9.6,14.4L9.6,14.4z"/><path d="M11.7,14L11.7,14L11.7,14z"/><path d="M15.6,7.4L15.6,7.4L15.6,7.4z"/><path d="M15,9.4c0.2,0,0.4,0,0.6-0.2l0,0c0.1-0.1,0.2-0.2,0.2-0.4l0,0l0,0l0,0l0,0c0-0.3,0-0.6,0-0.9c0-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.3-0.2-0.5-0.2s-0.4,0.1-0.5,0.2c-0.1,0.1-0.2,0.3-0.2,0.5l0,0c0,0.2,0,0.4,0,0.7l0,0v0.1c0,0.1,0,0.3,0.1,0.4l0,0C14.6,9.3,14.8,9.4,15,9.4L15,9.4L15,9.4z"/><path d="M14,12h0.1h0.2h0.1c0.2,0,0.5-0.2,0.6-0.4l0,0c0.2-0.3,0.3-0.6,0.4-0.9l0,0v-0.2c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.2-0.2-0.3-0.4-0.4h-0.3c-0.1,0-0.2,0-0.3,0C14.2,9.9,14,10,14,10.3l0,0c-0.1,0.2-0.2,0.5-0.3,0.7l0,0c-0.1,0.1-0.1,0.2-0.1,0.3v0.2l0,0l0,0C13.6,11.6,13.8,11.8,14,12z"/><path d="M14.6,7.4L14.6,7.4L14.6,7.4z"/><path d="M4.4,14.2c-0.1,0.1-0.1,0.2-0.1,0.3l0.1,0.2c0,0.2,0.2,0.3,0.3,0.4l0,0c0.3,0.1,0.6,0.3,1.1,0.4l0,0h0.1l0,0c0.1,0,0.2-0.1,0.4-0.2c0.1,0,0.2-0.2,0.3-0.3l0,0v-0.2c0-0.1-0.1-0.3-0.2-0.4c-0.1-0.1-0.2-0.2-0.4-0.3l0,0c-0.2-0.1-0.5-0.2-0.7-0.3l0,0c-0.1,0-0.2,0-0.3,0H4.7l0,0C4.6,13.9,4.4,14,4.4,14.2L4.4,14.2z"/><path d="M11.9,13.3c0,0.2,0.1,0.4,0.2,0.6c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l0,0l0,0l0,0l0,0c0.1-0.1,0.3-0.3,0.4-0.4l0,0l0.2-0.3l0,0c0.1-0.2,0.2-0.3,0.2-0.5l0,0c0-0.2-0.1-0.4-0.2-0.5l0,0c-0.1-0.1-0.3-0.2-0.5-0.2l0,0c-0.2,0-0.4,0.1-0.5,0.2l0,0l-0.2,0.2l-0.4,0.4l0,0C12,13,11.9,13.1,11.9,13.3L11.9,13.3z"/><path d="M12.1,13.8L12.1,13.8L12.1,13.8z"/><path d="M11.9,13.3L11.9,13.3L11.9,13.3z"/><path d="M15.9,5.2c0-0.1-0.1-0.2-0.1-0.3l0,0L14,0.4l0,0C13.9,0.2,13.7,0,13.5,0l0,0l0,0h-0.2c-0.2,0-0.4,0.1-0.5,0.2l0,0l-0.9,0.9c-0.5-0.3-1.1-0.6-1.8-0.8l0,0C9.4,0.1,8.7,0,7.9,0c-1,0-2,0.2-3,0.6S3,1.6,2.3,2.3C1.6,3.1,1,3.9,0.6,4.9l0,0C0.2,5.8,0,6.8,0,7.9c0,1,0.2,2,0.6,3s0.9,1.8,1.7,2.6l0,0l0,0l0,0l0,0c0.2,0.2,0.5,0.4,0.7,0.6l0,0l0,0l0,0l0,0c0.2,0.1,0.3,0.2,0.5,0.2l0,0c0.2,0,0.4-0.1,0.6-0.3l0,0c0.1-0.1,0.1-0.3,0.1-0.4v-0.1l0,0C4.1,13.3,4,13.1,3.9,13l0,0c-0.2-0.1-0.4-0.3-0.6-0.5c-0.6-0.6-1.1-1.3-1.4-2.1l0,0C1.6,9.6,1.4,8.8,1.4,7.9s0.2-1.7,0.5-2.5l0,0c0.3-0.8,0.8-1.5,1.4-2.1c0.6-0.6,1.3-1.1,2.1-1.4l0,0C6.2,1.6,7,1.4,7.9,1.4c0.6,0,1.1,0.1,1.7,0.2c0.5,0.1,0.9,0.3,1.3,0.5l-0.8,0.8l0,0C10,3.1,9.9,3.2,9.9,3.4v0.2l0,0l0,0c0,0.2,0.2,0.4,0.4,0.5l0,0l4.5,1.8l0,0H15h0.1c0.2,0,0.4-0.1,0.5-0.2l0,0C15.7,5.6,15.8,5.4,15.9,5.2z M11.8,3.2L13,2l0.4,1.1l0,0c0.2,0.4,0.3,0.7,0.4,0.9L11.8,3.2z"/></g></svg>', mirror_horizontal: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.75 15.74"><g><path d="M13.75,3.76l5.9,15.74h-5.9V3.76ZM4.9,19.5,10.8,3.76V19.5H4.9Z" transform="translate(-4.9 -3.76)"/></g></svg>', mirror_vertical: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.75"><g><path d="M20.15,13.1,4.41,19V13.1H20.15ZM4.41,4.25l15.74,5.9H4.41V4.25Z" transform="translate(-4.41 -4.25)"/></g></svg>', checked: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 12.1"><g><path d="M4.59,12.23l.12.18L9.43,17.5a.58.58,0,0,0,.84,0L20,7.45h0a.58.58,0,0,0,0-.84l-.85-.85a.58.58,0,0,0-.84,0H18.2l-8.12,8.41a.29.29,0,0,1-.42,0l-3.4-3.63a.58.58,0,0,0-.84,0l-.85.85a.6.6,0,0,0-.14.21.51.51,0,0,0,0,.44c.05.06.1.13.16.19Z" transform="translate(-4.38 -5.58)"/></g></svg>', line_break: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,6a1,1,0,0,0-1,1v4a1,1,0,0,1-1,1H7.41l1.3-1.29A1,1,0,0,0,7.29,9.29l-3,3a1,1,0,0,0-.21.33,1,1,0,0,0,0,.76,1,1,0,0,0,.21.33l3,3a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42L7.41,14H17a3,3,0,0,0,3-3V7A1,1,0,0,0,19,6Z"/></svg>', audio: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" /></svg>', image_gallery: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 30 150 150"><g><path d="M152.775,120.548V51.651c0-12.271-9.984-22.254-22.254-22.254H43.727c-12.271,0-22.254,9.983-22.254,22.254v68.896c0,12.27,9.983,22.254,22.254,22.254h86.795C142.791,142.802,152.775,132.817,152.775,120.548z M36.394,51.651c0-4.042,3.291-7.333,7.333-7.333h86.795c4.042,0,7.332,3.291,7.332,7.333v23.917l-14.938-17.767c-1.41-1.678-3.487-2.649-5.68-2.658h-0.029c-2.184,0-4.255,0.954-5.674,2.613L76.709,98.519l-9.096-9.398c-1.427-1.474-3.392-2.291-5.448-2.273c-2.052,0.025-4.004,0.893-5.396,2.4L36.394,111.32V51.651z M41.684,127.585l20.697-22.416l9.312,9.622c1.461,1.511,3.489,2.334,5.592,2.27c2.101-0.066,4.075-1.013,5.44-2.612l34.436-40.308l20.693,24.613v21.794c0,4.042-3.29,7.332-7.332,7.332H43.727C43.018,127.88,42.334,127.775,41.684,127.585z M182.616,152.5V75.657c0-4.12-3.34-7.46-7.461-7.46c-4.119,0-7.46,3.34-7.46,7.46V152.5c0,4.112-3.347,7.46-7.461,7.46h-94c-4.119,0-7.46,3.339-7.46,7.459c0,4.123,3.341,7.462,7.46,7.462h94C172.576,174.881,182.616,164.841,182.616,152.5z"/></g></svg>', bookmark: '<svg viewBox="0 0 24 24"><path d="M17,3H7A2,2 0 0,0 5,5V21L12,18L19,21V5C19,3.89 18.1,3 17,3Z" /></svg>', download: '<svg viewBox="0 0 24 24"><path d="M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 15L17.55 9.54L16.13 8.13L13 11.25V2H11V11.25L7.88 8.13L6.46 9.55L12 15Z" /></svg>', more_text: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 10 180 180"><g><path d="M49.711,142.188h49.027c2.328,0.002,4.394,1.492,5.129,3.699l9.742,29.252c0.363,1.092,1.385,1.828,2.537,1.83l15.883,0.01c0.859,0,1.667-0.412,2.17-1.109s0.641-1.594,0.37-2.41l-16.625-50.045L86.503,28.953c-0.36-1.097-1.383-1.839-2.537-1.842H64.532c-1.153-0.001-2.178,0.736-2.542,1.831L13.847,173.457c-0.271,0.816-0.135,1.713,0.369,2.412c0.503,0.697,1.311,1.109,2.171,1.109h15.872c1.151,0,2.173-0.736,2.537-1.828l9.793-29.287C45.325,143.66,47.39,142.18,49.711,142.188L49.711,142.188z M53.493,119.098l15.607-46.9c0.744-2.196,2.806-3.674,5.125-3.674s4.381,1.478,5.125,3.674l15.607,46.904c0.537,1.621,0.263,3.402-0.736,4.789c-1.018,1.408-2.649,2.24-4.386,2.24H58.615c-1.736,0-3.368-0.832-4.386-2.24C53.23,122.504,52.956,120.721,53.493,119.098L53.493,119.098z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.633,190.465,66.178,190.465,63.32L190.465,63.32z M190.465,101.994c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.887,1.026,5.352,3.056,7.395c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.994L190.465,101.994z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>', more_paragraph: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 10 180 180"><g><path d="M128.39,28.499H63.493c-25.558,0-46.354,20.796-46.354,46.354c0,25.559,20.796,46.353,46.354,46.353h9.271v55.625h18.542V47.04h9.271V176.83h18.543V47.04h9.271V28.499z M72.764,102.664h-9.271c-15.337,0-27.813-12.475-27.813-27.812c0-15.336,12.476-27.813,27.813-27.813h9.271V102.664z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.633,190.465,66.178,190.465,63.32L190.465,63.32z M190.465,101.994c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.887,1.026,5.352,3.056,7.395c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.994L190.465,101.994z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>', more_plus: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="35 30 140 140"><g><path d="M137.215,102.045c0,3.498-2.835,6.332-6.333,6.332H24.549c-3.498,0-6.334-2.834-6.334-6.332l0,0c0-3.498,2.836-6.333,6.334-6.333h106.333C134.38,95.711,137.215,98.547,137.215,102.045L137.215,102.045z M77.715,161.545c-3.498,0-6.333-2.836-6.333-6.334V48.878c0-3.498,2.836-6.333,6.333-6.333l0,0c3.498,0,6.334,2.835,6.334,6.333v106.333C84.049,158.709,81.213,161.545,77.715,161.545L77.715,161.545z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.632,190.465,66.177,190.465,63.32L190.465,63.32z M190.465,101.993c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.888,1.026,5.353,3.056,7.396c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.993L190.465,101.993z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>', more_horizontal: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 3.58"><g><path d="M4.64,10.73a1.84,1.84,0,0,1,.65-.65,1.76,1.76,0,0,1,1.79,0A1.79,1.79,0,0,1,8,11.63a1.84,1.84,0,0,1-.25.9,1.69,1.69,0,0,1-.65.65,1.8,1.8,0,0,1-2.69-1.55A2.08,2.08,0,0,1,4.64,10.73Zm6.09,0a1.84,1.84,0,0,1,.65-.65,1.78,1.78,0,0,1,2.67,1.55,1.73,1.73,0,0,1-.24.9,1.84,1.84,0,0,1-.65.65,1.76,1.76,0,0,1-1.79,0,1.79,1.79,0,0,1-.64-2.44Zm6.08,0a1.69,1.69,0,0,1,.65-.65,1.76,1.76,0,0,1,1.79,0,1.79,1.79,0,0,1,.9,1.54,1.73,1.73,0,0,1-.24.9,1.84,1.84,0,0,1-.65.65,1.8,1.8,0,0,1-2.69-1.55A2,2,0,0,1,16.81,10.73Z" transform="translate(-4.39 -9.84)"/></g></svg>', more_vertical: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3.94 15.75"><g><path d="M12.28,7.69a1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39,1.92,1.92,0,0,1,.58-1.39,2,2,0,0,1,1.39-.58,1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39,1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58Zm0,2a1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39A1.92,1.92,0,0,1,13.67,13a2,2,0,0,1-1.39.58A1.92,1.92,0,0,1,10.89,13a2,2,0,0,1-.58-1.39,2,2,0,0,1,2-2Zm0,5.9a1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39,1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58,1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39,1.92,1.92,0,0,1,.58-1.39,1.94,1.94,0,0,1,1.39-.58Z" transform="translate(-10.31 -3.75)"/></g></svg>', attachment: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8.38 15.68"><g><path d="M15.23,6h1v9.78a3.88,3.88,0,0,1-1.31,2.45,4,4,0,0,1-6.57-2.45V7A3,3,0,0,1,9.2,4.89a3,3,0,0,1,5,2.09v8.31a1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58,1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39V8h1v7.32a1,1,0,0,0,.29.69,1,1,0,0,0,.69.28A.9.9,0,0,0,13,16a1,1,0,0,0,.29-.69V7a1.92,1.92,0,0,0-.58-1.39A2,2,0,0,0,11.27,5a1.92,1.92,0,0,0-1.39.58A2,2,0,0,0,9.33,7v8.31a3,3,0,1,0,5.9,0V6Z" transform="translate(-8.08 -3.78)"/></g></svg>', map: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.7 15.62"><g><path d="M12.05,12.42a2.93,2.93,0,1,1,2.07-5A2.88,2.88,0,0,1,15,9.49a3,3,0,0,1-.86,2.07,2.89,2.89,0,0,1-2.07.86Zm0-5.36a2.43,2.43,0,0,0-1.72,4.16,2.48,2.48,0,0,0,1.72.72,2.44,2.44,0,0,0,0-4.88Zm0-3.3A5.84,5.84,0,0,1,17.9,9.62a9.94,9.94,0,0,1-1.73,5A33.59,33.59,0,0,1,12.84,19a1.52,1.52,0,0,1-.23.2,1,1,0,0,1-.55.2h0a1,1,0,0,1-.55-.2,1.52,1.52,0,0,1-.23-.2,33.59,33.59,0,0,1-3.33-4.32,9.93,9.93,0,0,1-1.72-5,5.84,5.84,0,0,1,5.85-5.86ZM12,18.34l.08.05.06-.06a35.58,35.58,0,0,0,3.06-3.93,9.35,9.35,0,0,0,1.74-4.77,4.88,4.88,0,0,0-4.88-4.88A4.79,4.79,0,0,0,8.6,6.17,4.84,4.84,0,0,0,7.17,9.62,9.29,9.29,0,0,0,8.91,14.4,36,36,0,0,0,12,18.34Z" transform="translate(-6.2 -3.76)"/></g></svg>', magic_stick: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 15.75"><g><path d="M19.86,19.21a1,1,0,0,0,.28-.68,1,1,0,0,0-.28-.7L13,10.93a1,1,0,0,0-.7-.28,1,1,0,0,0-.68,1.65l6.9,6.9a1,1,0,0,0,.69.29.93.93,0,0,0,.69-.28ZM9.19,8.55a3,3,0,0,0,1.68,0,14.12,14.12,0,0,0,1.41-.32A11.26,11.26,0,0,0,10.8,7.06c-.56-.36-.86-.56-.91-.58S10,5.91,10,5.11s0-1.26-.15-1.37a4.35,4.35,0,0,0-1.19.71c-.53.4-.81.62-.87.68a9,9,0,0,0-2-.6,6.84,6.84,0,0,0-.76-.09s0,.27.08.77a8.6,8.6,0,0,0,.61,2q-.09.09-.69.87a3.59,3.59,0,0,0-.68,1.17c.12.17.57.23,1.36.15S7,9.26,7.15,9.23s.21.36.57.91a10.49,10.49,0,0,0,1.14,1.48c0-.1.14-.57.31-1.4a3,3,0,0,0,0-1.67Z" transform="translate(-4.41 -3.74)"/></g></svg>', empty_file: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.78 15.75"><g><path d="M14.73,3.76,18.67,7.7v9.84a2,2,0,0,1-2,2H7.84a1.89,1.89,0,0,1-1.38-.58,2,2,0,0,1-.57-1.39V5.73a1.93,1.93,0,0,1,.57-1.38,2,2,0,0,1,1.38-.58h6.62l.26,0v0Zm2.95,4.92h-2a1.93,1.93,0,0,1-1.38-.57,2,2,0,0,1-.58-1.4V6.17c0-.36,0-.84,0-1.43H7.85a1,1,0,0,0-.7.29,1,1,0,0,0-.29.7V17.54a1,1,0,0,0,.29.69,1,1,0,0,0,.69.29h8.85a1,1,0,0,0,.71-.29.92.92,0,0,0,.28-.69Zm0-1L14.73,4.74v2A1,1,0,0,0,15,7.4a1,1,0,0,0,.69.29Z" transform="translate(-5.89 -3.76)"/></g></svg>' }, 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 = { "&": "&amp;", " ": "&nbsp;", "'": "&apos;", '"': "&quot;", "<": "&lt;", ">": "&gt;" }; 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 = "<br>"); 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 = "<br>") }, 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 ? "<br>" : 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 = '<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1">' + 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 += '<link href="' + e[t] + '" rel="stylesheet">' } return i + ("auto" === e.height ? "<style>\n/** Iframe height auto */\nbody{height: min-content; overflow: hidden;}\n</style>" : "") } }; 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 = '<div class="se-loading-effect"></div>'; const v = n.createElement("DIV"); v.className = "se-line-breaker", v.innerHTML = '<button class="se-btn">' + t.icons.line_break + "</button>"; 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 + '<span class="se-shortcut">' + (o.indexOf("bold") > -1 ? "" : i + '+<span class="se-shortcut-key">B</span>') + "</span>", "bold", "", t.bold], underline: ["_se_command_underline", n.toolbar.underline + '<span class="se-shortcut">' + (o.indexOf("underline") > -1 ? "" : i + '+<span class="se-shortcut-key">U</span>') + "</span>", "underline", "", t.underline], italic: ["_se_command_italic", n.toolbar.italic + '<span class="se-shortcut">' + (o.indexOf("italic") > -1 ? "" : i + '+<span class="se-shortcut-key">I</span>') + "</span>", "italic", "", t.italic], strike: ["_se_command_strike", n.toolbar.strike + '<span class="se-shortcut">' + (o.indexOf("strike") > -1 ? "" : i + l + '+<span class="se-shortcut-key">S</span>') + "</span>", "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 + '<span class="se-shortcut">' + (o.indexOf("indent") > -1 ? "" : i + '+<span class="se-shortcut-key">' + s[0] + "</span>") + "</span>", "indent", "", t.outdent], outdent: ["_se_command_outdent", n.toolbar.outdent + '<span class="se-shortcut">' + (o.indexOf("indent") > -1 ? "" : i + '+<span class="se-shortcut-key">' + s[1] + "</span>") + "</span>", "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 + '<span class="se-shortcut">' + (o.indexOf("undo") > -1 ? "" : i + '+<span class="se-shortcut-key">Z</span>') + "</span>", "undo", "", t.undo], redo: ["_se_command_redo se-resizing-enabled", n.toolbar.redo + '<span class="se-shortcut">' + (o.indexOf("undo") > -1 ? "" : i + '+<span class="se-shortcut-key">Y</span> / ' + i + l + '+<span class="se-shortcut-key">Z</span>') + "</span>", "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 + '<span class="se-shortcut">' + (o.indexOf("save") > -1 ? "" : i + '+<span class="se-shortcut-key">S</span>') + "</span>", "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", '<span class="txt">' + n.toolbar.font + "</span>" + t.arrow_down], formatBlock: ["se-btn-select se-btn-tool-format", n.toolbar.formats, "formatBlock", "submenu", '<span class="txt">' + n.toolbar.formats + "</span>" + t.arrow_down], fontSize: ["se-btn-select se-btn-tool-size", n.toolbar.fontSize, "fontSize", "submenu", '<span class="txt">' + n.toolbar.fontSize + "</span>" + 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 = '<span class="se-icon-text">!</span>'), /^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 += '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + (t || n) + "</span></span>", 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 = '<div class="se-more-form"><ul class="se-menu-list"' + (y ? ' style="float: ' + y + ';"' : "") + "></ul></div>", 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 = "<br>", 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 = "<br>", 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 = "<br>", (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 = "<br>") } else { const e = this.removeNode(), t = e.container, i = e.prevContainer; if (t && 0 === t.childNodes.length && s && (r.isFormatElement(t) ? t.innerHTML = "<br>" : r.isRangeFormatElement(t) && (t.innerHTML = "<" + l.defaultTag + "><br></" + 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 + "><br></" + 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 = "<!DOCTYPE html>\n<html>\n" + this._wd.head.outerHTML.replace(/>(?!\n)/g, ">\n") + "<body " + e + ">\n" + t + "</body>\n</html>" } 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("<!DOCTYPE html><html><head>" + i.head.innerHTML + "</head><body " + e + ">" + t + "</body></html>") } 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("<!DOCTYPE html><html><head>" + o + '</head><body class="' + (null !== l._printClass ? l._printClass : l._editableClass) + '">' + t + "</body></html>") } 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("<!DOCTYPE html><html><head>" + n.head.innerHTML + "<style>body {overflow:auto !important; margin: 10px auto !important; height:auto !important; outline:1px dashed #ccc;}</style></head><body " + i + ">" + e + "</body></html>") } 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('<!DOCTYPE html><html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>' + i.toolbar.preview + "</title>" + a + '</head><body class="' + (null !== l._printClass ? l._printClass : l._editableClass) + '" style="margin:10px auto !important; height:auto !important; outline:1px dashed #ccc;">' + e + "</body></html>") } }, 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(/<script[\s\S]*>[\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 "<!DOCTYPE html><html>" + this._wd.head.outerHTML + "<body " + e + ">" + i.innerHTML + "</body></html>" } 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 + "</" + n + ">"; 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) + "</" + n + ">"); 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 || /<span/i.test(n)) && (!i || !/style=/i.test(i.toString()))) { const e = t.match(/style\s*=\s*(?:"|')[^"']*(?:"|')/); e && (i || (i = []), i.push(e[0])) } if (/<a\b/i.test(n)) { const e = t.match(/id\s*=\s*(?:"|')[^"']*(?:"|')/); e && (i || (i = []), i.push(e[0])) } if (i) for (let t = 0, l = i.length; t < l; t++)e && /^class="(?!(__se__|se-|katex))/.test(i[t]) || (n += " " + (/^href\s*=\s*('|"|\s)*javascript\s*\:/i.test(i[t]) ? "" : i[t])); return n }, cleanHTML: function (e, t) { e = this._deleteDisallowedTags(e).replace(/(<[a-zA-Z0-9\-]+)[^>]*(?=>)/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 + "><br></" + 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 = "<br>"; const e = f.attributes; for (; e[0];)f.removeAttribute(e[0].name) } else { const e = r.createElement(l.defaultTag); e.innerHTML = "<br>", 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 ? "<br>" : "<" + f.nodeName + "><br></" + 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]) ? "<br>" : "<br><br>", !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 = "<br>", _.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 = "<br>", 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 = "<br>"), 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 = "<br>", 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, "<br>") : (o ? (i = i.replace(/\n/g, " "), n = n.replace(/\n/g, " ")) : i = (n === i ? n : i).replace(/\n/g, "<br>"), 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 = "<br>"), 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 = "<div>" + this.lang.dialogBox.caption + "</div>", 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 = '<div class="se-modal-resize"></div><div class="se-resize-dot"><span class="tl"></span><span class="tr"></span><span class="bl"></span><span class="br"></span><span class="lw"></span><span class="th"></span><span class="rw"></span><span class="bh"></span><div class="se-resize-display"></div></div>', 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 = '<div class="se-arrow se-arrow-up"></div><div class="se-btn-group _se_resizing_btn_group"><button type="button" data-command="percent" data-value="1" class="se-tooltip _se_percentage"><span>100%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.resize100 + '</span></span></button><button type="button" data-command="percent" data-value="0.75" class="se-tooltip _se_percentage"><span>75%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.resize75 + '</span></span></button><button type="button" data-command="percent" data-value="0.5" class="se-tooltip _se_percentage"><span>50%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.resize50 + '</span></span></button><button type="button" data-command="auto" class="se-btn se-tooltip _se_auto_size">' + n.auto_size + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.autoSize + '</span></span></button><button type="button" data-command="rotate" data-value="-90" class="se-btn se-tooltip _se_rotation">' + n.rotate_left + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.rotateLeft + '</span></span></button><button type="button" data-command="rotate" data-value="90" class="se-btn se-tooltip _se_rotation">' + n.rotate_right + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.rotateRight + '</span></span></button></div><div class="se-btn-group" style="padding-top: 0;"><button type="button" data-command="mirror" data-value="h" class="se-btn se-tooltip">' + n.mirror_horizontal + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.mirrorHorizontal + '</span></span></button><button type="button" data-command="mirror" data-value="v" class="se-btn se-tooltip">' + n.mirror_vertical + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.mirrorVertical + '</span></span></button><button type="button" data-command="onalign" class="se-btn se-tooltip _se_resizing_align_button">' + n.align_justify + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.toolbar.align + '</span></span></button><div class="se-btn-group-sub sun-editor-common se-list-layer se-resizing-align-list"><div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="basic">' + n.align_justify + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.basic + '</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="left">' + n.align_left + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.left + '</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="center">' + n.align_center + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.center + '</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="right">' + n.align_right + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.right + '</span></span></button></li></ul></div></div><button type="button" data-command="caption" class="se-btn se-tooltip _se_resizing_caption_button">' + n.caption + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.caption + '</span></span></button><button type="button" data-command="revert" class="se-btn se-tooltip">' + n.revert + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.dialogBox.revertButton + '</span></span></button><button type="button" data-command="update" class="se-btn se-tooltip">' + n.modify + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.edit + '</span></span></button><button type="button" data-command="delete" class="se-btn se-tooltip">' + n.delete + '<span class="se-tooltip-inner"><span class="se-tooltip-text">' + t.controller.remove + "</span></span></button></div>", 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 = "<a id='" + S + "'></a><select id='" + S + "-\r\\' msallowcapture=''><option selected=''></option></select>", 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 = "<a href='#'></a>", "#" === 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 = "<input/>", 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, "<select multiple='multiple'>", "</select>"], thead: [1, "<table>", "</table>"], col: [2, "<table><colgroup>", "</colgroup></table>"], tr: [2, "<table><tbody>", "</tbody></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _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 = "<textarea>x</textarea>", 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 = /<script|<style|<link/i, ct = /checked\s*(?:[^=]|=\s*.checked.)/i, lt = /^true\/(.*)/, ht = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\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></$2>") }, 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("<iframe frameborder='0' width='0' height='0'/>")).appendTo(e.documentElement))[0].contentDocument).write(), e.close(), n = wt(t, e), yt.detach()), bt[t] = n), n } function xt(t, e, n, r) { var i, o = {}; for (i in e) o[i] = t.style[i], t.style[i] = e[i]; for (i in r = n.apply(t, r || []), e) t.style[i] = o[i]; return r } var Ct, kt, St, Ot, Et, Tt, At = /^margin/, It = new RegExp("^(" + s + ")(?!px)[a-z%]+$", "i"), jt = function (t) { var e = t.ownerDocument.defaultView; return e && e.opener || (e = x), e.getComputedStyle(t) }, Pt = C.documentElement; function Nt() { Tt.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%", Tt.innerHTML = "", Pt.appendChild(Et); var t = x.getComputedStyle(Tt); Ct = "1%" !== t.top, Ot = "2px" === t.marginLeft, kt = "4px" === t.width, Tt.style.marginRight = "50%", St = "4px" === t.marginRight, Pt.removeChild(Et) } function Dt(t, e, n) { var r, i, o = t.style; return "" !== (i = (n = n || jt(t)) ? n.getPropertyValue(e) || n[e] : void 0) && void 0 !== i || k.contains(t.ownerDocument, t) || (i = k.style(t, e)), n && !m.pixelMarginRight() && It.test(i) && At.test(e) && (r = o.width, t = o.minWidth, e = o.maxWidth, o.minWidth = o.maxWidth = o.width = i, i = n.width, o.width = r, o.minWidth = t, o.maxWidth = e), void 0 !== i ? i + "" : i } function Rt(t, e) { return { get: function () { return t() ? void delete this.get : (this.get = e).apply(this, arguments) } } } Et = C.createElement("div"), (Tt = C.createElement("div")).style && (Tt.style.backgroundClip = "content-box", Tt.cloneNode(!0).style.backgroundClip = "", m.clearCloneStyle = "content-box" === Tt.style.backgroundClip, Et.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute", Et.appendChild(Tt), k.extend(m, { pixelPosition: function () { return Nt(), Ct }, boxSizingReliable: function () { return null == kt && Nt(), kt }, pixelMarginRight: function () { return null == kt && Nt(), St }, reliableMarginLeft: function () { return null == kt && Nt(), Ot }, reliableMarginRight: function () { var t, e = Tt.appendChild(C.createElement("div")); return e.style.cssText = Tt.style.cssText = "-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0", e.style.marginRight = e.style.width = "0", Tt.style.width = "1px", Pt.appendChild(Et), t = !parseFloat(x.getComputedStyle(e).marginRight), Pt.removeChild(Et), Tt.removeChild(e), t } })); var Mt = /^(none|table(?!-c[ea]).+)/, Wt = { position: "absolute", visibility: "hidden", display: "block" }, Lt = { letterSpacing: "0", fontWeight: "400" }, Ft = ["Webkit", "O", "Moz", "ms"], Ht = C.createElement("div").style; function Bt(t) { if (t in Ht) return t; for (var e = t[0].toUpperCase() + t.slice(1), n = Ft.length; n--;)if ((t = Ft[n] + e) in Ht) return t } function qt(t, e, n) { var r = z.exec(e); return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : e } function zt(t, e, n, r, i) { for (var o = n === (r ? "border" : "content") ? 4 : "width" === e ? 1 : 0, s = 0; o < 4; o += 2)"margin" === n && (s += k.css(t, n + U[o], !0, i)), r ? ("content" === n && (s -= k.css(t, "padding" + U[o], !0, i)), "margin" !== n && (s -= k.css(t, "border" + U[o] + "Width", !0, i))) : (s += k.css(t, "padding" + U[o], !0, i), "padding" !== n && (s += k.css(t, "border" + U[o] + "Width", !0, i))); return s } function Ut(t, e, n) { var r = !0, i = "width" === e ? t.offsetWidth : t.offsetHeight, o = jt(t), s = "border-box" === k.css(t, "boxSizing", !1, o); if (i <= 0 || null == i) { if (((i = Dt(t, e, o)) < 0 || null == i) && (i = t.style[e]), It.test(i)) return i; r = s && (m.boxSizingReliable() || i === t.style[e]), i = parseFloat(i) || 0 } return i + zt(t, e, n || (s ? "border" : "content"), r, o) + "px" } function Gt(t, e) { for (var n, r, i, o = [], s = 0, a = t.length; s < a; s++)(r = t[s]).style && (o[s] = W.get(r, "olddisplay"), n = r.style.display, e ? (o[s] || "none" !== n || (r.style.display = ""), "" === r.style.display && q(r) && (o[s] = W.access(r, "olddisplay", _t(r.nodeName)))) : (i = q(r), "none" === n && i || W.set(r, "olddisplay", i ? n : k.css(r, "display")))); for (s = 0; s < a; s++)(r = t[s]).style && (e && "none" !== r.style.display && "" !== r.style.display || (r.style.display = e ? o[s] || "" : "none")); return t } function Vt(t, e, n, r, i) { return new Vt.prototype.init(t, e, n, r, i) } k.extend({ cssHooks: { opacity: { get: function (t, e) { if (e) { t = Dt(t, "opacity"); return "" === t ? "1" : t } } } }, cssNumber: { animationIterationCount: !0, columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: { float: "cssFloat" }, style: function (t, e, n, r) { if (t && 3 !== t.nodeType && 8 !== t.nodeType && t.style) { var i, o, s, a = k.camelCase(e), u = t.style; return e = k.cssProps[a] || (k.cssProps[a] = Bt(a) || a), s = k.cssHooks[e] || k.cssHooks[a], void 0 === n ? s && "get" in s && void 0 !== (i = s.get(t, !1, r)) ? i : u[e] : ("string" === (o = typeof n) && (i = z.exec(n)) && i[1] && (n = G(t, e, i), o = "number"), void (null != n && n == n && ("number" === o && (n += i && i[3] || (k.cssNumber[a] ? "" : "px")), m.clearCloneStyle || "" !== n || 0 !== e.indexOf("background") || (u[e] = "inherit"), s && "set" in s && void 0 === (n = s.set(t, n, r)) || (u[e] = n)))) } }, css: function (t, e, n, r) { var i, o = k.camelCase(e); return e = k.cssProps[o] || (k.cssProps[o] = Bt(o) || o), (o = k.cssHooks[e] || k.cssHooks[o]) && "get" in o && (i = o.get(t, !0, n)), void 0 === i && (i = Dt(t, e, r)), "normal" === i && e in Lt && (i = Lt[e]), "" === n || n ? (e = parseFloat(i), !0 === n || isFinite(e) ? e || 0 : i) : i } }), k.each(["height", "width"], function (t, o) { k.cssHooks[o] = { get: function (t, e, n) { return e ? Mt.test(k.css(t, "display")) && 0 === t.offsetWidth ? xt(t, Wt, function () { return Ut(t, o, n) }) : Ut(t, o, n) : void 0 }, set: function (t, e, n) { var r, i = n && jt(t), i = n && zt(t, o, n, "border-box" === k.css(t, "boxSizing", !1, i), i); return i && (r = z.exec(e)) && "px" !== (r[3] || "px") && (t.style[o] = e, e = k.css(t, o)), qt(0, e, i) } } }), k.cssHooks.marginLeft = Rt(m.reliableMarginLeft, function (t, e) { return e ? (parseFloat(Dt(t, "marginLeft")) || t.getBoundingClientRect().left - xt(t, { marginLeft: 0 }, function () { return t.getBoundingClientRect().left })) + "px" : void 0 }), k.cssHooks.marginRight = Rt(m.reliableMarginRight, function (t, e) { return e ? xt(t, { display: "inline-block" }, Dt, [t, "marginRight"]) : void 0 }), k.each({ margin: "", padding: "", border: "Width" }, function (i, o) { k.cssHooks[i + o] = { expand: function (t) { for (var e = 0, n = {}, r = "string" == typeof t ? t.split(" ") : [t]; e < 4; e++)n[i + U[e] + o] = r[e] || r[e - 2] || r[0]; return n } }, At.test(i) || (k.cssHooks[i + o].set = qt) }), k.fn.extend({ css: function (t, e) { return R(this, function (t, e, n) { var r, i, o = {}, s = 0; if (k.isArray(e)) { for (r = jt(t), i = e.length; s < i; s++)o[e[s]] = k.css(t, e[s], !1, r); return o } return void 0 !== n ? k.style(t, e, n) : k.css(t, e) }, t, e, 1 < arguments.length) }, show: function () { return Gt(this, !0) }, hide: function () { return Gt(this) }, toggle: function (t) { return "boolean" == typeof t ? t ? this.show() : this.hide() : this.each(function () { q(this) ? k(this).show() : k(this).hide() }) } }), (k.Tween = Vt).prototype = { constructor: Vt, init: function (t, e, n, r, i, o) { this.elem = t, this.prop = n, this.easing = i || k.easing._default, this.options = e, this.start = this.now = this.cur(), this.end = r, this.unit = o || (k.cssNumber[n] ? "" : "px") }, cur: function () { var t = Vt.propHooks[this.prop]; return (t && t.get ? t : Vt.propHooks._default).get(this) }, run: function (t) { var e, n = Vt.propHooks[this.prop]; return this.options.duration ? this.pos = e = k.easing[this.easing](t, this.options.duration * t, 0, 1, this.options.duration) : this.pos = e = t, this.now = (this.end - this.start) * e + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), (n && n.set ? n : Vt.propHooks._default).set(this), this } }, Vt.prototype.init.prototype = Vt.prototype, Vt.propHooks = { _default: { get: function (t) { return 1 !== t.elem.nodeType || null != t.elem[t.prop] && null == t.elem.style[t.prop] ? t.elem[t.prop] : (t = k.css(t.elem, t.prop, "")) && "auto" !== t ? t : 0 }, set: function (t) { k.fx.step[t.prop] ? k.fx.step[t.prop](t) : 1 !== t.elem.nodeType || null == t.elem.style[k.cssProps[t.prop]] && !k.cssHooks[t.prop] ? t.elem[t.prop] = t.now : k.style(t.elem, t.prop, t.now + t.unit) } } }, Vt.propHooks.scrollTop = Vt.propHooks.scrollLeft = { set: function (t) { t.elem.nodeType && t.elem.parentNode && (t.elem[t.prop] = t.now) } }, k.easing = { linear: function (t) { return t }, swing: function (t) { return .5 - Math.cos(t * Math.PI) / 2 }, _default: "swing" }, k.fx = Vt.prototype.init, k.fx.step = {}; var $t, Xt, Yt = /^(?:toggle|show|hide)$/, Kt = /queueHooks$/; function Qt() { return x.setTimeout(function () { $t = void 0 }), $t = k.now() } function Jt(t, e) { var n, r = 0, i = { height: t }; for (e = e ? 1 : 0; r < 4; r += 2 - e)i["margin" + (n = U[r])] = i["padding" + n] = t; return e && (i.opacity = i.width = t), i } function Zt(t, e, n) { for (var r, i = (te.tweeners[e] || []).concat(te.tweeners["*"]), o = 0, s = i.length; o < s; o++)if (r = i[o].call(n, e, t)) return r } function te(i, t, e) { var n, o, r = 0, s = te.prefilters.length, a = k.Deferred().always(function () { delete u.elem }), u = function () { if (o) return !1; for (var t = $t || Qt(), t = Math.max(0, c.startTime + c.duration - t), e = 1 - (t / c.duration || 0), n = 0, r = c.tweens.length; n < r; n++)c.tweens[n].run(e); return a.notifyWith(i, [c, e, t]), e < 1 && r ? t : (a.resolveWith(i, [c]), !1) }, c = a.promise({ elem: i, props: k.extend({}, t), opts: k.extend(!0, { specialEasing: {}, easing: k.easing._default }, e), originalProperties: t, originalOptions: e, startTime: $t || Qt(), duration: e.duration, tweens: [], createTween: function (t, e) { t = k.Tween(i, c.opts, t, e, c.opts.specialEasing[t] || c.opts.easing); return c.tweens.push(t), t }, stop: function (t) { var e = 0, n = t ? c.tweens.length : 0; if (o) return this; for (o = !0; e < n; e++)c.tweens[e].run(1); return t ? (a.notifyWith(i, [c, 1, 0]), a.resolveWith(i, [c, t])) : a.rejectWith(i, [c, t]), this } }), l = c.props; for (function (t, e) { var n, r, i, o, s; for (n in t) if (r = k.camelCase(n), i = e[r], o = t[n], k.isArray(o) && (i = o[1], o = t[n] = o[0]), n !== r && (t[r] = o, delete t[n]), s = k.cssHooks[r], s && "expand" in s) for (n in o = s.expand(o), delete t[r], o) n in t || (t[n] = o[n], e[n] = i); else e[r] = i }(l, c.opts.specialEasing); r < s; r++)if (n = te.prefilters[r].call(c, i, l, c.opts)) return k.isFunction(n.stop) && (k._queueHooks(c.elem, c.opts.queue).stop = k.proxy(n.stop, n)), n; return k.map(l, Zt, c), k.isFunction(c.opts.start) && c.opts.start.call(i, c), k.fx.timer(k.extend(u, { elem: i, anim: c, queue: c.opts.queue })), c.progress(c.opts.progress).done(c.opts.done, c.opts.complete).fail(c.opts.fail).always(c.opts.always) } k.Animation = k.extend(te, { tweeners: { "*": [function (t, e) { var n = this.createTween(t, e); return G(n.elem, t, z.exec(e), n), n }] }, tweener: function (t, e) { for (var n, r = 0, i = (t = k.isFunction(t) ? (e = t, ["*"]) : t.match(P)).length; r < i; r++)n = t[r], te.tweeners[n] = te.tweeners[n] || [], te.tweeners[n].unshift(e) }, prefilters: [function (e, t, n) { var r, i, o, s, a, u, c, l = this, h = {}, f = e.style, p = e.nodeType && q(e), d = W.get(e, "fxshow"); for (r in n.queue || (null == (a = k._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, u = a.empty.fire, a.empty.fire = function () { a.unqueued || u() }), a.unqueued++, l.always(function () { l.always(function () { a.unqueued--, k.queue(e, "fx").length || a.empty.fire() }) })), 1 === e.nodeType && ("height" in t || "width" in t) && (n.overflow = [f.overflow, f.overflowX, f.overflowY], "inline" === ("none" === (c = k.css(e, "display")) ? W.get(e, "olddisplay") || _t(e.nodeName) : c) && "none" === k.css(e, "float") && (f.display = "inline-block")), n.overflow && (f.overflow = "hidden", l.always(function () { f.overflow = n.overflow[0], f.overflowX = n.overflow[1], f.overflowY = n.overflow[2] })), t) if (i = t[r], Yt.exec(i)) { if (delete t[r], o = o || "toggle" === i, i === (p ? "hide" : "show")) { if ("show" !== i || !d || void 0 === d[r]) continue; p = !0 } h[r] = d && d[r] || k.style(e, r) } else c = void 0; if (k.isEmptyObject(h)) "inline" === ("none" === c ? _t(e.nodeName) : c) && (f.display = c); else for (r in d ? "hidden" in d && (p = d.hidden) : d = W.access(e, "fxshow", {}), o && (d.hidden = !p), p ? k(e).show() : l.done(function () { k(e).hide() }), l.done(function () { for (var t in W.remove(e, "fxshow"), h) k.style(e, t, h[t]) }), h) s = Zt(p ? d[r] : 0, r, l), r in d || (d[r] = s.start, p && (s.end = s.start, s.start = "width" === r || "height" === r ? 1 : 0)) }], prefilter: function (t, e) { e ? te.prefilters.unshift(t) : te.prefilters.push(t) } }), k.speed = function (t, e, n) { var r = t && "object" == typeof t ? k.extend({}, t) : { complete: n || !n && e || k.isFunction(t) && t, duration: t, easing: n && e || e && !k.isFunction(e) && e }; return r.duration = k.fx.off ? 0 : "number" == typeof r.duration ? r.duration : r.duration in k.fx.speeds ? k.fx.speeds[r.duration] : k.fx.speeds._default, null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { k.isFunction(r.old) && r.old.call(this), r.queue && k.dequeue(this, r.queue) }, r }, k.fn.extend({ fadeTo: function (t, e, n, r) { return this.filter(q).css("opacity", 0).show().end().animate({ opacity: e }, t, n, r) }, animate: function (e, t, n, r) { var i = k.isEmptyObject(e), o = k.speed(t, n, r), r = function () { var t = te(this, k.extend({}, e), o); (i || W.get(this, "finish")) && t.stop(!0) }; return r.finish = r, i || !1 === o.queue ? this.each(r) : this.queue(o.queue, r) }, stop: function (i, t, o) { function s(t) { var e = t.stop; delete t.stop, e(o) } return "string" != typeof i && (o = t, t = i, i = void 0), t && !1 !== i && this.queue(i || "fx", []), this.each(function () { var t = !0, e = null != i && i + "queueHooks", n = k.timers, r = W.get(this); if (e) r[e] && r[e].stop && s(r[e]); else for (e in r) r[e] && r[e].stop && Kt.test(e) && s(r[e]); for (e = n.length; e--;)n[e].elem !== this || null != i && n[e].queue !== i || (n[e].anim.stop(o), t = !1, n.splice(e, 1)); !t && o || k.dequeue(this, i) }) }, finish: function (s) { return !1 !== s && (s = s || "fx"), this.each(function () { var t, e = W.get(this), n = e[s + "queue"], r = e[s + "queueHooks"], i = k.timers, o = n ? n.length : 0; for (e.finish = !0, k.queue(this, s, []), r && r.stop && r.stop.call(this, !0), t = i.length; t--;)i[t].elem === this && i[t].queue === s && (i[t].anim.stop(!0), i.splice(t, 1)); for (t = 0; t < o; t++)n[t] && n[t].finish && n[t].finish.call(this); delete e.finish }) } }), k.each(["toggle", "show", "hide"], function (t, r) { var i = k.fn[r]; k.fn[r] = function (t, e, n) { return null == t || "boolean" == typeof t ? i.apply(this, arguments) : this.animate(Jt(r, !0), t, e, n) } }), k.each({ slideDown: Jt("show"), slideUp: Jt("hide"), slideToggle: Jt("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (t, r) { k.fn[t] = function (t, e, n) { return this.animate(r, t, e, n) } }), k.timers = [], k.fx.tick = function () { var t, e = 0, n = k.timers; for ($t = k.now(); e < n.length; e++)(t = n[e])() || n[e] !== t || n.splice(e--, 1); n.length || k.fx.stop(), $t = void 0 }, k.fx.timer = function (t) { k.timers.push(t), t() ? k.fx.start() : k.timers.pop() }, k.fx.interval = 13, k.fx.start = function () { Xt = Xt || x.setInterval(k.fx.tick, k.fx.interval) }, k.fx.stop = function () { x.clearInterval(Xt), Xt = null }, k.fx.speeds = { slow: 600, fast: 200, _default: 400 }, k.fn.delay = function (r, t) { return r = k.fx && k.fx.speeds[r] || r, t = t || "fx", this.queue(t, function (t, e) { var n = x.setTimeout(t, r); e.stop = function () { x.clearTimeout(n) } }) }, p = C.createElement("input"), n = C.createElement("select"), s = n.appendChild(C.createElement("option")), p.type = "checkbox", m.checkOn = "" !== p.value, m.optSelected = s.selected, n.disabled = !0, m.optDisabled = !s.disabled, (p = C.createElement("input")).value = "t", p.type = "radio", m.radioValue = "t" === p.value; var ee, ne = k.expr.attrHandle; k.fn.extend({ attr: function (t, e) { return R(this, k.attr, t, e, 1 < arguments.length) }, removeAttr: function (t) { return this.each(function () { k.removeAttr(this, t) }) } }), k.extend({ attr: function (t, e, n) { var r, i, o = t.nodeType; if (3 !== o && 8 !== o && 2 !== o) return void 0 === t.getAttribute ? k.prop(t, e, n) : (1 === o && k.isXMLDoc(t) || (e = e.toLowerCase(), i = k.attrHooks[e] || (k.expr.match.bool.test(e) ? ee : void 0)), void 0 !== n ? null === n ? void k.removeAttr(t, e) : i && "set" in i && void 0 !== (r = i.set(t, n, e)) ? r : (t.setAttribute(e, n + ""), n) : i && "get" in i && null !== (r = i.get(t, e)) ? r : null == (r = k.find.attr(t, e)) ? void 0 : r) }, attrHooks: { type: { set: function (t, e) { if (!m.radioValue && "radio" === e && k.nodeName(t, "input")) { var n = t.value; return t.setAttribute("type", e), n && (t.value = n), e } } } }, removeAttr: function (t, e) { var n, r, i = 0, o = e && e.match(P); if (o && 1 === t.nodeType) for (; n = o[i++];)r = k.propFix[n] || n, k.expr.match.bool.test(n) && (t[r] = !1), t.removeAttribute(n) } }), ee = { set: function (t, e, n) { return !1 === e ? k.removeAttr(t, n) : t.setAttribute(n, n), n } }, k.each(k.expr.match.bool.source.match(/\w+/g), function (t, e) { var o = ne[e] || k.find.attr; ne[e] = function (t, e, n) { var r, i; return n || (i = ne[e], ne[e] = r, r = null != o(t, e, n) ? e.toLowerCase() : null, ne[e] = i), r } }); var re = /^(?:input|select|textarea|button)$/i, ie = /^(?:a|area)$/i; k.fn.extend({ prop: function (t, e) { return R(this, k.prop, t, e, 1 < arguments.length) }, removeProp: function (t) { return this.each(function () { delete this[k.propFix[t] || t] }) } }), k.extend({ prop: function (t, e, n) { var r, i, o = t.nodeType; if (3 !== o && 8 !== o && 2 !== o) return 1 === o && k.isXMLDoc(t) || (e = k.propFix[e] || e, i = k.propHooks[e]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(t, n, e)) ? r : t[e] = n : i && "get" in i && null !== (r = i.get(t, e)) ? r : t[e] }, propHooks: { tabIndex: { get: function (t) { var e = k.find.attr(t, "tabindex"); return e ? parseInt(e, 10) : re.test(t.nodeName) || ie.test(t.nodeName) && t.href ? 0 : -1 } } }, propFix: { for: "htmlFor", class: "className" } }), m.optSelected || (k.propHooks.selected = { get: function (t) { t = t.parentNode; return t && t.parentNode && t.parentNode.selectedIndex, null }, set: function (t) { t = t.parentNode; t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) } }), k.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { k.propFix[this.toLowerCase()] = this }); var oe = /[\t\r\n\f]/g; function se(t) { return t.getAttribute && t.getAttribute("class") || "" } k.fn.extend({ addClass: function (e) { var t, n, r, i, o, s, a = 0; if (k.isFunction(e)) return this.each(function (t) { k(this).addClass(e.call(this, t, se(this))) }); if ("string" == typeof e && e) for (t = e.match(P) || []; n = this[a++];)if (s = se(n), r = 1 === n.nodeType && (" " + s + " ").replace(oe, " ")) { for (o = 0; i = t[o++];)r.indexOf(" " + i + " ") < 0 && (r += i + " "); s !== (s = k.trim(r)) && n.setAttribute("class", s) } return this }, removeClass: function (e) { var t, n, r, i, o, s, a = 0; if (k.isFunction(e)) return this.each(function (t) { k(this).removeClass(e.call(this, t, se(this))) }); if (!arguments.length) return this.attr("class", ""); if ("string" == typeof e && e) for (t = e.match(P) || []; n = this[a++];)if (s = se(n), r = 1 === n.nodeType && (" " + s + " ").replace(oe, " ")) { for (o = 0; i = t[o++];)for (; -1 < r.indexOf(" " + i + " ");)r = r.replace(" " + i + " ", " "); s !== (s = k.trim(r)) && n.setAttribute("class", s) } return this }, toggleClass: function (i, e) { var o = typeof i; return "boolean" == typeof e && "string" == o ? e ? this.addClass(i) : this.removeClass(i) : k.isFunction(i) ? this.each(function (t) { k(this).toggleClass(i.call(this, t, se(this), e), e) }) : this.each(function () { var t, e, n, r; if ("string" == o) for (e = 0, n = k(this), r = i.match(P) || []; t = r[e++];)n.hasClass(t) ? n.removeClass(t) : n.addClass(t); else void 0 !== i && "boolean" != o || ((t = se(this)) && W.set(this, "__className__", t), this.setAttribute && this.setAttribute("class", !t && !1 !== i && W.get(this, "__className__") || "")) }) }, hasClass: function (t) { for (var e, n = 0, r = " " + t + " "; e = this[n++];)if (1 === e.nodeType && -1 < (" " + se(e) + " ").replace(oe, " ").indexOf(r)) return !0; return !1 } }); var ae = /\r/g, ue = /[\x20\t\r\n\f]+/g; k.fn.extend({ val: function (e) { var n, t, r, i = this[0]; return arguments.length ? (r = k.isFunction(e), this.each(function (t) { 1 === this.nodeType && (null == (t = r ? e.call(this, t, k(this).val()) : e) ? t = "" : "number" == typeof t ? t += "" : k.isArray(t) && (t = k.map(t, function (t) { return null == t ? "" : t + "" })), (n = k.valHooks[this.type] || k.valHooks[this.nodeName.toLowerCase()]) && "set" in n && void 0 !== n.set(this, t, "value") || (this.value = t)) })) : i ? (n = k.valHooks[i.type] || k.valHooks[i.nodeName.toLowerCase()]) && "get" in n && void 0 !== (t = n.get(i, "value")) ? t : "string" == typeof (t = i.value) ? t.replace(ae, "") : null == t ? "" : t : void 0 } }), k.extend({ valHooks: { option: { get: function (t) { var e = k.find.attr(t, "value"); return null != e ? e : k.trim(k.text(t)).replace(ue, " ") } }, select: { get: function (t) { for (var e, n = t.options, r = t.selectedIndex, i = "select-one" === t.type || r < 0, o = i ? null : [], s = i ? r + 1 : n.length, a = r < 0 ? s : i ? r : 0; a < s; a++)if (((e = n[a]).selected || a === r) && (m.optDisabled ? !e.disabled : null === e.getAttribute("disabled")) && (!e.parentNode.disabled || !k.nodeName(e.parentNode, "optgroup"))) { if (e = k(e).val(), i) return e; o.push(e) } return o }, set: function (t, e) { for (var n, r, i = t.options, o = k.makeArray(e), s = i.length; s--;)((r = i[s]).selected = -1 < k.inArray(k.valHooks.option.get(r), o)) && (n = !0); return n || (t.selectedIndex = -1), o } } } }), k.each(["radio", "checkbox"], function () { k.valHooks[this] = { set: function (t, e) { return k.isArray(e) ? t.checked = -1 < k.inArray(k(t).val(), e) : void 0 } }, m.checkOn || (k.valHooks[this].get = function (t) { return null === t.getAttribute("value") ? "on" : t.value }) }); var ce = /^(?:focusinfocus|focusoutblur)$/; k.extend(k.event, { trigger: function (t, e, n, r) { var i, o, s, a, u, c, l = [n || C], h = d.call(t, "type") ? t.type : t, f = d.call(t, "namespace") ? t.namespace.split(".") : [], p = o = n = n || C; if (3 !== n.nodeType && 8 !== n.nodeType && !ce.test(h + k.event.triggered) && (-1 < h.indexOf(".") && (h = (f = h.split(".")).shift(), f.sort()), a = h.indexOf(":") < 0 && "on" + h, (t = t[k.expando] ? t : new k.Event(h, "object" == typeof t && t)).isTrigger = r ? 2 : 3, t.namespace = f.join("."), t.rnamespace = t.namespace ? new RegExp("(^|\\.)" + f.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, t.result = void 0, t.target || (t.target = n), e = null == e ? [t] : k.makeArray(e, [t]), c = k.event.special[h] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, e))) { if (!r && !c.noBubble && !k.isWindow(n)) { for (s = c.delegateType || h, ce.test(s + h) || (p = p.parentNode); p; p = p.parentNode)l.push(p), o = p; o === (n.ownerDocument || C) && l.push(o.defaultView || o.parentWindow || x) } for (i = 0; (p = l[i++]) && !t.isPropagationStopped();)t.type = 1 < i ? s : c.bindType || h, (u = (W.get(p, "events") || {})[t.type] && W.get(p, "handle")) && u.apply(p, e), (u = a && p[a]) && u.apply && D(p) && (t.result = u.apply(p, e), !1 === t.result && t.preventDefault()); return t.type = h, r || t.isDefaultPrevented() || c._default && !1 !== c._default.apply(l.pop(), e) || !D(n) || a && k.isFunction(n[h]) && !k.isWindow(n) && ((o = n[a]) && (n[a] = null), n[k.event.triggered = h](), k.event.triggered = void 0, o && (n[a] = o)), t.result } }, simulate: function (t, e, n) { t = k.extend(new k.Event, n, { type: t, isSimulated: !0 }); k.event.trigger(t, null, e) } }), k.fn.extend({ trigger: function (t, e) { return this.each(function () { k.event.trigger(t, e, this) }) }, triggerHandler: function (t, e) { var n = this[0]; return n ? k.event.trigger(t, e, n, !0) : void 0 } }), k.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function (t, n) { k.fn[n] = function (t, e) { return 0 < arguments.length ? this.on(n, null, t, e) : this.trigger(n) } }), k.fn.extend({ hover: function (t, e) { return this.mouseenter(t).mouseleave(e || t) } }), m.focusin = "onfocusin" in x, m.focusin || k.each({ focus: "focusin", blur: "focusout" }, function (n, r) { function i(t) { k.event.simulate(r, t.target, k.event.fix(t)) } k.event.special[r] = { setup: function () { var t = this.ownerDocument || this, e = W.access(t, r); e || t.addEventListener(n, i, !0), W.access(t, r, (e || 0) + 1) }, teardown: function () { var t = this.ownerDocument || this, e = W.access(t, r) - 1; e ? W.access(t, r, e) : (t.removeEventListener(n, i, !0), W.remove(t, r)) } } }); var le = x.location, he = k.now(), fe = /\?/; k.parseJSON = function (t) { return JSON.parse(t + "") }, k.parseXML = function (t) { var e; if (!t || "string" != typeof t) return null; try { e = (new x.DOMParser).parseFromString(t, "text/xml") } catch (t) { e = void 0 } return e && !e.getElementsByTagName("parsererror").length || k.error("Invalid XML: " + t), e }; var pe = /#.*$/, de = /([?&])_=[^&]*/, ge = /^(.*?):[ \t]*([^\r\n]*)$/gm, me = /^(?:GET|HEAD)$/, ve = /^\/\//, ye = {}, be = {}, we = "*/".concat("*"), _e = C.createElement("a"); function xe(o) { return function (t, e) { "string" != typeof t && (e = t, t = "*"); var n, r = 0, i = t.toLowerCase().match(P) || []; if (k.isFunction(e)) for (; n = i[r++];)"+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(e)) : (o[n] = o[n] || []).push(e) } } function Ce(e, r, i, o) { var s = {}, a = e === be; function u(t) { var n; return s[t] = !0, k.each(e[t] || [], function (t, e) { e = e(r, i, o); return "string" != typeof e || a || s[e] ? a ? !(n = e) : void 0 : (r.dataTypes.unshift(e), u(e), !1) }), n } return u(r.dataTypes[0]) || !s["*"] && u("*") } function ke(t, e) { var n, r, i = k.ajaxSettings.flatOptions || {}; for (n in e) void 0 !== e[n] && ((i[n] ? t : r = r || {})[n] = e[n]); return r && k.extend(!0, t, r), t } _e.href = le.href, k.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: le.href, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(le.protocol), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": we, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": k.parseJSON, "text xml": k.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (t, e) { return e ? ke(ke(t, k.ajaxSettings), e) : ke(k.ajaxSettings, t) }, ajaxPrefilter: xe(ye), ajaxTransport: xe(be), ajax: function (t, e) { "object" == typeof t && (e = t, t = void 0), e = e || {}; var u, c, l, n, h, r, f, i, p = k.ajaxSetup({}, e), d = p.context || p, g = p.context && (d.nodeType || d.jquery) ? k(d) : k.event, m = k.Deferred(), v = k.Callbacks("once memory"), y = p.statusCode || {}, o = {}, s = {}, b = 0, a = "canceled", w = { readyState: 0, getResponseHeader: function (t) { var e; if (2 === b) { if (!n) for (n = {}; e = ge.exec(l);)n[e[1].toLowerCase()] = e[2]; e = n[t.toLowerCase()] } return null == e ? null : e }, getAllResponseHeaders: function () { return 2 === b ? l : null }, setRequestHeader: function (t, e) { var n = t.toLowerCase(); return b || (t = s[n] = s[n] || t, o[t] = e), this }, overrideMimeType: function (t) { return b || (p.mimeType = t), this }, statusCode: function (t) { if (t) if (b < 2) for (var e in t) y[e] = [y[e], t[e]]; else w.always(t[w.status]); return this }, abort: function (t) { t = t || a; return u && u.abort(t), _(0, t), this } }; if (m.promise(w).complete = v.add, w.success = w.done, w.error = w.fail, p.url = ((t || p.url || le.href) + "").replace(pe, "").replace(ve, le.protocol + "//"), p.type = e.method || e.type || p.method || p.type, p.dataTypes = k.trim(p.dataType || "*").toLowerCase().match(P) || [""], null == p.crossDomain) { r = C.createElement("a"); try { r.href = p.url, r.href = r.href, p.crossDomain = _e.protocol + "//" + _e.host != r.protocol + "//" + r.host } catch (t) { p.crossDomain = !0 } } if (p.data && p.processData && "string" != typeof p.data && (p.data = k.param(p.data, p.traditional)), Ce(ye, p, e, w), 2 === b) return w; for (i in (f = k.event && p.global) && 0 == k.active++ && k.event.trigger("ajaxStart"), p.type = p.type.toUpperCase(), p.hasContent = !me.test(p.type), c = p.url, p.hasContent || (p.data && (c = p.url += (fe.test(c) ? "&" : "?") + p.data, delete p.data), !1 === p.cache && (p.url = de.test(c) ? c.replace(de, "$1_=" + he++) : c + (fe.test(c) ? "&" : "?") + "_=" + he++)), p.ifModified && (k.lastModified[c] && w.setRequestHeader("If-Modified-Since", k.lastModified[c]), k.etag[c] && w.setRequestHeader("If-None-Match", k.etag[c])), (p.data && p.hasContent && !1 !== p.contentType || e.contentType) && w.setRequestHeader("Content-Type", p.contentType), w.setRequestHeader("Accept", p.dataTypes[0] && p.accepts[p.dataTypes[0]] ? p.accepts[p.dataTypes[0]] + ("*" !== p.dataTypes[0] ? ", " + we + "; q=0.01" : "") : p.accepts["*"]), p.headers) w.setRequestHeader(i, p.headers[i]); if (p.beforeSend && (!1 === p.beforeSend.call(d, w, p) || 2 === b)) return w.abort(); for (i in a = "abort", { success: 1, error: 1, complete: 1 }) w[i](p[i]); if (u = Ce(be, p, e, w)) { if (w.readyState = 1, f && g.trigger("ajaxSend", [w, p]), 2 === b) return w; p.async && 0 < p.timeout && (h = x.setTimeout(function () { w.abort("timeout") }, p.timeout)); try { b = 1, u.send(o, _) } catch (t) { if (!(b < 2)) throw t; _(-1, t) } } else _(-1, "No Transport"); function _(t, e, n, r) { var i, o, s, a = e; 2 !== b && (b = 2, h && x.clearTimeout(h), u = void 0, l = r || "", w.readyState = 0 < t ? 4 : 0, r = 200 <= t && t < 300 || 304 === t, n && (s = function (t, e, n) { for (var r, i, o, s, a = t.contents, u = t.dataTypes; "*" === u[0];)u.shift(), void 0 === r && (r = t.mimeType || e.getResponseHeader("Content-Type")); if (r) for (i in a) if (a[i] && a[i].test(r)) { u.unshift(i); break } if (u[0] in n) o = u[0]; else { for (i in n) { if (!u[0] || t.converters[i + " " + u[0]]) { o = i; break } s = s || i } o = o || s } return o ? (o !== u[0] && u.unshift(o), n[o]) : void 0 }(p, w, n)), s = function (t, e, n, r) { var i, o, s, a, u, c = {}, l = t.dataTypes.slice(); if (l[1]) for (s in t.converters) c[s.toLowerCase()] = t.converters[s]; for (o = l.shift(); o;)if (t.responseFields[o] && (n[t.responseFields[o]] = e), !u && r && t.dataFilter && (e = t.dataFilter(e, t.dataType)), u = o, o = l.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { if (!(s = c[u + " " + o] || c["* " + o])) for (i in c) if (a = i.split(" "), a[1] === o && (s = c[u + " " + a[0]] || c["* " + a[0]])) { !0 === s ? s = c[i] : !0 !== c[i] && (o = a[0], l.unshift(a[1])); break } if (!0 !== s) if (s && t.throws) e = s(e); else try { e = s(e) } catch (t) { return { state: "parsererror", error: s ? t : "No conversion from " + u + " to " + o } } } return { state: "success", data: e } }(p, s, w, r), r ? (p.ifModified && ((n = w.getResponseHeader("Last-Modified")) && (k.lastModified[c] = n), (n = w.getResponseHeader("etag")) && (k.etag[c] = n)), 204 === t || "HEAD" === p.type ? a = "nocontent" : 304 === t ? a = "notmodified" : (a = s.state, i = s.data, r = !(o = s.error))) : (o = a, !t && a || (a = "error", t < 0 && (t = 0))), w.status = t, w.statusText = (e || a) + "", r ? m.resolveWith(d, [i, a, w]) : m.rejectWith(d, [w, a, o]), w.statusCode(y), y = void 0, f && g.trigger(r ? "ajaxSuccess" : "ajaxError", [w, p, r ? i : o]), v.fireWith(d, [w, a]), f && (g.trigger("ajaxComplete", [w, p]), --k.active || k.event.trigger("ajaxStop"))) } return w }, getJSON: function (t, e, n) { return k.get(t, e, n, "json") }, getScript: function (t, e) { return k.get(t, void 0, e, "script") } }), k.each(["get", "post"], function (t, i) { k[i] = function (t, e, n, r) { return k.isFunction(e) && (r = r || n, n = e, e = void 0), k.ajax(k.extend({ url: t, type: i, dataType: r, data: e, success: n }, k.isPlainObject(t) && t)) } }), k._evalUrl = function (t) { return k.ajax({ url: t, type: "GET", dataType: "script", async: !1, global: !1, throws: !0 }) }, k.fn.extend({ wrapAll: function (e) { var t; return k.isFunction(e) ? this.each(function (t) { k(this).wrapAll(e.call(this, t)) }) : (this[0] && (t = k(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { for (var t = this; t.firstElementChild;)t = t.firstElementChild; return t }).append(this)), this) }, wrapInner: function (n) { return k.isFunction(n) ? this.each(function (t) { k(this).wrapInner(n.call(this, t)) }) : this.each(function () { var t = k(this), e = t.contents(); e.length ? e.wrapAll(n) : t.append(n) }) }, wrap: function (e) { var n = k.isFunction(e); return this.each(function (t) { k(this).wrapAll(n ? e.call(this, t) : e) }) }, unwrap: function () { return this.parent().each(function () { k.nodeName(this, "body") || k(this).replaceWith(this.childNodes) }).end() } }), k.expr.filters.hidden = function (t) { return !k.expr.filters.visible(t) }, k.expr.filters.visible = function (t) { return 0 < t.offsetWidth || 0 < t.offsetHeight || 0 < t.getClientRects().length }; var Se = /%20/g, Oe = /\[\]$/, Ee = /\r?\n/g, Te = /^(?:submit|button|image|reset|file)$/i, Ae = /^(?:input|select|textarea|keygen)/i; k.param = function (t, e) { function n(t, e) { e = k.isFunction(e) ? e() : null == e ? "" : e, i[i.length] = encodeURIComponent(t) + "=" + encodeURIComponent(e) } var r, i = []; if (void 0 === e && (e = k.ajaxSettings && k.ajaxSettings.traditional), k.isArray(t) || t.jquery && !k.isPlainObject(t)) k.each(t, function () { n(this.name, this.value) }); else for (r in t) !function n(r, t, i, o) { if (k.isArray(t)) k.each(t, function (t, e) { i || Oe.test(r) ? o(r, e) : n(r + "[" + ("object" == typeof e && null != e ? t : "") + "]", e, i, o) }); else if (i || "object" !== k.type(t)) o(r, t); else for (var e in t) n(r + "[" + e + "]", t[e], i, o) }(r, t[r], e, n); return i.join("&").replace(Se, "+") }, k.fn.extend({ serialize: function () { return k.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var t = k.prop(this, "elements"); return t ? k.makeArray(t) : this }).filter(function () { var t = this.type; return this.name && !k(this).is(":disabled") && Ae.test(this.nodeName) && !Te.test(t) && (this.checked || !V.test(t)) }).map(function (t, e) { var n = k(this).val(); return null == n ? null : k.isArray(n) ? k.map(n, function (t) { return { name: e.name, value: t.replace(Ee, "\r\n") } }) : { name: e.name, value: n.replace(Ee, "\r\n") } }).get() } }), k.ajaxSettings.xhr = function () { try { return new x.XMLHttpRequest } catch (t) { } }; var Ie = { 0: 200, 1223: 204 }, je = k.ajaxSettings.xhr(); m.cors = !!je && "withCredentials" in je, m.ajax = je = !!je, k.ajaxTransport(function (i) { var o, s; return m.cors || je && !i.crossDomain ? { send: function (t, e) { var n, r = i.xhr(); if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || t["X-Requested-With"] || (t["X-Requested-With"] = "XMLHttpRequest"), t) r.setRequestHeader(n, t[n]); o = function (t) { return function () { o && (o = s = r.onload = r.onerror = r.onabort = r.onreadystatechange = null, "abort" === t ? r.abort() : "error" === t ? "number" != typeof r.status ? e(0, "error") : e(r.status, r.statusText) : e(Ie[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { binary: r.response } : { text: r.responseText }, r.getAllResponseHeaders())) } }, r.onload = o(), s = r.onerror = o("error"), void 0 !== r.onabort ? r.onabort = s : r.onreadystatechange = function () { 4 === r.readyState && x.setTimeout(function () { o && s() }) }, o = o("abort"); try { r.send(i.hasContent && i.data || null) } catch (t) { if (o) throw t } }, abort: function () { o && o() } } : void 0 }), k.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function (t) { return k.globalEval(t), t } } }), k.ajaxPrefilter("script", function (t) { void 0 === t.cache && (t.cache = !1), t.crossDomain && (t.type = "GET") }), k.ajaxTransport("script", function (n) { var r, i; if (n.crossDomain) return { send: function (t, e) { r = k("<script>").prop({ charset: n.scriptCharset, src: n.url }).on("load error", i = function (t) { r.remove(), i = null, t && e("error" === t.type ? 404 : 200, t.type) }), C.head.appendChild(r[0]) }, abort: function () { i && i() } } }); var Pe = [], Ne = /(=)\?(?=&|$)|\?\?/; k.ajaxSetup({ jsonp: "callback", jsonpCallback: function () { var t = Pe.pop() || k.expando + "_" + he++; return this[t] = !0, t } }), k.ajaxPrefilter("json jsonp", function (t, e, n) { var r, i, o, s = !1 !== t.jsonp && (Ne.test(t.url) ? "url" : "string" == typeof t.data && 0 === (t.contentType || "").indexOf("application/x-www-form-urlencoded") && Ne.test(t.data) && "data"); return s || "jsonp" === t.dataTypes[0] ? (r = t.jsonpCallback = k.isFunction(t.jsonpCallback) ? t.jsonpCallback() : t.jsonpCallback, s ? t[s] = t[s].replace(Ne, "$1" + r) : !1 !== t.jsonp && (t.url += (fe.test(t.url) ? "&" : "?") + t.jsonp + "=" + r), t.converters["script json"] = function () { return o || k.error(r + " was not called"), o[0] }, t.dataTypes[0] = "json", i = x[r], x[r] = function () { o = arguments }, n.always(function () { void 0 === i ? k(x).removeProp(r) : x[r] = i, t[r] && (t.jsonpCallback = e.jsonpCallback, Pe.push(r)), o && k.isFunction(i) && i(o[0]), o = i = void 0 }), "script") : void 0 }), k.parseHTML = function (t, e, n) { if (!t || "string" != typeof t) return null; "boolean" == typeof e && (n = e, e = !1), e = e || C; var r = w.exec(t), n = !n && []; return r ? [e.createElement(r[1])] : (r = Z([t], e, n), n && n.length && k(n).remove(), k.merge([], r.childNodes)) }; var De = k.fn.load; function Re(t) { return k.isWindow(t) ? t : 9 === t.nodeType && t.defaultView } k.fn.load = function (t, e, n) { if ("string" != typeof t && De) return De.apply(this, arguments); var r, i, o, s = this, a = t.indexOf(" "); return -1 < a && (r = k.trim(t.slice(a)), t = t.slice(0, a)), k.isFunction(e) ? (n = e, e = void 0) : e && "object" == typeof e && (i = "POST"), 0 < s.length && k.ajax({ url: t, type: i || "GET", dataType: "html", data: e }).done(function (t) { o = arguments, s.html(r ? k("<div>").append(k.parseHTML(t)).find(r) : t) }).always(n && function (t, e) { s.each(function () { n.apply(this, o || [t.responseText, e, t]) }) }), this }, k.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (t, e) { k.fn[e] = function (t) { return this.on(e, t) } }), k.expr.filters.animated = function (e) { return k.grep(k.timers, function (t) { return e === t.elem }).length }, k.offset = { setOffset: function (t, e, n) { var r, i, o, s, a = k.css(t, "position"), u = k(t), c = {}; "static" === a && (t.style.position = "relative"), o = u.offset(), r = k.css(t, "top"), s = k.css(t, "left"), s = ("absolute" === a || "fixed" === a) && -1 < (r + s).indexOf("auto") ? (i = (a = u.position()).top, a.left) : (i = parseFloat(r) || 0, parseFloat(s) || 0), k.isFunction(e) && (e = e.call(t, n, k.extend({}, o))), null != e.top && (c.top = e.top - o.top + i), null != e.left && (c.left = e.left - o.left + s), "using" in e ? e.using.call(t, c) : u.css(c) } }, k.fn.extend({ offset: function (e) { if (arguments.length) return void 0 === e ? this : this.each(function (t) { k.offset.setOffset(this, e, t) }); var t, n = this[0], r = { top: 0, left: 0 }, i = n && n.ownerDocument; return i ? (t = i.documentElement, k.contains(t, n) ? (r = n.getBoundingClientRect(), i = Re(i), { top: r.top + i.pageYOffset - t.clientTop, left: r.left + i.pageXOffset - t.clientLeft }) : r) : void 0 }, position: function () { if (this[0]) { var t, e, n = this[0], r = { top: 0, left: 0 }; return "fixed" === k.css(n, "position") ? e = n.getBoundingClientRect() : (t = this.offsetParent(), e = this.offset(), k.nodeName(t[0], "html") || (r = t.offset()), r.top += k.css(t[0], "borderTopWidth", !0), r.left += k.css(t[0], "borderLeftWidth", !0)), { top: e.top - r.top - k.css(n, "marginTop", !0), left: e.left - r.left - k.css(n, "marginLeft", !0) } } }, offsetParent: function () { return this.map(function () { for (var t = this.offsetParent; t && "static" === k.css(t, "position");)t = t.offsetParent; return t || Pt }) } }), k.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (e, i) { var o = "pageYOffset" === i; k.fn[e] = function (t) { return R(this, function (t, e, n) { var r = Re(t); return void 0 === n ? r ? r[i] : t[e] : void (r ? r.scrollTo(o ? r.pageXOffset : n, o ? n : r.pageYOffset) : t[e] = n) }, e, t, arguments.length) } }), k.each(["top", "left"], function (t, n) { k.cssHooks[n] = Rt(m.pixelPosition, function (t, e) { return e ? (e = Dt(t, n), It.test(e) ? k(t).position()[n] + "px" : e) : void 0 }) }), k.each({ Height: "height", Width: "width" }, function (o, s) { k.each({ padding: "inner" + o, content: s, "": "outer" + o }, function (r, t) { k.fn[t] = function (t, e) { var n = arguments.length && (r || "boolean" != typeof t), i = r || (!0 === t || !0 === e ? "margin" : "border"); return R(this, function (t, e, n) { var r; return k.isWindow(t) ? t.document.documentElement["client" + o] : 9 === t.nodeType ? (r = t.documentElement, Math.max(t.body["scroll" + o], r["scroll" + o], t.body["offset" + o], r["offset" + o], r["client" + o])) : void 0 === n ? k.css(t, e, i) : k.style(t, e, n, i) }, s, n ? t : void 0, n, null) } }) }), k.fn.extend({ bind: function (t, e, n) { return this.on(t, null, e, n) }, unbind: function (t, e) { return this.off(t, null, e) }, delegate: function (t, e, n, r) { return this.on(e, t, n, r) }, undelegate: function (t, e, n) { return 1 === arguments.length ? this.off(t, "**") : this.off(e, t || "**", n) }, size: function () { return this.length } }), k.fn.andSelf = k.fn.addBack, "function" == typeof define && define.amd && define("jquery", [], function () { return k }); var Me = x.jQuery, We = x.$; return k.noConflict = function (t) { return x.$ === k && (x.$ = We), t && x.jQuery === k && (x.jQuery = Me), k }, t || (x.jQuery = x.$ = k), k }), function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.clipboard = e() : t.clipboard = e() }(this, function () { return i = {}, r.m = n = [function (t, e, n) { "use strict"; function o(t) { var e = new v, t = function (n, t, r) { f("listener called"), n.success = !0, t.forEach(function (t, e) { r.clipboardData.setData(e, t), e === g && r.clipboardData.getData(e) != t && (f("setting text/plain failed"), n.success = !1) }), r.preventDefault() }.bind(this, e, t); document.addEventListener("copy", t); try { document.execCommand("copy") } finally { document.removeEventListener("copy", t) } return e.success } function s(t, e) { a(t); e = o(e); return u(), e } function a(t) { var e = document.getSelection(), n = document.createRange(); n.selectNodeContents(t), e.removeAllRanges(), e.addRange(n) } function u() { document.getSelection().removeAllRanges() } function c() { return "undefined" == typeof ClipboardEvent && void 0 !== window.clipboardData && void 0 !== window.clipboardData.setData } function r() { return new h(function (t, e) { var n = window.clipboardData.getData("Text"); "" === n ? e(new Error("Empty clipboard or could not read plain text from clipboard")) : t(n) }) } Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(1), l = n(5), h = "undefined" == typeof Promise ? i.Promise : Promise, f = function (t) { }, p = !0, d = function () { (console.warn || console.log).call(arguments) }.bind(console, "[clipboard-polyfill]"), g = "text/plain", i = (m.setDebugLog = function (t) { f = t }, m.suppressWarnings = function () { p = !1, l.suppressDTWarnings() }, m.write = function (i) { return p && !i.getData(g) && d("clipboard.write() was called without a `text/plain` data type. On some platforms, this may result in an empty clipboard. Call clipboard.suppressWarnings() to suppress this warning."), new h(function (t, e) { if (c()) (function (t) { if (void 0 !== (t = t.getData(g))) return window.clipboardData.setData("Text", t); throw "No `text/plain` value was specified." })(i) ? t() : e(new Error("Copying failed, possibly because the user rejected it.")); else { if (o(i)) return f("regular execCopy worked"), void t(); if (-1 < navigator.userAgent.indexOf("Edge")) return f('UA "Edge" => assuming success'), void t(); if (s(document.body, i)) return f("copyUsingTempSelection worked"), void t(); if (r = i, (n = document.createElement("div")).setAttribute("style", "-webkit-user-select: text !important"), n.textContent = "temporary element", document.body.appendChild(n), r = s(n, r), document.body.removeChild(n), r) return f("copyUsingTempElem worked"), void t(); var n, r = i.getData(g); if (void 0 !== r && function (t) { f("copyTextUsingDOM"); var e = document.createElement("div"); e.setAttribute("style", "-webkit-user-select: text !important"); var n = e; e.attachShadow && (f("Using shadow DOM."), n = e.attachShadow({ mode: "open" })); var r = document.createElement("span"); return r.innerText = t, n.appendChild(r), document.body.appendChild(e), a(r), r = document.execCommand("copy"), u(), document.body.removeChild(e), r }(r)) return f("copyTextUsingDOM worked"), void t(); e(new Error("Copy command failed.")) } }) }, m.writeText = function (t) { if (navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(t); var e = new l.DT; return e.setData(g, t), this.write(e) }, m.read = function () { return new h(function (n, t) { c() ? r().then(function (t) { return n((e = t, (t = new l.DT).setData(g, e), t)); var e }, t) : t("Read is not supported in your browser.") }) }, m.readText = function () { return navigator.clipboard && navigator.clipboard.readText ? navigator.clipboard.readText() : c() ? r() : new h(function (t, e) { e("Read is not supported in your browser.") }) }, m.DT = l.DT, m); function m() { } e.default = i; var v = function () { this.success = !1 }; t.exports = i }, function (t, e, st) { (function (it, ot) { t.exports = function () { "use strict"; function n(t) { var e = typeof t; return null !== t && ("object" === e || "function" === e) } function c(t) { return "function" == typeof t } function t(t) { q = t } function e(t) { z = t } function r() { return void 0 !== B ? function () { B(o) } : i() } function i() { var t = setTimeout; return function () { return t(o, 1) } } function o() { for (var t = 0; t < H; t += 2)(0, Y[t])(Y[t + 1]), Y[t] = void 0, Y[t + 1] = void 0; H = 0 } function s(t, e) { var n = arguments, r = this, i = new this.constructor(u); void 0 === i[Q] && T(i); var o = r._state; return o ? function () { var t = n[o - 1]; z(function () { return S(o, i, t, r._result) }) }() : _(r, i, t, e), i } function a(t) { var e = this; if (t && "object" == typeof t && t.constructor === e) return t; var n = new e(u); return v(n, t), n } function u() { } function l() { return new TypeError("You cannot resolve a promise with itself") } function h() { return new TypeError("A promises callback cannot return that same promise.") } function f(t) { try { return t.then } catch (t) { return et.error = t, et } } function p(t, e, n, r) { try { t.call(e, n, r) } catch (t) { return t } } function d(t, r, i) { z(function (e) { var n = !1, t = p(i, r, function (t) { n || (n = !0, r !== t ? v(e, t) : b(e, t)) }, function (t) { n || (n = !0, w(e, t)) }, "Settle: " + (e._label || " unknown promise")); !n && t && (n = !0, w(e, t)) }, t) } function g(e, t) { t._state === Z ? b(e, t._result) : t._state === tt ? w(e, t._result) : _(t, void 0, function (t) { return v(e, t) }, function (t) { return w(e, t) }) } function m(t, e, n) { e.constructor === t.constructor && n === s && e.constructor.resolve === a ? g(t, e) : n === et ? (w(t, et.error), et.error = null) : void 0 === n ? b(t, e) : c(n) ? d(t, e, n) : b(t, e) } function v(t, e) { t === e ? w(t, l()) : n(e) ? m(t, e, f(e)) : b(t, e) } function y(t) { t._onerror && t._onerror(t._result), x(t) } function b(t, e) { t._state === J && (t._result = e, t._state = Z, 0 !== t._subscribers.length && z(x, t)) } function w(t, e) { t._state === J && (t._state = tt, t._result = e, z(y, t)) } function _(t, e, n, r) { var i = t._subscribers, o = i.length; t._onerror = null, i[o] = e, i[o + Z] = n, i[o + tt] = r, 0 === o && t._state && z(x, t) } function x(t) { var e = t._subscribers, n = t._state; if (0 !== e.length) { for (var r = void 0, i = void 0, o = t._result, s = 0; s < e.length; s += 3)r = e[s], i = e[s + n], r ? S(n, r, i, o) : i(o); t._subscribers.length = 0 } } function C() { this.error = null } function k(t, e) { try { return t(e) } catch (t) { return nt.error = t, nt } } function S(t, e, n, r) { var i = c(n), o = void 0, s = void 0, a = void 0, u = void 0; if (i) { if (o = k(n, r), o === nt ? (u = !0, s = o.error, o.error = null) : a = !0, e === o) return void w(e, h()) } else o = r, a = !0; e._state !== J || (i && a ? v(e, o) : u ? w(e, s) : t === Z ? b(e, o) : t === tt && w(e, o)) } function O(e, t) { try { t(function (t) { v(e, t) }, function (t) { w(e, t) }) } catch (t) { w(e, t) } } function E() { return rt++ } function T(t) { t[Q] = rt++, t._state = void 0, t._result = void 0, t._subscribers = [] } function A(t, e) { this._instanceConstructor = t, this.promise = new t(u), this.promise[Q] || T(this.promise), F(e) ? (this.length = e.length, this._remaining = e.length, this._result = new Array(this.length), 0 === this.length ? b(this.promise, this._result) : (this.length = this.length || 0, this._enumerate(e), 0 === this._remaining && b(this.promise, this._result))) : w(this.promise, I()) } function I() { return new Error("Array Methods must be provided an Array") } function j(t) { return new A(this, t).promise } function P(i) { var o = this; return new o(F(i) ? function (t, e) { for (var n = i.length, r = 0; r < n; r++)o.resolve(i[r]).then(t, e) } : function (t, e) { return e(new TypeError("You must pass an array to race.")) }) } function N(t) { var e = this, n = new e(u); return w(n, t), n } function D() { throw new TypeError("You must pass a resolver function as the first argument to the promise constructor") } function R() { throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.") } function M(t) { this[Q] = E(), this._result = this._state = void 0, this._subscribers = [], u !== t && ("function" != typeof t && D(), this instanceof M ? O(this, t) : R()) } function W() { var t = void 0; if (void 0 !== ot) t = ot; 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 n = null; try { n = Object.prototype.toString.call(e.resolve()) } catch (t) { } if ("[object Promise]" === n && !e.cast) return } t.Promise = M } var L = void 0, F = L = Array.isArray ? Array.isArray : function (t) { return "[object Array]" === Object.prototype.toString.call(t) }, H = 0, B = void 0, q = void 0, z = function (t, e) { Y[H] = t, Y[H + 1] = e, 2 === (H += 2) && (q ? q(o) : K()) }, U = "undefined" != typeof window ? window : void 0, G = U || {}, V = G.MutationObserver || G.WebKitMutationObserver, $ = "undefined" == typeof self && void 0 !== it && "[object process]" === {}.toString.call(it), X = "undefined" != typeof Uint8ClampedArray && "undefined" != typeof importScripts && "undefined" != typeof MessageChannel, Y = new Array(1e3), K = void 0; K = $ ? function () { return function () { return it.nextTick(o) } }() : V ? function () { var t = 0, e = new V(o), n = document.createTextNode(""); return e.observe(n, { characterData: !0 }), function () { n.data = t = ++t % 2 } }() : X ? function () { var t = new MessageChannel; return t.port1.onmessage = o, function () { return t.port2.postMessage(0) } }() : void 0 === U ? function () { try { var t = st(4); return B = t.runOnLoop || t.runOnContext, r() } catch (t) { return i() } }() : i(); var Q = Math.random().toString(36).substring(16), J = void 0, Z = 1, tt = 2, et = new C, nt = new C, rt = 0; return A.prototype._enumerate = function (t) { for (var e = 0; this._state === J && e < t.length; e++)this._eachEntry(t[e], e) }, A.prototype._eachEntry = function (e, t) { var n = this._instanceConstructor, r = n.resolve; if (r === a) { var i = f(e); if (i === s && e._state !== J) this._settledAt(e._state, t, e._result); else if ("function" != typeof i) this._remaining--, this._result[t] = e; else if (n === M) { var o = new n(u); m(o, e, i), this._willSettleAt(o, t) } else this._willSettleAt(new n(function (t) { return t(e) }), t) } else this._willSettleAt(r(e), t) }, A.prototype._settledAt = function (t, e, n) { var r = this.promise; r._state === J && (this._remaining--, t === tt ? w(r, n) : this._result[e] = n), 0 === this._remaining && b(r, this._result) }, A.prototype._willSettleAt = function (t, e) { var n = this; _(t, void 0, function (t) { return n._settledAt(Z, e, t) }, function (t) { return n._settledAt(tt, e, t) }) }, M.all = j, M.race = P, M.resolve = a, M.reject = N, M._setScheduler = t, M._setAsap = e, M._asap = z, M.prototype = { constructor: M, then: s, catch: function (t) { return this.then(null, t) } }, M.polyfill = W, M.Promise = M }() }).call(e, st(2), st(3)) }, function (t, e) { function n() { throw new Error("setTimeout has not been defined") } function r() { throw new Error("clearTimeout has not been defined") } function i(e) { if (c === setTimeout) return setTimeout(e, 0); if ((c === n || !c) && setTimeout) return c = setTimeout, setTimeout(e, 0); try { return c(e, 0) } catch (t) { try { return c.call(null, e, 0) } catch (t) { return c.call(this, e, 0) } } } function o() { p && h && (p = !1, h.length ? f = h.concat(f) : d = -1, f.length && s()) } function s() { if (!p) { var t = i(o); p = !0; for (var e = f.length; e;) { for (h = f, f = []; ++d < e;)h && h[d].run(); d = -1, e = f.length } h = null, p = !1, function (e) { if (l === clearTimeout) return clearTimeout(e); if ((l === r || !l) && clearTimeout) return l = clearTimeout, clearTimeout(e); try { l(e) } catch (t) { try { return l.call(null, e) } catch (t) { return l.call(this, e) } } }(t) } } function a(t, e) { this.fun = t, this.array = e } function u() { } var c, l, t = t.exports = {}; !function () { try { c = "function" == typeof setTimeout ? setTimeout : n } catch (t) { c = n } try { l = "function" == typeof clearTimeout ? clearTimeout : r } catch (t) { l = r } }(); var h, f = [], p = !1, d = -1; t.nextTick = function (t) { var e = new Array(arguments.length - 1); if (1 < arguments.length) for (var n = 1; n < arguments.length; n++)e[n - 1] = arguments[n]; f.push(new a(t, e)), 1 !== f.length || p || i(s) }, a.prototype.run = function () { this.fun.apply(null, this.array) }, t.title = "browser", t.browser = !0, t.env = {}, t.argv = [], t.version = "", t.versions = {}, t.on = u, t.addListener = u, t.once = u, t.off = u, t.removeListener = u, t.removeAllListeners = u, t.emit = u, t.prependListener = u, t.prependOnceListener = u, t.listeners = function (t) { return [] }, t.binding = function (t) { throw new Error("process.binding is not supported") }, t.cwd = function () { return "/" }, t.chdir = function (t) { throw new Error("process.chdir is not supported") }, t.umask = function () { return 0 } }, function (t, e) { var n = function () { return this }(); try { n = n || Function("return this")() || (0, eval)("this") } catch (t) { "object" == typeof window && (n = window) } t.exports = n }, function (t, e) { }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = ["text/plain", "text/html"], i = function () { (console.warn || console.log).call(arguments) }.bind(console, "[clipboard-polyfill]"), o = !0; e.suppressDTWarnings = function () { o = !1 }; var s = (a.prototype.setData = function (t, e) { o && -1 === r.indexOf(t) && i("Unknown data type: " + t, "Call clipboard.suppressWarnings() to suppress this warning."), this.m[t] = e }, a.prototype.getData = function (t) { return this.m[t] }, a.prototype.forEach = function (t) { for (var e in this.m) t(this.m[e], e) }, a); function a() { this.m = {} } e.DT = s }], r.c = i, r.d = function (t, e, n) { r.o(t, e) || Object.defineProperty(t, e, { configurable: !1, enumerable: !0, get: n }) }, r.n = function (t) { var e = t && t.__esModule ? function () { return t.default } : function () { return t }; return r.d(e, "a", e), e }, r.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, r.p = "", r(r.s = 0); function r(t) { if (i[t]) return i[t].exports; var e = i[t] = { i: t, l: !1, exports: {} }; return n[t].call(e.exports, e, e.exports, r), e.l = !0, e.exports } var n, i }), function (t) { "use strict"; "function" == typeof define && define.amd ? define(["jquery"], t) : "object" == typeof exports && "object" == typeof module ? module.exports = t(require("jquery")) : t(jQuery) }(function (It, jt) { "use strict"; var t, Pt = { beforeShow: n, move: n, change: n, show: n, hide: n, color: !1, flat: !1, showInput: !1, allowEmpty: !1, showButtons: !0, clickoutFiresChange: !0, showInitial: !1, showPalette: !1, showPaletteOnly: !1, hideAfterPaletteSelect: !1, togglePaletteOnly: !1, showSelectionPalette: !0, localStorageKey: !1, appendTo: "body", maxSelectionSize: 7, cancelText: "cancel", chooseText: "choose", togglePaletteMoreText: "more", togglePaletteLessText: "less", clearText: "Clear Color Selection", noColorSelectedText: "No Color Selected", preferredFormat: !1, className: "", containerClassName: "", replacerClassName: "", showAlpha: !1, theme: "sp-light", palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]], selectionPalette: [], disabled: !1, offset: null }, Nt = [], Dt = !!/msie/i.exec(window.navigator.userAgent), Rt = ((t = document.createElement("div").style).cssText = "background-color:rgba(0,0,0,.5)", e(t.backgroundColor, "rgba") || e(t.backgroundColor, "hsla")), Mt = ["<div class='sp-replacer'>", "<div class='sp-preview'><div class='sp-preview-inner'></div></div>", "<div class='sp-dd'>&#9660;</div>", "</div>"].join(""), Wt = function () { var t = ""; if (Dt) for (var e = 1; e <= 6; e++)t += "<div class='sp-" + e + "'></div>"; return ["<div class='sp-container sp-hidden'>", "<div class='sp-palette-container'>", "<div class='sp-palette sp-thumb sp-cf'></div>", "<div class='sp-palette-button-container sp-cf'>", "<button type='button' class='sp-palette-toggle'></button>", "</div>", "</div>", "<div class='sp-picker-container'>", "<div class='sp-top sp-cf'>", "<div class='sp-fill'></div>", "<div class='sp-top-inner'>", "<div class='sp-color'>", "<div class='sp-sat'>", "<div class='sp-val'>", "<div class='sp-dragger'></div>", "</div>", "</div>", "</div>", "<div class='sp-clear sp-clear-display'>", "</div>", "<div class='sp-hue'>", "<div class='sp-slider'></div>", t, "</div>", "</div>", "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>", "</div>", "<div class='sp-input-container sp-cf'>", "<input class='sp-input formulaInputFocus' type='text' spellcheck='false' />", "</div>", "<div class='sp-initial sp-thumb sp-cf'></div>", "<div class='sp-button-container sp-cf'>", "<a class='sp-cancel' href='#'></a>", "<button type='button' class='sp-choose'></button>", "</div>", "</div>", "</div>"].join("") }(); function e(t, e) { return !!~("" + t).indexOf(e) } function Lt(t, e, n, r) { for (var i = [], o = 0; o < t.length; o++) { var s, a, u, c = t[o]; c ? (a = (s = tinycolor(c)).toHsl().l < .5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light", a += tinycolor.equals(e, c) ? " sp-thumb-active" : "", u = s.toString(r.preferredFormat || "rgb"), c = Rt ? "background-color:" + s.toRgbString() : "filter:" + s.toFilter(), i.push('<span title="' + u + '" data-color="' + s.toRgbString() + '" class="' + a + '"><span class="sp-thumb-inner" style="' + c + ';" /></span>')) : i.push(It("<div />").append(It('<span data-color="" style="background-color:transparent;" class="sp-clear-display"></span>').attr("title", r.noColorSelectedText)).html()) } return "<div class='sp-cf " + n + "'>" + i.join("") + "</div>" } function n() { } function Ft(t) { t.stopPropagation() } function Ht(t, e) { var n = Array.prototype.slice, r = n.call(arguments, 2); return function () { return t.apply(e, r.concat(n.call(arguments))) } } function Bt(r, i, e, t) { i = i || function () { }, e = e || function () { }, t = t || function () { }; var o = document, s = !1, a = {}, u = 0, c = 0, l = "ontouchstart" in window, n = {}; function h(t) { t.stopPropagation && t.stopPropagation(), t.preventDefault && t.preventDefault(), t.returnValue = !1 } function f(t) { if (s) { if (Dt && o.documentMode < 9 && !t.button) return p(); var e = t.originalEvent && t.originalEvent.touches && t.originalEvent.touches[0], n = e && e.pageX || t.pageX, e = e && e.pageY || t.pageY, n = Math.max(0, Math.min(n - a.left, c)), e = Math.max(0, Math.min(e - a.top, u)); l && h(t), i.apply(r, [n, e, t]) } } function p() { s && (It(o).unbind(n), It(o.body).removeClass("sp-dragging"), setTimeout(function () { t.apply(r, arguments) }, 0)), s = !1 } n.selectstart = h, n.dragstart = h, n["touchmove mousemove"] = f, n["touchend mouseup"] = p, It(r).bind("touchstart mousedown", function (t) { (t.which ? 3 == t.which : 2 == t.button) || s || !1 !== e.apply(r, arguments) && (s = !0, u = It(r).height(), c = It(r).width(), a = It(r).offset(), It(o).bind(n), It(o.body).addClass("sp-dragging"), f(t), h(t)) }) } function qt() { return It.fn.spectrum.inputTypeColorSupport() } var o = "spectrum.id"; It.fn.spectrum = function (n, t) { if ("string" != typeof n) return this.spectrum("destroy").each(function () { var t = function (t, e) { var n, r, i, a = (i = t, (e = It.extend({}, Pt, e)).callbacks = { move: Ht(e.move, i), change: Ht(e.change, i), show: Ht(e.show, i), hide: Ht(e.hide, i), beforeShow: Ht(e.beforeShow, i) }, e), u = a.flat, o = a.showSelectionPalette, s = a.localStorageKey, e = a.theme, c = a.callbacks, l = (n = Et, function () { var t = this, e = arguments; r = r || setTimeout(function () { r = null, n.apply(t, e) }, 10) }), h = !10, f = !1, p = 0, d = 0, g = 0, m = 0, v = 0, y = 0, b = 0, w = 0, _ = 0, x = 0, C = 1, k = [], S = [], O = {}, E = a.selectionPalette.slice(0), T = a.maxSelectionSize, A = "sp-dragging", I = null, j = t.ownerDocument, P = (j.body, It(t)), N = !1, D = It(Wt, j).addClass(e), R = D.find(".sp-picker-container"), M = D.find(".sp-color"), W = D.find(".sp-dragger"), L = D.find(".sp-hue"), F = D.find(".sp-slider"), H = D.find(".sp-alpha-inner"), B = D.find(".sp-alpha"), q = D.find(".sp-alpha-handle"), z = D.find(".sp-input"), U = D.find(".sp-palette"), G = D.find(".sp-initial"), V = D.find(".sp-cancel"), $ = D.find(".sp-clear"), X = D.find(".sp-choose"), Y = D.find(".sp-palette-toggle"), K = P.is("input"), t = K && "color" === P.attr("type") && qt(), Q = K && !u, J = Q ? It(Mt).addClass(e).addClass(a.className).addClass(a.replacerClassName) : It([]), Z = Q ? J : P, tt = J.find(".sp-preview-inner"), et = a.color || K && P.val(), nt = !1, rt = a.preferredFormat, it = !a.showButtons || a.clickoutFiresChange, ot = !et, st = a.allowEmpty && !t; function at() { if (a.showPaletteOnly && (a.showPalette = !0), Y.text(a.showPaletteOnly ? a.togglePaletteMoreText : a.togglePaletteLessText), a.palette) { k = a.palette.slice(0), S = It.isArray(k[0]) ? k : [k], O = {}; for (var t = 0; t < S.length; t++)for (var e = 0; e < S[t].length; e++) { var n = tinycolor(S[t][e]).toRgbString(); O[n] = !0 } } D.toggleClass("sp-flat", u), D.toggleClass("sp-input-disabled", !a.showInput), D.toggleClass("sp-alpha-enabled", a.showAlpha), D.toggleClass("sp-clear-enabled", st), D.toggleClass("sp-buttons-disabled", !a.showButtons), D.toggleClass("sp-palette-buttons-disabled", !a.togglePaletteOnly), D.toggleClass("sp-palette-disabled", !a.showPalette), D.toggleClass("sp-palette-only", a.showPaletteOnly), D.toggleClass("sp-initial-disabled", !a.showInitial), D.addClass(a.className).addClass(a.containerClassName), Et() } function ut() { if (s && window.localStorage) { try { var t = window.localStorage[s].split(",#"); 1 < t.length && (delete window.localStorage[s], It.each(t, function (t, e) { ct(e) })) } catch (t) { } try { E = window.localStorage[s].split(";") } catch (t) { } } } function ct(t) { if (o) { var e = tinycolor(t).toRgbString(); if (!O[e] && -1 === It.inArray(e, E)) for (E.push(e); E.length > T;)E.shift(); if (s && window.localStorage) try { window.localStorage[s] = E.join(";") } catch (t) { } } } function lt() { var n = xt(), t = It.map(S, function (t, e) { return Lt(t, n, "sp-palette-row sp-palette-row-" + e, a) }); ut(), E && t.push(Lt(function () { var t = []; if (a.showPalette) for (var e = 0; e < E.length; e++) { var n = tinycolor(E[e]).toRgbString(); O[n] || t.push(E[e]) } return t.reverse().slice(0, a.maxSelectionSize) }(), n, "sp-palette-row sp-palette-row-selection", a)), U.html(t.join("")) } function ht() { var t, e; a.showInitial && (t = nt, e = xt(), G.html(Lt([t, e], e, "sp-palette-row-initial", a))) } function ft() { (d <= 0 || p <= 0 || m <= 0) && Et(), f = !0, D.addClass(A), I = null, P.trigger("dragstart.spectrum", [xt()]) } function pt() { f = !1, D.removeClass(A), P.trigger("dragstop.spectrum", [xt()]) } function dt() { var t = z.val(); null !== t && "" !== t || !st ? (t = tinycolor(t)).isValid() ? (_t(t), Ot(!0)) : z.addClass("sp-validation-error") : (_t(null), Ot(!0)) } function gt() { (h ? bt : mt)() } function mt() { var t = It.Event("beforeShow.spectrum"); h ? Et() : (P.trigger(t, [xt()]), !1 === c.beforeShow(xt()) || t.isDefaultPrevented() || (function () { for (var t = 0; t < Nt.length; t++)Nt[t] && Nt[t].hide() }(), h = !0, It(j).bind("keydown.spectrum", vt), It(j).bind("click.spectrum", yt), It(window).bind("resize.spectrum", l), J.addClass("sp-active"), D.removeClass("sp-hidden"), Et(), kt(), nt = xt(), ht(), c.show(nt), P.trigger("show.spectrum", [nt]))) } function vt(t) { 27 === t.keyCode && bt() } function yt(t) { 2 != t.button && (f || (it ? Ot(!0) : wt(), bt())) } function bt() { h && !u && (h = !1, It(j).unbind("keydown.spectrum", vt), It(j).unbind("click.spectrum", yt), It(window).unbind("resize.spectrum", l), J.removeClass("sp-active"), D.addClass("sp-hidden"), c.hide(xt()), P.trigger("hide.spectrum", [xt()])) } function wt() { _t(nt, !0) } function _t(t, e) { var n; tinycolor.equals(t, xt()) ? kt() : (!t && st ? ot = !0 : (ot = !1, t = (n = tinycolor(t)).toHsv(), w = t.h % 360 / 360, _ = t.s, x = t.v, C = t.a), kt(), n && n.isValid() && !e && (rt = a.preferredFormat || n.getFormat())) } function xt(t) { return t = t || {}, st && ot ? null : tinycolor.fromRatio({ h: w, s: _, v: x, a: Math.round(100 * C) / 100 }, { format: t.format || rt }) } function Ct() { kt(), c.move(xt()), P.trigger("move.spectrum", [xt()]) } function kt() { z.removeClass("sp-validation-error"), St(); var t = tinycolor.fromRatio({ h: w, s: 1, v: 1 }); M.css("background-color", t.toHexString()); var e = rt; C < 1 && (0 !== C || "name" !== e) && ("hex" !== e && "hex3" !== e && "hex6" !== e && "name" !== e || (e = "rgb")); var n, r, i = xt({ format: e }), o = ""; tt.removeClass("sp-clear-display"), tt.css("background-color", "transparent"), !i && st ? tt.addClass("sp-clear-display") : (n = i.toHexString(), r = i.toRgbString(), Rt || 1 === i.alpha ? tt.css("background-color", r) : (tt.css("background-color", "transparent"), tt.css("filter", i.toFilter())), a.showAlpha && ((t = i.toRgb()).a = 0, t = "linear-gradient(left, " + (r = tinycolor(t).toRgbString()) + ", " + n + ")", Dt ? H.css("filter", tinycolor(r).toFilter({ gradientType: 1 }, n)) : (H.css("background", "-webkit-" + t), H.css("background", "-moz-" + t), H.css("background", "-ms-" + t), H.css("background", "linear-gradient(to right, " + r + ", " + n + ")"))), o = i.toString(e)), a.showInput && z.val(o), a.showPalette && lt(), ht() } function St() { var t = _, e = x; st && ot ? (q.hide(), F.hide(), W.hide()) : (q.show(), F.show(), W.show(), t = t * p, e = d - e * d, t = Math.max(-g, Math.min(p - g, t - g)), e = Math.max(-g, Math.min(d - g, e - g)), W.css({ top: e + "px", left: t + "px" }), t = C * v, q.css({ left: t - y / 2 + "px" }), t = w * m, F.css({ top: t - b + "px" })) } function Ot(t) { var e = xt(), n = ""; e && (n = e.toString(rt), ct(e)), K && P.val(n), t && (c.change(e), P.trigger("change", [e])) } function Et() { var t, e, n, r, i, o, s; h && (p = M.width(), d = M.height(), g = W.height(), L.width(), m = L.height(), b = F.height(), v = B.width(), y = q.width(), u || (D.css("position", "absolute"), a.offset ? D.offset(a.offset) : D.offset((s = Z, t = (i = D).outerWidth(), e = i.outerHeight(), n = s.outerHeight(), i = (r = (o = i[0].ownerDocument).documentElement).clientWidth + It(o).scrollLeft(), o = r.clientHeight + It(o).scrollTop(), (s = s.offset()).top += n, s.left -= Math.min(s.left, s.left + t > i && t < i ? Math.abs(s.left + t - i) : 0), s.top -= Math.min(s.top, s.top + e > o && e < o ? Math.abs(+(e + n)) : 0), s))), St(), a.showPalette && lt(), P.trigger("reflow.spectrum")) } function Tt() { bt(), N = !0, P.attr("disabled", !0), Z.addClass("sp-disabled") } !function () { function t(t) { return t.data && t.data.ignore ? (_t(It(t.target).closest(".sp-thumb-el").data("color")), Ct()) : (_t(It(t.target).closest(".sp-thumb-el").data("color")), Ct(), Ot(!0), a.hideAfterPaletteSelect && bt()), !1 } Dt && D.find("*:not(input)").attr("unselectable", "on"), at(), Q && P.after(J).hide(), st || $.hide(), u ? P.after(D).hide() : (1 !== (e = "parent" === a.appendTo ? P.parent() : It(a.appendTo)).length && (e = It("body")), e.append(D)), ut(), Z.bind("click.spectrum touchstart.spectrum", function (t) { N || gt(), t.stopPropagation(), It(t.target).is("input") || t.preventDefault() }), !P.is(":disabled") && !0 !== a.disabled || Tt(), D.click(Ft), z.change(dt), z.bind("paste", function () { setTimeout(dt, 1) }), z.keydown(function (t) { 13 == t.keyCode && dt() }), V.text(a.cancelText), V.bind("click.spectrum", function (t) { t.stopPropagation(), t.preventDefault(), wt(), bt() }), $.attr("title", a.clearText), $.bind("click.spectrum", function (t) { t.stopPropagation(), t.preventDefault(), ot = !0, Ct(), u && Ot(!0) }), X.text(a.chooseText), X.bind("click.spectrum", function (t) { t.stopPropagation(), t.preventDefault(), Dt && z.is(":focus") && z.trigger("change"), z.hasClass("sp-validation-error") || (Ot(!0), bt()) }), Y.text(a.showPaletteOnly ? a.togglePaletteMoreText : a.togglePaletteLessText), Y.bind("click.spectrum", function (t) { t.stopPropagation(), t.preventDefault(), a.showPaletteOnly = !a.showPaletteOnly, a.showPaletteOnly || u || D.css("left", "-=" + (R.outerWidth(!0) + 5)), at() }), Bt(B, function (t, e, n) { C = t / v, ot = !1, n.shiftKey && (C = Math.round(10 * C) / 10), Ct() }, ft, pt), Bt(L, function (t, e) { w = parseFloat(e / m), ot = !1, a.showAlpha || (C = 1), Ct() }, ft, pt), Bt(M, function (t, e, n) { n.shiftKey ? I || (n = _ * p, r = d - x * d, r = Math.abs(t - n) > Math.abs(e - r), I = r ? "x" : "y") : I = null; var r = !I || "y" === I; I && "x" !== I || (_ = parseFloat(t / p)), r && (x = parseFloat((d - e) / d)), ot = !1, a.showAlpha || (C = 1), Ct() }, ft, pt), et ? (_t(et), kt(), rt = a.preferredFormat || tinycolor(et).format, ct(et)) : kt(), u && mt(); var e = Dt ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum"; U.delegate(".sp-thumb-el", e, t), G.delegate(".sp-thumb-el:nth-child(1)", e, { ignore: !0 }, t) }(); var At = { show: mt, hide: bt, toggle: gt, reflow: Et, option: function (t, e) { return t === jt ? It.extend({}, a) : e === jt ? a[t] : (a[t] = e, "preferredFormat" === t && (rt = a.preferredFormat), void at()) }, enable: function () { N = !1, P.attr("disabled", !1), Z.removeClass("sp-disabled") }, disable: Tt, offset: function (t) { a.offset = t, Et() }, set: function (t) { _t(t), Ot() }, get: xt, destroy: function () { P.show(), Z.unbind("click.spectrum touchstart.spectrum"), D.remove(), J.remove(), Nt[At.id] = null }, container: D }; return At.id = Nt.push(At) - 1, At }(this, It.extend({}, n, It(this).data())); It(this).data(o, t.id) }); var r = this, i = Array.prototype.slice.call(arguments, 1); return this.each(function () { var t = Nt[It(this).data(o)]; if (t) { var e = t[n]; if (!e) throw new Error("Spectrum: no such method: '" + n + "'"); "get" == n ? r = t.get() : "container" == n ? r = t.container : "option" == n ? r = t.option.apply(t, i) : "destroy" == n ? (t.destroy(), It(this).removeData(o)) : e.apply(t, i) } }), r }, It.fn.spectrum.load = !0, It.fn.spectrum.loadOpts = {}, It.fn.spectrum.draggable = Bt, It.fn.spectrum.defaults = Pt, It.fn.spectrum.inputTypeColorSupport = function t() { var e; return void 0 === t._cachedResult && (e = It("<input type='color'/>")[0], t._cachedResult = "color" === e.type && "" !== e.value), t._cachedResult }, It.spectrum = {}, It.spectrum.localization = {}, It.spectrum.palettes = {}, It.fn.spectrum.processNativeColorInputs = function () { var t = It("input[type=color]"); t.length && !qt() && t.spectrum({ preferredFormat: "hex6" }) }, function () { var d = /^[\s,#]+/, g = /\s+$/, m = 0, v = Math, y = v.round, b = v.min, w = v.max, t = v.random, _ = function (t, e) { if (e = e || {}, (t = t || "") instanceof _) return t; if (!(this instanceof _)) return new _(t, e); var n, r, i, o, s, a, u, c, l, h, f, l = (c = { r: 0, g: 0, b: 0 }, f = h = !(l = 1), "string" == typeof (n = t) && (n = function (t) { t = t.replace(d, "").replace(g, "").toLowerCase(); var e, n = !1; if (O[t]) t = O[t], n = !0; else if ("transparent" == t) return { r: 0, g: 0, b: 0, a: 0, format: "name" }; return (e = M.rgb.exec(t)) ? { r: e[1], g: e[2], b: e[3] } : (e = M.rgba.exec(t)) ? { r: e[1], g: e[2], b: e[3], a: e[4] } : (e = M.hsl.exec(t)) ? { h: e[1], s: e[2], l: e[3] } : (e = M.hsla.exec(t)) ? { h: e[1], s: e[2], l: e[3], a: e[4] } : (e = M.hsv.exec(t)) ? { h: e[1], s: e[2], v: e[3] } : (e = M.hsva.exec(t)) ? { h: e[1], s: e[2], v: e[3], a: e[4] } : (e = M.hex8.exec(t)) ? { a: j(e[1]) / 255, r: j(e[2]), g: j(e[3]), b: j(e[4]), format: n ? "name" : "hex8" } : (e = M.hex6.exec(t)) ? { r: j(e[1]), g: j(e[2]), b: j(e[3]), format: n ? "name" : "hex" } : !!(e = M.hex3.exec(t)) && { r: j(e[1] + "" + e[1]), g: j(e[2] + "" + e[2]), b: j(e[3] + "" + e[3]), format: n ? "name" : "hex" } }(n)), "object" == typeof n && (n.hasOwnProperty("r") && n.hasOwnProperty("g") && n.hasOwnProperty("b") ? (s = n.r, a = n.g, u = n.b, c = { r: 255 * A(s, 255), g: 255 * A(a, 255), b: 255 * A(u, 255) }, h = !0, f = "%" === String(n.r).substr(-1) ? "prgb" : "rgb") : n.hasOwnProperty("h") && n.hasOwnProperty("s") && n.hasOwnProperty("v") ? (n.s = N(n.s), n.v = N(n.v), c = function (t, e, n) { t = 6 * A(t, 360), e = A(e, 100), n = A(n, 100); var r = v.floor(t), i = t - r, o = n * (1 - e), t = n * (1 - i * e), e = n * (1 - (1 - i) * e), r = r % 6; return { r: 255 * [n, t, o, o, e, n][r], g: 255 * [e, n, n, t, o, o][r], b: 255 * [o, o, e, n, n, t][r] } }(n.h, n.s, n.v), h = !0, f = "hsv") : n.hasOwnProperty("h") && n.hasOwnProperty("s") && n.hasOwnProperty("l") && (n.s = N(n.s), n.l = N(n.l), s = n.h, a = n.s, u = n.l, s = A(s, 360), a = A(a, 100), u = A(u, 100), 0 === a ? r = i = o = u : (r = p(a = 2 * u - (u = u < .5 ? u * (1 + a) : u + a - u * a), u, s + 1 / 3), i = p(a, u, s), o = p(a, u, s - 1 / 3)), c = { r: 255 * r, g: 255 * i, b: 255 * o }, h = !0, f = "hsl"), n.hasOwnProperty("a") && (l = n.a)), l = T(l), { ok: h, format: n.format || f, r: b(255, w(c.r, 0)), g: b(255, w(c.g, 0)), b: b(255, w(c.b, 0)), a: l }); function p(t, e, n) { return n < 0 && (n += 1), 1 < n && --n, n < 1 / 6 ? t + 6 * (e - t) * n : n < .5 ? e : n < 2 / 3 ? t + (e - t) * (2 / 3 - n) * 6 : t } this._originalInput = t, this._r = l.r, this._g = l.g, this._b = l.b, this._a = l.a, this._roundA = y(100 * this._a) / 100, this._format = e.format || l.format, this._gradientType = e.gradientType, this._r < 1 && (this._r = y(this._r)), this._g < 1 && (this._g = y(this._g)), this._b < 1 && (this._b = y(this._b)), this._ok = l.ok, this._tc_id = m++ }; function r(t, e, n) { t = A(t, 255), e = A(e, 255), n = A(n, 255); var r, i = w(t, e, n), o = b(t, e, n), s = (i + o) / 2; if (i == o) r = u = 0; else { var a = i - o, u = .5 < s ? a / (2 - i - o) : a / (i + o); switch (i) { case t: r = (e - n) / a + (e < n ? 6 : 0); break; case e: r = (n - t) / a + 2; break; case n: r = (t - e) / a + 4 }r /= 6 } return { h: r, s: u, l: s } } function i(t, e, n) { t = A(t, 255), e = A(e, 255), n = A(n, 255); var r, i = w(t, e, n), o = b(t, e, n), s = i, a = i - o, u = 0 === i ? 0 : a / i; if (i == o) r = 0; else { switch (i) { case t: r = (e - n) / a + (e < n ? 6 : 0); break; case e: r = (n - t) / a + 2; break; case n: r = (t - e) / a + 4 }r /= 6 } return { h: r, s: u, v: s } } function e(t, e, n, r) { n = [P(y(t).toString(16)), P(y(e).toString(16)), P(y(n).toString(16))]; return r && n[0].charAt(0) == n[0].charAt(1) && n[1].charAt(0) == n[1].charAt(1) && n[2].charAt(0) == n[2].charAt(1) ? n[0].charAt(0) + n[1].charAt(0) + n[2].charAt(0) : n.join("") } function o(t, e, n, r) { return [P(Math.round(255 * parseFloat(r)).toString(16)), P(y(t).toString(16)), P(y(e).toString(16)), P(y(n).toString(16))].join("") } function n(t, e) { e = 0 === e ? 0 : e || 10; t = _(t).toHsl(); return t.s -= e / 100, t.s = I(t.s), _(t) } function s(t, e) { e = 0 === e ? 0 : e || 10; t = _(t).toHsl(); return t.s += e / 100, t.s = I(t.s), _(t) } function a(t) { return _(t).desaturate(100) } function u(t, e) { e = 0 === e ? 0 : e || 10; t = _(t).toHsl(); return t.l += e / 100, t.l = I(t.l), _(t) } function c(t, e) { e = 0 === e ? 0 : e || 10; t = _(t).toRgb(); return t.r = w(0, b(255, t.r - y(-e / 100 * 255))), t.g = w(0, b(255, t.g - y(-e / 100 * 255))), t.b = w(0, b(255, t.b - y(-e / 100 * 255))), _(t) } function l(t, e) { e = 0 === e ? 0 : e || 10; t = _(t).toHsl(); return t.l -= e / 100, t.l = I(t.l), _(t) } function h(t, e) { t = _(t).toHsl(), e = (y(t.h) + e) % 360; return t.h = e < 0 ? 360 + e : e, _(t) } function f(t) { t = _(t).toHsl(); return t.h = (t.h + 180) % 360, _(t) } function p(t) { var e = _(t).toHsl(), n = e.h; return [_(t), _({ h: (n + 120) % 360, s: e.s, l: e.l }), _({ h: (n + 240) % 360, s: e.s, l: e.l })] } function x(t) { var e = _(t).toHsl(), n = e.h; return [_(t), _({ h: (n + 90) % 360, s: e.s, l: e.l }), _({ h: (n + 180) % 360, s: e.s, l: e.l }), _({ h: (n + 270) % 360, s: e.s, l: e.l })] } function C(t) { var e = _(t).toHsl(), n = e.h; return [_(t), _({ h: (n + 72) % 360, s: e.s, l: e.l }), _({ h: (n + 216) % 360, s: e.s, l: e.l })] } function k(t, e, n) { e = e || 6, n = n || 30; var r = _(t).toHsl(), i = 360 / n, o = [_(t)]; for (r.h = (r.h - (i * e >> 1) + 720) % 360; --e;)r.h = (r.h + i) % 360, o.push(_(r)); return o } function S(t, e) { e = e || 6; for (var t = _(t).toHsv(), n = t.h, r = t.s, i = t.v, o = [], s = 1 / e; e--;)o.push(_({ h: n, s: r, v: i })), i = (i + s) % 1; return o } _.prototype = { isDark: function () { return this.getBrightness() < 128 }, isLight: function () { return !this.isDark() }, isValid: function () { return this._ok }, getOriginalInput: function () { return this._originalInput }, getFormat: function () { return this._format }, getAlpha: function () { return this._a }, getBrightness: function () { var t = this.toRgb(); return (299 * t.r + 587 * t.g + 114 * t.b) / 1e3 }, setAlpha: function (t) { return this._a = T(t), this._roundA = y(100 * this._a) / 100, this }, toHsv: function () { var t = i(this._r, this._g, this._b); return { h: 360 * t.h, s: t.s, v: t.v, a: this._a } }, toHsvString: function () { var t = i(this._r, this._g, this._b), e = y(360 * t.h), n = y(100 * t.s), t = y(100 * t.v); return 1 == this._a ? "hsv(" + e + ", " + n + "%, " + t + "%)" : "hsva(" + e + ", " + n + "%, " + t + "%, " + this._roundA + ")" }, toHsl: function () { var t = r(this._r, this._g, this._b); return { h: 360 * t.h, s: t.s, l: t.l, a: this._a } }, toHslString: function () { var t = r(this._r, this._g, this._b), e = y(360 * t.h), n = y(100 * t.s), t = y(100 * t.l); return 1 == this._a ? "hsl(" + e + ", " + n + "%, " + t + "%)" : "hsla(" + e + ", " + n + "%, " + t + "%, " + this._roundA + ")" }, toHex: function (t) { return e(this._r, this._g, this._b, t) }, toHexString: function (t) { return "#" + this.toHex(t) }, toHex8: function () { return o(this._r, this._g, this._b, this._a) }, toHex8String: function () { return "#" + this.toHex8() }, toRgb: function () { return { r: y(this._r), g: y(this._g), b: y(this._b), a: this._a } }, toRgbString: function () { return 1 == this._a ? "rgb(" + y(this._r) + ", " + y(this._g) + ", " + y(this._b) + ")" : "rgba(" + y(this._r) + ", " + y(this._g) + ", " + y(this._b) + ", " + this._roundA + ")" }, toPercentageRgb: function () { return { r: y(100 * A(this._r, 255)) + "%", g: y(100 * A(this._g, 255)) + "%", b: y(100 * A(this._b, 255)) + "%", a: this._a } }, toPercentageRgbString: function () { return 1 == this._a ? "rgb(" + y(100 * A(this._r, 255)) + "%, " + y(100 * A(this._g, 255)) + "%, " + y(100 * A(this._b, 255)) + "%)" : "rgba(" + y(100 * A(this._r, 255)) + "%, " + y(100 * A(this._g, 255)) + "%, " + y(100 * A(this._b, 255)) + "%, " + this._roundA + ")" }, toName: function () { return 0 === this._a ? "transparent" : !(this._a < 1) && (E[e(this._r, this._g, this._b, !0)] || !1) }, toFilter: function (t) { var e = "#" + o(this._r, this._g, this._b, this._a), n = e, r = this._gradientType ? "GradientType = 1, " : ""; return t && (n = _(t).toHex8String()), "progid:DXImageTransform.Microsoft.gradient(" + r + "startColorstr=" + e + ",endColorstr=" + n + ")" }, toString: function (t) { var e = !!t; t = t || this._format; var n = !1, r = this._a < 1 && 0 <= this._a; return e || !r || "hex" !== t && "hex6" !== t && "hex3" !== t && "name" !== t ? ("rgb" === t && (n = this.toRgbString()), "prgb" === t && (n = this.toPercentageRgbString()), "hex" !== t && "hex6" !== t || (n = this.toHexString()), "hex3" === t && (n = this.toHexString(!0)), "hex8" === t && (n = this.toHex8String()), "name" === t && (n = this.toName()), "hsl" === t && (n = this.toHslString()), "hsv" === t && (n = this.toHsvString()), n || this.toHexString()) : "name" === t && 0 === this._a ? this.toName() : this.toRgbString() }, _applyModification: function (t, e) { e = t.apply(null, [this].concat([].slice.call(e))); return this._r = e._r, this._g = e._g, this._b = e._b, this.setAlpha(e._a), this }, lighten: function () { return this._applyModification(u, arguments) }, brighten: function () { return this._applyModification(c, arguments) }, darken: function () { return this._applyModification(l, arguments) }, desaturate: function () { return this._applyModification(n, arguments) }, saturate: function () { return this._applyModification(s, arguments) }, greyscale: function () { return this._applyModification(a, arguments) }, spin: function () { return this._applyModification(h, arguments) }, _applyCombination: function (t, e) { return t.apply(null, [this].concat([].slice.call(e))) }, analogous: function () { return this._applyCombination(k, arguments) }, complement: function () { return this._applyCombination(f, arguments) }, monochromatic: function () { return this._applyCombination(S, arguments) }, splitcomplement: function () { return this._applyCombination(C, arguments) }, triad: function () { return this._applyCombination(p, arguments) }, tetrad: function () { return this._applyCombination(x, arguments) } }, _.fromRatio = function (t, e) { if ("object" == typeof t) { var n, r = {}; for (n in t) t.hasOwnProperty(n) && (r[n] = "a" === n ? t[n] : N(t[n])); t = r } return _(t, e) }, _.equals = function (t, e) { return !(!t || !e) && _(t).toRgbString() == _(e).toRgbString() }, _.random = function () { return _.fromRatio({ r: t(), g: t(), b: t() }) }, _.mix = function (t, e, n) { n = 0 === n ? 0 : n || 50; var r = _(t).toRgb(), i = _(e).toRgb(), t = n / 100, e = 2 * t - 1, n = i.a - r.a, n = 1 - (e = (1 + (e = e * n == -1 ? e : (e + n) / (1 + e * n))) / 2), t = { r: i.r * e + r.r * n, g: i.g * e + r.g * n, b: i.b * e + r.b * n, a: i.a * t + r.a * (1 - t) }; return _(t) }, _.readability = function (t, e) { var n = _(t), r = _(e), t = n.toRgb(), e = r.toRgb(), n = n.getBrightness(), r = r.getBrightness(), e = Math.max(t.r, e.r) - Math.min(t.r, e.r) + Math.max(t.g, e.g) - Math.min(t.g, e.g) + Math.max(t.b, e.b) - Math.min(t.b, e.b); return { brightness: Math.abs(n - r), color: e } }, _.isReadable = function (t, e) { e = _.readability(t, e); return 125 < e.brightness && 500 < e.color }, _.mostReadable = function (t, e) { for (var n = null, r = 0, i = !1, o = 0; o < e.length; o++) { var s = _.readability(t, e[o]), a = 125 < s.brightness && 500 < s.color, s = s.brightness / 125 * 3 + s.color / 500; (a && !i || a && i && r < s || !a && !i && r < s) && (i = a, r = s, n = _(e[o])) } return n }; var O = _.names = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "0ff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000", blanchedalmond: "ffebcd", blue: "00f", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", burntsienna: "ea7e5d", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "0ff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkgrey: "a9a9a9", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkslategrey: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dimgrey: "696969", dodgerblue: "1e90ff", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "f0f", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", grey: "808080", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgray: "d3d3d3", lightgreen: "90ee90", lightgrey: "d3d3d3", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslategray: "789", lightslategrey: "789", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "0f0", limegreen: "32cd32", linen: "faf0e6", magenta: "f0f", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370db", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "db7093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "f00", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", slategrey: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "fff", whitesmoke: "f5f5f5", yellow: "ff0", yellowgreen: "9acd32" }, E = _.hexNames = function (t) { var e, n = {}; for (e in t) t.hasOwnProperty(e) && (n[t[e]] = e); return n }(O); function T(t) { return t = parseFloat(t), (isNaN(t) || t < 0 || 1 < t) && (t = 1), t } function A(t, e) { "string" == typeof (n = t) && -1 != n.indexOf(".") && 1 === parseFloat(n) && (t = "100%"); var n = "string" == typeof t && -1 != t.indexOf("%"); return t = b(e, w(0, parseFloat(t))), n && (t = parseInt(t * e, 10) / 100), v.abs(t - e) < 1e-6 ? 1 : t % e / parseFloat(e) } function I(t) { return b(1, w(0, t)) } function j(t) { return parseInt(t, 16) } function P(t) { return 1 == t.length ? "0" + t : "" + t } function N(t) { return t <= 1 && (t = 100 * t + "%"), t } var D, R, M = (D = "[\\s|\\(]+(" + (R = "(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)") + ")[,|\\s]+(" + R + ")[,|\\s]+(" + R + ")\\s*\\)?", R = "[\\s|\\(]+(" + R + ")[,|\\s]+(" + R + ")[,|\\s]+(" + R + ")[,|\\s]+(" + R + ")\\s*\\)?", { rgb: new RegExp("rgb" + D), rgba: new RegExp("rgba" + R), hsl: new RegExp("hsl" + D), hsla: new RegExp("hsla" + R), hsv: new RegExp("hsv" + D), hsva: new RegExp("hsva" + R), hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ }); window.tinycolor = _ }(), It(function () { It.fn.spectrum.load && It.fn.spectrum.processNativeColorInputs() }) }), function () { var t = function (x) { x.ui = x.ui || {}, x.ui.version = "1.12.1"; var i, r, C, k, o, s, a, u, c, n, l = 0, h = Array.prototype.slice; function S(t, e, n) { return [parseFloat(t[0]) * (c.test(t[0]) ? e / 100 : 1), parseFloat(t[1]) * (c.test(t[1]) ? n / 100 : 1)] } function O(t, e) { return parseInt(x.css(t, e), 10) || 0 } x.cleanData = (i = x.cleanData, function (t) { for (var e, n, r = 0; null != (n = t[r]); r++)try { (e = x._data(n, "events")) && e.remove && x(n).triggerHandler("remove") } catch (t) { } i(t) }), x.widget = function (t, n, e) { var r, i, o, s = {}, a = t.split(".")[0], u = a + "-" + (t = t.split(".")[1]); return e || (e = n, n = x.Widget), x.isArray(e) && (e = x.extend.apply(null, [{}].concat(e))), x.expr[":"][u.toLowerCase()] = function (t) { return !!x.data(t, u) }, x[a] = x[a] || {}, r = x[a][t], i = x[a][t] = function (t, e) { if (!this._createWidget) return new i(t, e); arguments.length && this._createWidget(t, e) }, x.extend(i, r, { version: e.version, _proto: x.extend({}, e), _childConstructors: [] }), (o = new n).options = x.widget.extend({}, o.options), x.each(e, function (e, r) { function i() { return n.prototype[e].apply(this, arguments) } function o(t) { return n.prototype[e].apply(this, t) } x.isFunction(r) ? s[e] = function () { var t, e = this._super, n = this._superApply; return this._super = i, this._superApply = o, t = r.apply(this, arguments), this._super = e, this._superApply = n, t } : s[e] = r }), i.prototype = x.widget.extend(o, { widgetEventPrefix: r && o.widgetEventPrefix || t }, s, { constructor: i, namespace: a, widgetName: t, widgetFullName: u }), r ? (x.each(r._childConstructors, function (t, e) { var n = e.prototype; x.widget(n.namespace + "." + n.widgetName, i, e._proto) }), delete r._childConstructors) : n._childConstructors.push(i), x.widget.bridge(t, i), i }, x.widget.extend = function (t) { for (var e, n, r = h.call(arguments, 1), i = 0, o = r.length; i < o; i++)for (e in r[i]) n = r[i][e], r[i].hasOwnProperty(e) && void 0 !== n && (x.isPlainObject(n) ? t[e] = x.isPlainObject(t[e]) ? x.widget.extend({}, t[e], n) : x.widget.extend({}, n) : t[e] = n); return t }, x.widget.bridge = function (o, e) { var s = e.prototype.widgetFullName || o; x.fn[o] = function (n) { var t = "string" == typeof n, r = h.call(arguments, 1), i = this; return t ? this.length || "instance" !== n ? this.each(function () { var t, e = x.data(this, s); return "instance" === n ? (i = e, !1) : e ? x.isFunction(e[n]) && "_" !== n.charAt(0) ? (t = e[n].apply(e, r)) !== e && void 0 !== t ? (i = t && t.jquery ? i.pushStack(t.get()) : t, !1) : void 0 : x.error("no such method '" + n + "' for " + o + " widget instance") : x.error("cannot call methods on " + o + " prior to initialization; attempted to call method '" + n + "'") }) : i = void 0 : (r.length && (n = x.widget.extend.apply(null, [n].concat(r))), this.each(function () { var t = x.data(this, s); t ? (t.option(n || {}), t._init && t._init()) : x.data(this, s, new e(n, this)) })), i } }, x.Widget = function () { }, x.Widget._childConstructors = [], x.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "<div>", options: { classes: {}, disabled: !1, create: null }, _createWidget: function (t, e) { e = x(e || this.defaultElement || this)[0], this.element = x(e), this.uuid = l++, this.eventNamespace = "." + this.widgetName + this.uuid, this.bindings = x(), this.hoverable = x(), this.focusable = x(), this.classesElementLookup = {}, e !== this && (x.data(e, this.widgetFullName, this), this._on(!0, this.element, { remove: function (t) { t.target === e && this.destroy() } }), this.document = x(e.style ? e.ownerDocument : e.document || e), this.window = x(this.document[0].defaultView || this.document[0].parentWindow)), this.options = x.widget.extend({}, this.options, this._getCreateOptions(), t), this._create(), this.options.disabled && this._setOptionDisabled(this.options.disabled), this._trigger("create", null, this._getCreateEventData()), this._init() }, _getCreateOptions: function () { return {} }, _getCreateEventData: x.noop, _create: x.noop, _init: x.noop, destroy: function () { var n = this; this._destroy(), x.each(this.classesElementLookup, function (t, e) { n._removeClass(e, t) }), this.element.off(this.eventNamespace).removeData(this.widgetFullName), this.widget().off(this.eventNamespace).removeAttr("aria-disabled"), this.bindings.off(this.eventNamespace) }, _destroy: x.noop, widget: function () { return this.element }, option: function (t, e) { var n, r, i, o = t; if (0 === arguments.length) return x.widget.extend({}, this.options); if ("string" == typeof t) if (o = {}, t = (n = t.split(".")).shift(), n.length) { for (r = o[t] = x.widget.extend({}, this.options[t]), i = 0; i < n.length - 1; i++)r[n[i]] = r[n[i]] || {}, r = r[n[i]]; if (t = n.pop(), 1 === arguments.length) return void 0 === r[t] ? null : r[t]; r[t] = e } else { if (1 === arguments.length) return void 0 === this.options[t] ? null : this.options[t]; o[t] = e } return this._setOptions(o), this }, _setOptions: function (t) { for (var e in t) this._setOption(e, t[e]); return this }, _setOption: function (t, e) { return "classes" === t && this._setOptionClasses(e), this.options[t] = e, "disabled" === t && this._setOptionDisabled(e), this }, _setOptionClasses: function (t) { var e, n, r; for (e in t) r = this.classesElementLookup[e], t[e] !== this.options.classes[e] && r && r.length && (n = x(r.get()), this._removeClass(r, e), n.addClass(this._classes({ element: n, keys: e, classes: t, add: !0 }))) }, _setOptionDisabled: function (t) { this._toggleClass(this.widget(), this.widgetFullName + "-disabled", null, !!t), t && (this._removeClass(this.hoverable, null, "ui-state-hover"), this._removeClass(this.focusable, null, "ui-state-focus")) }, enable: function () { return this._setOptions({ disabled: !1 }) }, disable: function () { return this._setOptions({ disabled: !0 }) }, _classes: function (i) { var o = [], s = this; function t(t, e) { for (var n, r = 0; r < t.length; r++)n = s.classesElementLookup[t[r]] || x(), n = i.add ? x(x.unique(n.get().concat(i.element.get()))) : x(n.not(i.element).get()), s.classesElementLookup[t[r]] = n, o.push(t[r]), e && i.classes[t[r]] && o.push(i.classes[t[r]]) } return i = x.extend({ element: this.element, classes: this.options.classes || {} }, i), this._on(i.element, { remove: "_untrackClassesElement" }), i.keys && t(i.keys.match(/\S+/g) || [], !0), i.extra && t(i.extra.match(/\S+/g) || []), o.join(" ") }, _untrackClassesElement: function (n) { var r = this; x.each(r.classesElementLookup, function (t, e) { -1 !== x.inArray(n.target, e) && (r.classesElementLookup[t] = x(e.not(n.target).get())) }) }, _removeClass: function (t, e, n) { return this._toggleClass(t, e, n, !1) }, _addClass: function (t, e, n) { return this._toggleClass(t, e, n, !0) }, _toggleClass: function (t, e, n, r) { r = "boolean" == typeof r ? r : n; var i = "string" == typeof t || null === t, t = { extra: i ? e : n, keys: i ? t : e, element: i ? this.element : t, add: r }; return t.element.toggleClass(this._classes(t), r), this }, _on: function (i, o, t) { var s, a = this; "boolean" != typeof i && (t = o, o = i, i = !1), t ? (o = s = x(o), this.bindings = this.bindings.add(o)) : (t = o, o = this.element, s = this.widget()), x.each(t, function (t, e) { function n() { if (i || !0 !== a.options.disabled && !x(this).hasClass("ui-state-disabled")) return ("string" == typeof e ? a[e] : e).apply(a, arguments) } "string" != typeof e && (n.guid = e.guid = e.guid || n.guid || x.guid++); var r = t.match(/^([\w:-]*)\s*(.*)$/), t = r[1] + a.eventNamespace, r = r[2]; r ? s.on(t, r, n) : o.on(t, n) }) }, _off: function (t, e) { e = (e || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace, t.off(e).off(e), this.bindings = x(this.bindings.not(t).get()), this.focusable = x(this.focusable.not(t).get()), this.hoverable = x(this.hoverable.not(t).get()) }, _delay: function (t, e) { var n = this; return setTimeout(function () { return ("string" == typeof t ? n[t] : t).apply(n, arguments) }, e || 0) }, _hoverable: function (t) { this.hoverable = this.hoverable.add(t), this._on(t, { mouseenter: function (t) { this._addClass(x(t.currentTarget), null, "ui-state-hover") }, mouseleave: function (t) { this._removeClass(x(t.currentTarget), null, "ui-state-hover") } }) }, _focusable: function (t) { this.focusable = this.focusable.add(t), this._on(t, { focusin: function (t) { this._addClass(x(t.currentTarget), null, "ui-state-focus") }, focusout: function (t) { this._removeClass(x(t.currentTarget), null, "ui-state-focus") } }) }, _trigger: function (t, e, n) { var r, i, o = this.options[t]; if (n = n || {}, (e = x.Event(e)).type = (t === this.widgetEventPrefix ? t : this.widgetEventPrefix + t).toLowerCase(), e.target = this.element[0], i = e.originalEvent) for (r in i) r in e || (e[r] = i[r]); return this.element.trigger(e, n), !(x.isFunction(o) && !1 === o.apply(this.element[0], [e].concat(n)) || e.isDefaultPrevented()) } }, x.each({ show: "fadeIn", hide: "fadeOut" }, function (o, s) { x.Widget.prototype["_" + o] = function (e, t, n) { var r; "string" == typeof t && (t = { effect: t }); var i = t ? !0 !== t && "number" != typeof t && t.effect || s : o; "number" == typeof (t = t || {}) && (t = { duration: t }), r = !x.isEmptyObject(t), t.complete = n, t.delay && e.delay(t.delay), r && x.effects && x.effects.effect[i] ? e[o](t) : i !== o && e[i] ? e[i](t.duration, t.easing, n) : e.queue(function (t) { x(this)[o](), n && n.call(e[0]), t() }) } }), x.widget, C = Math.max, k = Math.abs, o = /left|center|right/, s = /top|center|bottom/, a = /[\+\-]\d+(\.[\d]+)?%?/, u = /^\w+/, c = /%$/, n = x.fn.position, x.position = { scrollbarWidth: function () { if (void 0 !== r) return r; var t, e = x("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"), n = e.children()[0]; return x("body").append(e), t = n.offsetWidth, e.css("overflow", "scroll"), t === (n = n.offsetWidth) && (n = e[0].clientWidth), e.remove(), r = t - n }, getScrollInfo: function (t) { var e = t.isWindow || t.isDocument ? "" : t.element.css("overflow-x"), n = t.isWindow || t.isDocument ? "" : t.element.css("overflow-y"), e = "scroll" === e || "auto" === e && t.width < t.element[0].scrollWidth; return { width: "scroll" === n || "auto" === n && t.height < t.element[0].scrollHeight ? x.position.scrollbarWidth() : 0, height: e ? x.position.scrollbarWidth() : 0 } }, getWithinInfo: function (t) { var e = x(t || window), n = x.isWindow(e[0]), r = !!e[0] && 9 === e[0].nodeType; return { element: e, isWindow: n, isDocument: r, offset: n || r ? { left: 0, top: 0 } : x(t).offset(), scrollLeft: e.scrollLeft(), scrollTop: e.scrollTop(), width: e.outerWidth(), height: e.outerHeight() } } }, x.fn.position = function (h) { if (!h || !h.of) return n.apply(this, arguments); h = x.extend({}, h); var f, p, d, g, m, t, v = x(h.of), y = x.position.getWithinInfo(h.within), b = x.position.getScrollInfo(y), w = (h.collision || "flip").split(" "), _ = {}, e = 9 === (t = (e = v)[0]).nodeType ? { width: e.width(), height: e.height(), offset: { top: 0, left: 0 } } : x.isWindow(t) ? { width: e.width(), height: e.height(), offset: { top: e.scrollTop(), left: e.scrollLeft() } } : t.preventDefault ? { width: 0, height: 0, offset: { top: t.pageY, left: t.pageX } } : { width: e.outerWidth(), height: e.outerHeight(), offset: e.offset() }; return v[0].preventDefault && (h.at = "left top"), p = e.width, d = e.height, g = e.offset, m = x.extend({}, g), x.each(["my", "at"], function () { var t, e, n = (h[this] || "").split(" "); 1 === n.length && (n = o.test(n[0]) ? n.concat(["center"]) : s.test(n[0]) ? ["center"].concat(n) : ["center", "center"]), n[0] = o.test(n[0]) ? n[0] : "center", n[1] = s.test(n[1]) ? n[1] : "center", t = a.exec(n[0]), e = a.exec(n[1]), _[this] = [t ? t[0] : 0, e ? e[0] : 0], h[this] = [u.exec(n[0])[0], u.exec(n[1])[0]] }), 1 === w.length && (w[1] = w[0]), "right" === h.at[0] ? m.left += p : "center" === h.at[0] && (m.left += p / 2), "bottom" === h.at[1] ? m.top += d : "center" === h.at[1] && (m.top += d / 2), f = S(_.at, p, d), m.left += f[0], m.top += f[1], this.each(function () { var n, t, s = x(this), a = s.outerWidth(), u = s.outerHeight(), e = O(this, "marginLeft"), r = O(this, "marginTop"), i = a + e + O(this, "marginRight") + b.width, o = u + r + O(this, "marginBottom") + b.height, c = x.extend({}, m), l = S(_.my, s.outerWidth(), s.outerHeight()); "right" === h.my[0] ? c.left -= a : "center" === h.my[0] && (c.left -= a / 2), "bottom" === h.my[1] ? c.top -= u : "center" === h.my[1] && (c.top -= u / 2), c.left += l[0], c.top += l[1], n = { marginLeft: e, marginTop: r }, x.each(["left", "top"], function (t, e) { x.ui.position[w[t]] && x.ui.position[w[t]][e](c, { targetWidth: p, targetHeight: d, elemWidth: a, elemHeight: u, collisionPosition: n, collisionWidth: i, collisionHeight: o, offset: [f[0] + l[0], f[1] + l[1]], my: h.my, at: h.at, within: y, elem: s }) }), h.using && (t = function (t) { var e = g.left - c.left, n = e + p - a, r = g.top - c.top, i = r + d - u, o = { target: { element: v, left: g.left, top: g.top, width: p, height: d }, element: { element: s, left: c.left, top: c.top, width: a, height: u }, horizontal: n < 0 ? "left" : 0 < e ? "right" : "center", vertical: i < 0 ? "top" : 0 < r ? "bottom" : "middle" }; p < a && k(e + n) < p && (o.horizontal = "center"), d < u && k(r + i) < d && (o.vertical = "middle"), C(k(e), k(n)) > C(k(r), k(i)) ? o.important = "horizontal" : o.important = "vertical", h.using.call(this, t, o) }), s.offset(x.extend(c, { using: t })) }) }, x.ui.position = { fit: { left: function (t, e) { var n = e.within, r = n.isWindow ? n.scrollLeft : n.offset.left, i = n.width, o = t.left - e.collisionPosition.marginLeft, s = r - o, a = o + e.collisionWidth - i - r; e.collisionWidth > i ? 0 < s && a <= 0 ? (n = t.left + s + e.collisionWidth - i - r, t.left += s - n) : t.left = !(0 < a && s <= 0) && a < s ? r + i - e.collisionWidth : r : 0 < s ? t.left += s : 0 < a ? t.left -= a : t.left = C(t.left - o, t.left) }, top: function (t, e) { var n = e.within, r = n.isWindow ? n.scrollTop : n.offset.top, i = e.within.height, o = t.top - e.collisionPosition.marginTop, s = r - o, a = o + e.collisionHeight - i - r; e.collisionHeight > i ? 0 < s && a <= 0 ? (n = t.top + s + e.collisionHeight - i - r, t.top += s - n) : t.top = !(0 < a && s <= 0) && a < s ? r + i - e.collisionHeight : r : 0 < s ? t.top += s : 0 < a ? t.top -= a : t.top = C(t.top - o, t.top) } }, flip: { left: function (t, e) { var n = e.within, r = n.offset.left + n.scrollLeft, i = n.width, o = n.isWindow ? n.scrollLeft : n.offset.left, s = t.left - e.collisionPosition.marginLeft, a = s - o, u = s + e.collisionWidth - i - o, c = "left" === e.my[0] ? -e.elemWidth : "right" === e.my[0] ? e.elemWidth : 0, n = "left" === e.at[0] ? e.targetWidth : "right" === e.at[0] ? -e.targetWidth : 0, s = -2 * e.offset[0]; a < 0 ? ((r = t.left + c + n + s + e.collisionWidth - i - r) < 0 || r < k(a)) && (t.left += c + n + s) : 0 < u && (0 < (o = t.left - e.collisionPosition.marginLeft + c + n + s - o) || k(o) < u) && (t.left += c + n + s) }, top: function (t, e) { var n = e.within, r = n.offset.top + n.scrollTop, i = n.height, o = n.isWindow ? n.scrollTop : n.offset.top, s = t.top - e.collisionPosition.marginTop, a = s - o, u = s + e.collisionHeight - i - o, c = "top" === e.my[1] ? -e.elemHeight : "bottom" === e.my[1] ? e.elemHeight : 0, n = "top" === e.at[1] ? e.targetHeight : "bottom" === e.at[1] ? -e.targetHeight : 0, s = -2 * e.offset[1]; a < 0 ? ((r = t.top + c + n + s + e.collisionHeight - i - r) < 0 || r < k(a)) && (t.top += c + n + s) : 0 < u && (0 < (o = t.top - e.collisionPosition.marginTop + c + n + s - o) || k(o) < u) && (t.top += c + n + s) } }, flipfit: { left: function () { x.ui.position.flip.left.apply(this, arguments), x.ui.position.fit.left.apply(this, arguments) }, top: function () { x.ui.position.flip.top.apply(this, arguments), x.ui.position.fit.top.apply(this, arguments) } } }, x.ui.position, x.fn.form = function () { return "string" == typeof this[0].form ? this.closest("form") : x(this[0].form) }, x.ui.formResetMixin = { _formResetHandler: function () { var e = x(this); setTimeout(function () { var t = e.data("ui-form-reset-instances"); x.each(t, function () { this.refresh() }) }) }, _bindFormResetHandler: function () { var t; this.form = this.element.form(), this.form.length && ((t = this.form.data("ui-form-reset-instances") || []).length || this.form.on("reset.ui-form-reset", this._formResetHandler), t.push(this), this.form.data("ui-form-reset-instances", t)) }, _unbindFormResetHandler: function () { var t; this.form.length && ((t = this.form.data("ui-form-reset-instances")).splice(x.inArray(this, t), 1), t.length ? this.form.data("ui-form-reset-instances", t) : this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")) } }, x.ui.keyCode = { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 }, x.ui.escapeSelector = (e = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g, function (t) { return t.replace(e, "\\$1") }), x.fn.labels = function () { var t, e, n; return this[0].labels && this[0].labels.length ? this.pushStack(this[0].labels) : (e = this.eq(0).parents("label"), (t = this.attr("id")) && (n = (n = this.eq(0).parents().last()).add((n.length ? n : this).siblings()), t = "label[for='" + x.ui.escapeSelector(t) + "']", e = e.add(n.find(t).addBack(t))), this.pushStack(e)) }, x.fn.extend({ uniqueId: (t = 0, function () { return this.each(function () { this.id || (this.id = "ui-id-" + ++t) }) }), removeUniqueId: function () { return this.each(function () { /^ui-id-\d+$/.test(this.id) && x(this).removeAttr("id") }) } }); var e, t, f, p = /ui-corner-([a-z]){2,6}/g; x.widget("ui.controlgroup", { version: "1.12.1", defaultElement: "<div>", options: { direction: "horizontal", disabled: null, onlyVisible: !0, items: { button: "input[type=button], input[type=submit], input[type=reset], button, a", controlgroupLabel: ".ui-controlgroup-label", checkboxradio: "input[type='checkbox'], input[type='radio']", selectmenu: "select", spinner: ".ui-spinner-input" } }, _create: function () { this._enhance() }, _enhance: function () { this.element.attr("role", "toolbar"), this.refresh() }, _destroy: function () { this._callChildMethod("destroy"), this.childWidgets.removeData("ui-controlgroup-data"), this.element.removeAttr("role"), this.options.items.controlgroupLabel && this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap() }, _initWidgets: function () { var o = this, s = []; x.each(this.options.items, function (r, t) { var e, i; if (t) return "controlgroupLabel" === r ? ((e = o.element.find(t)).each(function () { var t = x(this); t.children(".ui-controlgroup-label-contents").length || t.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>") }), o._addClass(e, null, "ui-widget ui-widget-content ui-state-default"), void (s = s.concat(e.get()))) : void (x.fn[r] && (i = o["_" + r + "Options"] ? o["_" + r + "Options"]("middle") : { classes: {} }, o.element.find(t).each(function () { var t = x(this), e = t[r]("instance"), n = x.widget.extend({}, i); "button" === r && t.parent(".ui-spinner").length || ((e = e || t[r]()[r]("instance")) && (n.classes = o._resolveClassesValues(n.classes, e)), t[r](n), n = t[r]("widget"), x.data(n[0], "ui-controlgroup-data", e || t[r]("instance")), s.push(n[0])) }))) }), this.childWidgets = x(x.unique(s)), this._addClass(this.childWidgets, "ui-controlgroup-item") }, _callChildMethod: function (e) { this.childWidgets.each(function () { var t = x(this).data("ui-controlgroup-data"); t && t[e] && t[e]() }) }, _updateCornerClass: function (t, e) { e = this._buildSimpleOptions(e, "label").classes.label; this._removeClass(t, null, "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"), this._addClass(t, null, e) }, _buildSimpleOptions: function (t, e) { var n = "vertical" === this.options.direction, r = { classes: {} }; return r.classes[e] = { middle: "", first: "ui-corner-" + (n ? "top" : "left"), last: "ui-corner-" + (n ? "bottom" : "right"), only: "ui-corner-all" }[t], r }, _spinnerOptions: function (t) { t = this._buildSimpleOptions(t, "ui-spinner"); return t.classes["ui-spinner-up"] = "", t.classes["ui-spinner-down"] = "", t }, _buttonOptions: function (t) { return this._buildSimpleOptions(t, "ui-button") }, _checkboxradioOptions: function (t) { return this._buildSimpleOptions(t, "ui-checkboxradio-label") }, _selectmenuOptions: function (t) { var e = "vertical" === this.options.direction; return { width: !!e && "auto", classes: { middle: { "ui-selectmenu-button-open": "", "ui-selectmenu-button-closed": "" }, first: { "ui-selectmenu-button-open": "ui-corner-" + (e ? "top" : "tl"), "ui-selectmenu-button-closed": "ui-corner-" + (e ? "top" : "left") }, last: { "ui-selectmenu-button-open": e ? "" : "ui-corner-tr", "ui-selectmenu-button-closed": "ui-corner-" + (e ? "bottom" : "right") }, only: { "ui-selectmenu-button-open": "ui-corner-top", "ui-selectmenu-button-closed": "ui-corner-all" } }[t] } }, _resolveClassesValues: function (n, r) { var i = {}; return x.each(n, function (t) { var e = r.options.classes[t] || "", e = x.trim(e.replace(p, "")); i[t] = (e + " " + n[t]).replace(/\s+/g, " ") }), i }, _setOption: function (t, e) { "direction" === t && this._removeClass("ui-controlgroup-" + this.options.direction), this._super(t, e), "disabled" !== t ? this.refresh() : this._callChildMethod(e ? "disable" : "enable") }, refresh: function () { var i, o = this; this._addClass("ui-controlgroup ui-controlgroup-" + this.options.direction), "horizontal" === this.options.direction && this._addClass(null, "ui-helper-clearfix"), this._initWidgets(), i = this.childWidgets, this.options.onlyVisible && (i = i.filter(":visible")), i.length && (x.each(["first", "last"], function (t, e) { var n, r = i[e]().data("ui-controlgroup-data"); r && o["_" + r.widgetName + "Options"] ? ((n = o["_" + r.widgetName + "Options"](1 === i.length ? "only" : e)).classes = o._resolveClassesValues(n.classes, r), r.element[r.widgetName](n)) : o._updateCornerClass(i[e](), e) }), this._callChildMethod("refresh")) } }), x.widget("ui.checkboxradio", [x.ui.formResetMixin, { version: "1.12.1", options: { disabled: null, label: null, icon: !0, classes: { "ui-checkboxradio-label": "ui-corner-all", "ui-checkboxradio-icon": "ui-corner-all" } }, _getCreateOptions: function () { var t, e = this, n = this._super() || {}; return this._readType(), t = this.element.labels(), this.label = x(t[t.length - 1]), this.label.length || x.error("No label found for checkboxradio widget"), this.originalLabel = "", this.label.contents().not(this.element[0]).each(function () { e.originalLabel += 3 === this.nodeType ? x(this).text() : this.outerHTML }), this.originalLabel && (n.label = this.originalLabel), null != (t = this.element[0].disabled) && (n.disabled = t), n }, _create: function () { var t = this.element[0].checked; this._bindFormResetHandler(), null == this.options.disabled && (this.options.disabled = this.element[0].disabled), this._setOption("disabled", this.options.disabled), this._addClass("ui-checkboxradio", "ui-helper-hidden-accessible"), this._addClass(this.label, "ui-checkboxradio-label", "ui-button ui-widget"), "radio" === this.type && this._addClass(this.label, "ui-checkboxradio-radio-label"), this.options.label && this.options.label !== this.originalLabel ? this._updateLabel() : this.originalLabel && (this.options.label = this.originalLabel), this._enhance(), t && (this._addClass(this.label, "ui-checkboxradio-checked", "ui-state-active"), this.icon && this._addClass(this.icon, null, "ui-state-hover")), this._on({ change: "_toggleClasses", focus: function () { this._addClass(this.label, null, "ui-state-focus ui-visual-focus") }, blur: function () { this._removeClass(this.label, null, "ui-state-focus ui-visual-focus") } }) }, _readType: function () { var t = this.element[0].nodeName.toLowerCase(); this.type = this.element[0].type, "input" === t && /radio|checkbox/.test(this.type) || x.error("Can't create checkboxradio on element.nodeName=" + t + " and element.type=" + this.type) }, _enhance: function () { this._updateIcon(this.element[0].checked) }, widget: function () { return this.label }, _getRadioGroup: function () { var t = this.element[0].name, e = "input[name='" + x.ui.escapeSelector(t) + "']"; return t ? (this.form.length ? x(this.form[0].elements).filter(e) : x(e).filter(function () { return 0 === x(this).form().length })).not(this.element) : x([]) }, _toggleClasses: function () { var t = this.element[0].checked; this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", t), this.options.icon && "checkbox" === this.type && this._toggleClass(this.icon, null, "ui-icon-check ui-state-checked", t)._toggleClass(this.icon, null, "ui-icon-blank", !t), "radio" === this.type && this._getRadioGroup().each(function () { var t = x(this).checkboxradio("instance"); t && t._removeClass(t.label, "ui-checkboxradio-checked", "ui-state-active") }) }, _destroy: function () { this._unbindFormResetHandler(), this.icon && (this.icon.remove(), this.iconSpace.remove()) }, _setOption: function (t, e) { if ("label" !== t || e) { if (this._super(t, e), "disabled" === t) return this._toggleClass(this.label, null, "ui-state-disabled", e), void (this.element[0].disabled = e); this.refresh() } }, _updateIcon: function (t) { var e = "ui-icon ui-icon-background "; this.options.icon ? (this.icon || (this.icon = x("<span>"), this.iconSpace = x("<span> </span>"), this._addClass(this.iconSpace, "ui-checkboxradio-icon-space")), "checkbox" === this.type ? (e += t ? "ui-icon-check ui-state-checked" : "ui-icon-blank", this._removeClass(this.icon, null, t ? "ui-icon-blank" : "ui-icon-check")) : e += "ui-icon-blank", this._addClass(this.icon, "ui-checkboxradio-icon", e), t || this._removeClass(this.icon, null, "ui-icon-check ui-state-checked"), this.icon.prependTo(this.label).after(this.iconSpace)) : void 0 !== this.icon && (this.icon.remove(), this.iconSpace.remove(), delete this.icon) }, _updateLabel: function () { var t = this.label.contents().not(this.element[0]); this.icon && (t = t.not(this.icon[0])), this.iconSpace && (t = t.not(this.iconSpace[0])), t.remove(), this.label.append(this.options.label) }, refresh: function () { var t = this.element[0].checked, e = this.element[0].disabled; this._updateIcon(t), this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", t), null !== this.options.label && this._updateLabel(), e !== this.options.disabled && this._setOptions({ disabled: e }) } }]), x.ui.checkboxradio, x.widget("ui.button", { version: "1.12.1", defaultElement: "<button>", options: { classes: { "ui-button": "ui-corner-all" }, disabled: null, icon: null, iconPosition: "beginning", label: null, showLabel: !0 }, _getCreateOptions: function () { var t, e = this._super() || {}; return this.isInput = this.element.is("input"), null != (t = this.element[0].disabled) && (e.disabled = t), this.originalLabel = this.isInput ? this.element.val() : this.element.html(), this.originalLabel && (e.label = this.originalLabel), e }, _create: function () { !this.option.showLabel & !this.options.icon && (this.options.showLabel = !0), null == this.options.disabled && (this.options.disabled = this.element[0].disabled || !1), this.hasTitle = !!this.element.attr("title"), this.options.label && this.options.label !== this.originalLabel && (this.isInput ? this.element.val(this.options.label) : this.element.html(this.options.label)), this._addClass("ui-button", "ui-widget"), this._setOption("disabled", this.options.disabled), this._enhance(), this.element.is("a") && this._on({ keyup: function (t) { t.keyCode === x.ui.keyCode.SPACE && (t.preventDefault(), this.element[0].click ? this.element[0].click() : this.element.trigger("click")) } }) }, _enhance: function () { this.element.is("button") || this.element.attr("role", "button"), this.options.icon && (this._updateIcon("icon", this.options.icon), this._updateTooltip()) }, _updateTooltip: function () { this.title = this.element.attr("title"), this.options.showLabel || this.title || this.element.attr("title", this.options.label) }, _updateIcon: function (t, e) { var n = "iconPosition" !== t, r = n ? this.options.iconPosition : e, t = "top" === r || "bottom" === r; this.icon ? n && this._removeClass(this.icon, null, this.options.icon) : (this.icon = x("<span>"), this._addClass(this.icon, "ui-button-icon", "ui-icon"), this.options.showLabel || this._addClass("ui-button-icon-only")), n && this._addClass(this.icon, null, e), this._attachIcon(r), t ? (this._addClass(this.icon, null, "ui-widget-icon-block"), this.iconSpace && this.iconSpace.remove()) : (this.iconSpace || (this.iconSpace = x("<span> </span>"), this._addClass(this.iconSpace, "ui-button-icon-space")), this._removeClass(this.icon, null, "ui-wiget-icon-block"), this._attachIconSpace(r)) }, _destroy: function () { this.element.removeAttr("role"), this.icon && this.icon.remove(), this.iconSpace && this.iconSpace.remove(), this.hasTitle || this.element.removeAttr("title") }, _attachIconSpace: function (t) { this.icon[/^(?:end|bottom)/.test(t) ? "before" : "after"](this.iconSpace) }, _attachIcon: function (t) { this.element[/^(?:end|bottom)/.test(t) ? "append" : "prepend"](this.icon) }, _setOptions: function (t) { var e = (void 0 === t.showLabel ? this.options : t).showLabel, n = (void 0 === t.icon ? this.options : t).icon; e || n || (t.showLabel = !0), this._super(t) }, _setOption: function (t, e) { "icon" === t && (e ? this._updateIcon(t, e) : this.icon && (this.icon.remove(), this.iconSpace && this.iconSpace.remove())), "iconPosition" === t && this._updateIcon(t, e), "showLabel" === t && (this._toggleClass("ui-button-icon-only", null, !e), this._updateTooltip()), "label" === t && (this.isInput ? this.element.val(e) : (this.element.html(e), this.icon && (this._attachIcon(this.options.iconPosition), this._attachIconSpace(this.options.iconPosition)))), this._super(t, e), "disabled" === t && (this._toggleClass(null, "ui-state-disabled", e), (this.element[0].disabled = e) && this.element.blur()) }, refresh: function () { var t = this.element.is("input, button") ? this.element[0].disabled : this.element.hasClass("ui-button-disabled"); t !== this.options.disabled && this._setOptions({ disabled: t }), this._updateTooltip() } }), !1 !== x.uiBackCompat && (x.widget("ui.button", x.ui.button, { options: { text: !0, icons: { primary: null, secondary: null } }, _create: function () { this.options.showLabel && !this.options.text && (this.options.showLabel = this.options.text), !this.options.showLabel && this.options.text && (this.options.text = this.options.showLabel), this.options.icon || !this.options.icons.primary && !this.options.icons.secondary ? this.options.icon && (this.options.icons.primary = this.options.icon) : this.options.icons.primary ? this.options.icon = this.options.icons.primary : (this.options.icon = this.options.icons.secondary, this.options.iconPosition = "end"), this._super() }, _setOption: function (t, e) { "text" !== t ? ("showLabel" === t && (this.options.text = e), "icon" === t && (this.options.icons.primary = e), "icons" === t && (e.primary ? (this._super("icon", e.primary), this._super("iconPosition", "beginning")) : e.secondary && (this._super("icon", e.secondary), this._super("iconPosition", "end"))), this._superApply(arguments)) : this._super("showLabel", e) } }), x.fn.button = (f = x.fn.button, function () { return !this.length || this.length && "INPUT" !== this[0].tagName || this.length && "INPUT" === this[0].tagName && "checkbox" !== this.attr("type") && "radio" !== this.attr("type") ? f.apply(this, arguments) : (x.ui.checkboxradio || x.error("Checkboxradio widget missing"), 0 === arguments.length ? this.checkboxradio({ icon: !1 }) : this.checkboxradio.apply(this, arguments)) }), x.fn.buttonset = function () { return x.ui.controlgroup || x.error("Controlgroup widget missing"), "option" === arguments[0] && "items" === arguments[1] && arguments[2] ? this.controlgroup.apply(this, [arguments[0], "items.button", arguments[2]]) : "option" === arguments[0] && "items" === arguments[1] ? this.controlgroup.apply(this, [arguments[0], "items.button"]) : ("object" == typeof arguments[0] && arguments[0].items && (arguments[0].items = { button: arguments[0].items }), this.controlgroup.apply(this, arguments)) }), x.ui.button, x.ui.safeActiveElement = function (e) { var n; try { n = e.activeElement } catch (t) { n = e.body } return (n = n || e.body).nodeName || (n = e.body), n }, x.widget("ui.menu", { version: "1.12.1", defaultElement: "<ul>", delay: 300, options: { icons: { submenu: "ui-icon-caret-1-e" }, items: "> *", menus: "ul", position: { my: "left top", at: "right top" }, role: "menu", blur: null, focus: null, select: null }, _create: function () { this.activeMenu = this.element, this.mouseHandled = !1, this.element.uniqueId().attr({ role: this.options.role, tabIndex: 0 }), this._addClass("ui-menu", "ui-widget ui-widget-content"), this._on({ "mousedown .ui-menu-item": function (t) { t.preventDefault() }, "click .ui-menu-item": function (t) { var e = x(t.target), n = x(x.ui.safeActiveElement(this.document[0])); !this.mouseHandled && e.not(".ui-state-disabled").length && (this.select(t), t.isPropagationStopped() || (this.mouseHandled = !0), e.has(".ui-menu").length ? this.expand(t) : !this.element.is(":focus") && n.closest(".ui-menu").length && (this.element.trigger("focus", [!0]), this.active && 1 === this.active.parents(".ui-menu").length && clearTimeout(this.timer))) }, "mouseenter .ui-menu-item": function (t) { var e, n; this.previousFilter || (e = x(t.target).closest(".ui-menu-item"), n = x(t.currentTarget), e[0] === n[0] && (this._removeClass(n.siblings().children(".ui-state-active"), null, "ui-state-active"), this.focus(t, n))) }, mouseleave: "collapseAll", "mouseleave .ui-menu": "collapseAll", focus: function (t, e) { var n = this.active || this.element.find(this.options.items).eq(0); e || this.focus(t, n) }, blur: function (t) { this._delay(function () { x.contains(this.element[0], x.ui.safeActiveElement(this.document[0])) || this.collapseAll(t) }) }, keydown: "_keydown" }), this.refresh(), this._on(this.document, { click: function (t) { this._closeOnDocumentClick(t) && this.collapseAll(t), this.mouseHandled = !1 } }) }, _destroy: function () { var t = this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup"); this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(), t.children().each(function () { var t = x(this); t.data("ui-menu-submenu-caret") && t.remove() }) }, _keydown: function (t) { var e, n, r, i = !0; switch (t.keyCode) { case x.ui.keyCode.PAGE_UP: this.previousPage(t); break; case x.ui.keyCode.PAGE_DOWN: this.nextPage(t); break; case x.ui.keyCode.HOME: this._move("first", "first", t); break; case x.ui.keyCode.END: this._move("last", "last", t); break; case x.ui.keyCode.UP: this.previous(t); break; case x.ui.keyCode.DOWN: this.next(t); break; case x.ui.keyCode.LEFT: this.collapse(t); break; case x.ui.keyCode.RIGHT: this.active && !this.active.is(".ui-state-disabled") && this.expand(t); break; case x.ui.keyCode.ENTER: case x.ui.keyCode.SPACE: this._activate(t); break; case x.ui.keyCode.ESCAPE: this.collapse(t); break; default: i = !1, e = this.previousFilter || "", r = !1, n = 96 <= t.keyCode && t.keyCode <= 105 ? (t.keyCode - 96).toString() : String.fromCharCode(t.keyCode), clearTimeout(this.filterTimer), n === e ? r = !0 : n = e + n, e = this._filterMenuItems(n), (e = r && -1 !== e.index(this.active.next()) ? this.active.nextAll(".ui-menu-item") : e).length || (n = String.fromCharCode(t.keyCode), e = this._filterMenuItems(n)), e.length ? (this.focus(t, e), this.previousFilter = n, this.filterTimer = this._delay(function () { delete this.previousFilter }, 1e3)) : delete this.previousFilter }i && t.preventDefault() }, _activate: function (t) { this.active && !this.active.is(".ui-state-disabled") && (this.active.children("[aria-haspopup='true']").length ? this.expand(t) : this.select(t)) }, refresh: function () { var t, e, r = this, i = this.options.icons.submenu, n = this.element.find(this.options.menus); this._toggleClass("ui-menu-icons", null, !!this.element.find(".ui-icon").length), e = n.filter(":not(.ui-menu)").hide().attr({ role: this.options.role, "aria-hidden": "true", "aria-expanded": "false" }).each(function () { var t = x(this), e = t.prev(), n = x("<span>").data("ui-menu-submenu-caret", !0); r._addClass(n, "ui-menu-icon", "ui-icon " + i), e.attr("aria-haspopup", "true").prepend(n), t.attr("aria-labelledby", e.attr("id")) }), this._addClass(e, "ui-menu", "ui-widget ui-widget-content ui-front"), (t = n.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function () { var t = x(this); r._isDivider(t) && r._addClass(t, "ui-menu-divider", "ui-widget-content") }), n = (e = t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({ tabIndex: -1, role: this._itemRole() }), this._addClass(e, "ui-menu-item")._addClass(n, "ui-menu-item-wrapper"), t.filter(".ui-state-disabled").attr("aria-disabled", "true"), this.active && !x.contains(this.element[0], this.active[0]) && this.blur() }, _itemRole: function () { return { menu: "menuitem", listbox: "option" }[this.options.role] }, _setOption: function (t, e) { var n; "icons" === t && (n = this.element.find(".ui-menu-icon"), this._removeClass(n, null, this.options.icons.submenu)._addClass(n, null, e.submenu)), this._super(t, e) }, _setOptionDisabled: function (t) { this._super(t), this.element.attr("aria-disabled", String(t)), this._toggleClass(null, "ui-state-disabled", !!t) }, focus: function (t, e) { var n; this.blur(t, t && "focus" === t.type), this._scrollIntoView(e), this.active = e.first(), n = this.active.children(".ui-menu-item-wrapper"), this._addClass(n, null, "ui-state-active"), this.options.role && this.element.attr("aria-activedescendant", n.attr("id")), n = this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"), this._addClass(n, null, "ui-state-active"), t && "keydown" === t.type ? this._close() : this.timer = this._delay(function () { this._close() }, this.delay), (n = e.children(".ui-menu")).length && t && /^mouse/.test(t.type) && this._startOpening(n), this.activeMenu = e.parent(), this._trigger("focus", t, { item: e }) }, _scrollIntoView: function (t) { var e, n, r; this._hasScroll() && (n = parseFloat(x.css(this.activeMenu[0], "borderTopWidth")) || 0, r = parseFloat(x.css(this.activeMenu[0], "paddingTop")) || 0, e = t.offset().top - this.activeMenu.offset().top - n - r, n = this.activeMenu.scrollTop(), r = this.activeMenu.height(), t = t.outerHeight(), e < 0 ? this.activeMenu.scrollTop(n + e) : r < e + t && this.activeMenu.scrollTop(n + e - r + t)) }, blur: function (t, e) { e || clearTimeout(this.timer), this.active && (this._removeClass(this.active.children(".ui-menu-item-wrapper"), null, "ui-state-active"), this._trigger("blur", t, { item: this.active }), this.active = null) }, _startOpening: function (t) { clearTimeout(this.timer), "true" === t.attr("aria-hidden") && (this.timer = this._delay(function () { this._close(), this._open(t) }, this.delay)) }, _open: function (t) { var e = x.extend({ of: this.active }, this.options.position); clearTimeout(this.timer), this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden", "true"), t.show().removeAttr("aria-hidden").attr("aria-expanded", "true").position(e) }, collapseAll: function (e, n) { clearTimeout(this.timer), this.timer = this._delay(function () { var t = n ? this.element : x(e && e.target).closest(this.element.find(".ui-menu")); t.length || (t = this.element), this._close(t), this.blur(e), this._removeClass(t.find(".ui-state-active"), null, "ui-state-active"), this.activeMenu = t }, this.delay) }, _close: function (t) { (t = t || (this.active ? this.active.parent() : this.element)).find(".ui-menu").hide().attr("aria-hidden", "true").attr("aria-expanded", "false") }, _closeOnDocumentClick: function (t) { return !x(t.target).closest(".ui-menu").length }, _isDivider: function (t) { return !/[^\-\u2014\u2013\s]/.test(t.text()) }, collapse: function (t) { var e = this.active && this.active.parent().closest(".ui-menu-item", this.element); e && e.length && (this._close(), this.focus(t, e)) }, expand: function (t) { var e = this.active && this.active.children(".ui-menu ").find(this.options.items).first(); e && e.length && (this._open(e.parent()), this._delay(function () { this.focus(t, e) })) }, next: function (t) { this._move("next", "first", t) }, previous: function (t) { this._move("prev", "last", t) }, isFirstItem: function () { return this.active && !this.active.preval(".ui-menu-item").length }, isLastItem: function () { return this.active && !this.active.nextAll(".ui-menu-item").length }, _move: function (t, e, n) { var r; this.active && (r = "first" === t || "last" === t ? this.active["first" === t ? "prevAll" : "nextAll"](".ui-menu-item").eq(-1) : this.active[t + "All"](".ui-menu-item").eq(0)), r && r.length && this.active || (r = this.activeMenu.find(this.options.items)[e]()), this.focus(n, r) }, nextPage: function (t) { var e, n, r; this.active ? this.isLastItem() || (this._hasScroll() ? (n = this.active.offset().top, r = this.element.height(), this.active.nextAll(".ui-menu-item").each(function () { return (e = x(this)).offset().top - n - r < 0 }), this.focus(t, e)) : this.focus(t, this.activeMenu.find(this.options.items)[this.active ? "last" : "first"]())) : this.next(t) }, previousPage: function (t) { var e, n, r; this.active ? this.isFirstItem() || (this._hasScroll() ? (n = this.active.offset().top, r = this.element.height(), this.active.preval(".ui-menu-item").each(function () { return 0 < (e = x(this)).offset().top - n + r }), this.focus(t, e)) : this.focus(t, this.activeMenu.find(this.options.items).first())) : this.next(t) }, _hasScroll: function () { return this.element.outerHeight() < this.element.prop("scrollHeight") }, select: function (t) { this.active = this.active || x(t.target).closest(".ui-menu-item"); var e = { item: this.active }; this.active.has(".ui-menu").length || this.collapseAll(t, !0), this._trigger("select", t, e) }, _filterMenuItems: function (t) { var t = t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"), e = new RegExp("^" + t, "i"); return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function () { return e.test(x.trim(x(this).children(".ui-menu-item-wrapper").text())) }) } }), x.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()); var d = !1; function g(e) { return function () { var t = this.element.val(); e.apply(this, arguments), this._refresh(), t !== this.element.val() && this._trigger("change") } } x(document).on("mouseup", function () { d = !1 }), x.widget("ui.mouse", { version: "1.12.1", options: { cancel: "input, textarea, button, select, option", distance: 1, delay: 0 }, _mouseInit: function () { var e = this; this.element.on("mousedown." + this.widgetName, function (t) { return e._mouseDown(t) }).on("click." + this.widgetName, function (t) { if (!0 === x.data(t.target, e.widgetName + ".preventClickEvent")) return x.removeData(t.target, e.widgetName + ".preventClickEvent"), t.stopImmediatePropagation(), !1 }), this.started = !1 }, _mouseDestroy: function () { this.element.off("." + this.widgetName), this._mouseMoveDelegate && this.document.off("mousemove." + this.widgetName, this._mouseMoveDelegate).off("mouseup." + this.widgetName, this._mouseUpDelegate) }, _mouseDown: function (t) { if (!d) { this._mouseMoved = !1, this._mouseStarted && this._mouseUp(t), this._mouseDownEvent = t; var e = this, n = 1 === t.which, r = !("string" != typeof this.options.cancel || !t.target.nodeName) && x(t.target).closest(this.options.cancel).length; return !(n && !r && this._mouseCapture(t)) || (this.mouseDelayMet = !this.options.delay, this.mouseDelayMet || (this._mouseDelayTimer = setTimeout(function () { e.mouseDelayMet = !0 }, this.options.delay)), this._mouseDistanceMet(t) && this._mouseDelayMet(t) && (this._mouseStarted = !1 !== this._mouseStart(t), !this._mouseStarted) ? (t.preventDefault(), !0) : (!0 === x.data(t.target, this.widgetName + ".preventClickEvent") && x.removeData(t.target, this.widgetName + ".preventClickEvent"), this._mouseMoveDelegate = function (t) { return e._mouseMove(t) }, this._mouseUpDelegate = function (t) { return e._mouseUp(t) }, this.document.on("mousemove." + this.widgetName, this._mouseMoveDelegate).on("mouseup." + this.widgetName, this._mouseUpDelegate), t.preventDefault(), d = !0)) } }, _mouseMove: function (t) { if (this._mouseMoved) { if (x.ui.ie && (!document.documentMode || document.documentMode < 9) && !t.button) return this._mouseUp(t); if (!t.which) if (t.originalEvent.altKey || t.originalEvent.ctrlKey || t.originalEvent.metaKey || t.originalEvent.shiftKey) this.ignoreMissingWhich = !0; else if (!this.ignoreMissingWhich) return this._mouseUp(t) } return (t.which || t.button) && (this._mouseMoved = !0), this._mouseStarted ? (this._mouseDrag(t), t.preventDefault()) : (this._mouseDistanceMet(t) && this._mouseDelayMet(t) && (this._mouseStarted = !1 !== this._mouseStart(this._mouseDownEvent, t), this._mouseStarted ? this._mouseDrag(t) : this._mouseUp(t)), !this._mouseStarted) }, _mouseUp: function (t) { this.document.off("mousemove." + this.widgetName, this._mouseMoveDelegate).off("mouseup." + this.widgetName, this._mouseUpDelegate), this._mouseStarted && (this._mouseStarted = !1, t.target === this._mouseDownEvent.target && x.data(t.target, this.widgetName + ".preventClickEvent", !0), this._mouseStop(t)), this._mouseDelayTimer && (clearTimeout(this._mouseDelayTimer), delete this._mouseDelayTimer), this.ignoreMissingWhich = !1, d = !1, t.preventDefault() }, _mouseDistanceMet: function (t) { return Math.max(Math.abs(this._mouseDownEvent.pageX - t.pageX), Math.abs(this._mouseDownEvent.pageY - t.pageY)) >= this.options.distance }, _mouseDelayMet: function () { return this.mouseDelayMet }, _mouseStart: function () { }, _mouseDrag: function () { }, _mouseStop: function () { }, _mouseCapture: function () { return !0 } }), x.widget("ui.selectmenu", [x.ui.formResetMixin, { version: "1.12.1", defaultElement: "<select>", options: { appendTo: null, classes: { "ui-selectmenu-button-open": "ui-corner-top", "ui-selectmenu-button-closed": "ui-corner-all" }, disabled: null, icons: { button: "ui-icon-triangle-1-s" }, position: { my: "left top", at: "left bottom", collision: "none" }, width: !1, change: null, close: null, focus: null, open: null, select: null }, _create: function () { var t = this.element.uniqueId().attr("id"); this.ids = { element: t, button: t + "-button", menu: t + "-menu" }, this._drawButton(), this._drawMenu(), this._bindFormResetHandler(), this._rendered = !1, this.menuItems = x() }, _drawButton: function () { var t, e = this, n = this._parseOption(this.element.find("option:selected"), this.element[0].selectedIndex); this.labels = this.element.labels().attr("for", this.ids.button), this._on(this.labels, { click: function (t) { this.button.focus(), t.preventDefault() } }), this.element.hide(), this.button = x("<span>", { tabindex: this.options.disabled ? -1 : 0, id: this.ids.button, role: "combobox", "aria-expanded": "false", "aria-autocomplete": "list", "aria-owns": this.ids.menu, "aria-haspopup": "true", title: this.element.attr("title") }).insertAfter(this.element), this._addClass(this.button, "ui-selectmenu-button ui-selectmenu-button-closed", "ui-button ui-widget"), t = x("<span>").appendTo(this.button), this._addClass(t, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button), this.buttonItem = this._renderButtonItem(n).appendTo(this.button), !1 !== this.options.width && this._resizeButton(), this._on(this.button, this._buttonEvents), this.button.one("focusin", function () { e._rendered || e._refreshMenu() }) }, _drawMenu: function () { var n = this; this.menu = x("<ul>", { "aria-hidden": "true", "aria-labelledby": this.ids.button, id: this.ids.menu }), this.menuWrap = x("<div>").append(this.menu), this._addClass(this.menuWrap, "ui-selectmenu-menu", "ui-front"), this.menuWrap.appendTo(this._appendTo()), this.menuInstance = this.menu.menu({ classes: { "ui-menu": "ui-corner-bottom" }, role: "listbox", select: function (t, e) { t.preventDefault(), n._setSelection(), n._select(e.item.data("ui-selectmenu-item"), t) }, focus: function (t, e) { e = e.item.data("ui-selectmenu-item"); null != n.focusIndex && e.index !== n.focusIndex && (n._trigger("focus", t, { item: e }), n.isOpen || n._select(e, t)), n.focusIndex = e.index, n.button.attr("aria-activedescendant", n.menuItems.eq(e.index).attr("id")) } }).menu("instance"), this.menuInstance._off(this.menu, "mouseleave"), this.menuInstance._closeOnDocumentClick = function () { return !1 }, this.menuInstance._isDivider = function () { return !1 } }, refresh: function () { this._refreshMenu(), this.buttonItem.replaceWith(this.buttonItem = this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item") || {})), null === this.options.width && this._resizeButton() }, _refreshMenu: function () { var t = this.element.find("option"); this.menu.empty(), this._parseOptions(t), this._renderMenu(this.menu, this.items), this.menuInstance.refresh(), this.menuItems = this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"), this._rendered = !0, t.length && (t = this._getSelectedItem(), this.menuInstance.focus(null, t), this._setAria(t.data("ui-selectmenu-item")), this._setOption("disabled", this.element.prop("disabled"))) }, open: function (t) { this.options.disabled || (this._rendered ? (this._removeClass(this.menu.find(".ui-state-active"), null, "ui-state-active"), this.menuInstance.focus(null, this._getSelectedItem())) : this._refreshMenu(), this.menuItems.length && (this.isOpen = !0, this._toggleAttr(), this._resizeMenu(), this._position(), this._on(this.document, this._documentClick), this._trigger("open", t))) }, _position: function () { this.menuWrap.position(x.extend({ of: this.button }, this.options.position)) }, close: function (t) { this.isOpen && (this.isOpen = !1, this._toggleAttr(), this.range = null, this._off(this.document), this._trigger("close", t)) }, widget: function () { return this.button }, menuWidget: function () { return this.menu }, _renderButtonItem: function (t) { var e = x("<span>"); return this._setText(e, t.label), this._addClass(e, "ui-selectmenu-text"), e }, _renderMenu: function (r, t) { var i = this, o = ""; x.each(t, function (t, e) { var n; e.optgroup !== o && (n = x("<li>", { text: e.optgroup }), i._addClass(n, "ui-selectmenu-optgroup", "ui-menu-divider" + (e.element.parent("optgroup").prop("disabled") ? " ui-state-disabled" : "")), n.appendTo(r), o = e.optgroup), i._renderItemData(r, e) }) }, _renderItemData: function (t, e) { return this._renderItem(t, e).data("ui-selectmenu-item", e) }, _renderItem: function (t, e) { var n = x("<li>"), r = x("<div>", { title: e.element.attr("title") }); return e.disabled && this._addClass(n, null, "ui-state-disabled"), this._setText(r, e.label), n.append(r).appendTo(t) }, _setText: function (t, e) { e ? t.text(e) : t.html("&#160;") }, _move: function (t, e) { var n, r = ".ui-menu-item"; this.isOpen ? n = this.menuItems.eq(this.focusIndex).parent("li") : (n = this.menuItems.eq(this.element[0].selectedIndex).parent("li"), r += ":not(.ui-state-disabled)"), (r = "first" === t || "last" === t ? n["first" === t ? "prevAll" : "nextAll"](r).eq(-1) : n[t + "All"](r).eq(0)).length && this.menuInstance.focus(e, r) }, _getSelectedItem: function () { return this.menuItems.eq(this.element[0].selectedIndex).parent("li") }, _toggle: function (t) { this[this.isOpen ? "close" : "open"](t) }, _setSelection: function () { var t; this.range && (window.getSelection ? ((t = window.getSelection()).removeAllRanges(), t.addRange(this.range)) : this.range.select(), this.button.focus()) }, _documentClick: { mousedown: function (t) { this.isOpen && (x(t.target).closest(".ui-selectmenu-menu, #" + x.ui.escapeSelector(this.ids.button)).length || this.close(t)) } }, _buttonEvents: { mousedown: function () { var t; window.getSelection ? (t = window.getSelection()).rangeCount && (this.range = t.getRangeAt(0)) : this.range = document.selection.createRange() }, click: function (t) { this._setSelection(), this._toggle(t) }, keydown: function (t) { var e = !0; switch (t.keyCode) { case x.ui.keyCode.TAB: case x.ui.keyCode.ESCAPE: this.close(t), e = !1; break; case x.ui.keyCode.ENTER: this.isOpen && this._selectFocusedItem(t); break; case x.ui.keyCode.UP: t.altKey ? this._toggle(t) : this._move("prev", t); break; case x.ui.keyCode.DOWN: t.altKey ? this._toggle(t) : this._move("next", t); break; case x.ui.keyCode.SPACE: this.isOpen ? this._selectFocusedItem(t) : this._toggle(t); break; case x.ui.keyCode.LEFT: this._move("prev", t); break; case x.ui.keyCode.RIGHT: this._move("next", t); break; case x.ui.keyCode.HOME: case x.ui.keyCode.PAGE_UP: this._move("first", t); break; case x.ui.keyCode.END: case x.ui.keyCode.PAGE_DOWN: this._move("last", t); break; default: this.menu.trigger(t), e = !1 }e && t.preventDefault() } }, _selectFocusedItem: function (t) { var e = this.menuItems.eq(this.focusIndex).parent("li"); e.hasClass("ui-state-disabled") || this._select(e.data("ui-selectmenu-item"), t) }, _select: function (t, e) { var n = this.element[0].selectedIndex; this.element[0].selectedIndex = t.index, this.buttonItem.replaceWith(this.buttonItem = this._renderButtonItem(t)), this._setAria(t), this._trigger("select", e, { item: t }), t.index !== n && this._trigger("change", e, { item: t }), this.close(e) }, _setAria: function (t) { t = this.menuItems.eq(t.index).attr("id"); this.button.attr({ "aria-labelledby": t, "aria-activedescendant": t }), this.menu.attr("aria-activedescendant", t) }, _setOption: function (t, e) { var n; "icons" === t && (n = this.button.find("span.ui-icon"), this._removeClass(n, null, this.options.icons.button)._addClass(n, null, e.button)), this._super(t, e), "appendTo" === t && this.menuWrap.appendTo(this._appendTo()), "width" === t && this._resizeButton() }, _setOptionDisabled: function (t) { this._super(t), this.menuInstance.option("disabled", t), this.button.attr("aria-disabled", t), this._toggleClass(this.button, null, "ui-state-disabled", t), this.element.prop("disabled", t), t ? (this.button.attr("tabindex", -1), this.close()) : this.button.attr("tabindex", 0) }, _appendTo: function () { var t = this.options.appendTo; return (t = t && (t.jquery || t.nodeType ? x(t) : this.document.find(t).eq(0))) && t[0] || (t = this.element.closest(".ui-front, dialog")), t.length || (t = this.document[0].body), t }, _toggleAttr: function () { this.button.attr("aria-expanded", this.isOpen), this._removeClass(this.button, "ui-selectmenu-button-" + (this.isOpen ? "closed" : "open"))._addClass(this.button, "ui-selectmenu-button-" + (this.isOpen ? "open" : "closed"))._toggleClass(this.menuWrap, "ui-selectmenu-open", null, this.isOpen), this.menu.attr("aria-hidden", !this.isOpen) }, _resizeButton: function () { var t = this.options.width; !1 !== t ? (null === t && (t = this.element.show().outerWidth(), this.element.hide()), this.button.outerWidth(t)) : this.button.css("width", "") }, _resizeMenu: function () { this.menu.outerWidth(Math.max(this.button.outerWidth(), this.menu.width("").outerWidth() + 1)) }, _getCreateOptions: function () { var t = this._super(); return t.disabled = this.element.prop("disabled"), t }, _parseOptions: function (t) { var n = this, r = []; t.each(function (t, e) { r.push(n._parseOption(x(e), t)) }), this.items = r }, _parseOption: function (t, e) { var n = t.parent("optgroup"); return { element: t, index: e, value: t.val(), label: t.text(), optgroup: n.attr("label") || "", disabled: n.prop("disabled") || t.prop("disabled") } }, _destroy: function () { this._unbindFormResetHandler(), this.menuWrap.remove(), this.button.remove(), this.element.show(), this.element.removeUniqueId(), this.labels.attr("for", this.ids.element) } }]), x.widget("ui.slider", x.ui.mouse, { version: "1.12.1", widgetEventPrefix: "slide", options: { animate: !1, classes: { "ui-slider": "ui-corner-all", "ui-slider-handle": "ui-corner-all", "ui-slider-range": "ui-corner-all ui-widget-header" }, distance: 0, max: 100, min: 0, orientation: "horizontal", range: !1, step: 1, value: 0, values: null, change: null, slide: null, start: null, stop: null }, numPages: 5, _create: function () { this._keySliding = !1, this._mouseSliding = !1, this._animateOff = !0, this._handleIndex = null, this._detectOrientation(), this._mouseInit(), this._calculateNewMax(), this._addClass("ui-slider ui-slider-" + this.orientation, "ui-widget ui-widget-content"), this._refresh(), this._animateOff = !1 }, _refresh: function () { this._createRange(), this._createHandles(), this._setupEvents(), this._refreshValue() }, _createHandles: function () { var t, e = this.options, n = this.element.find(".ui-slider-handle"), r = [], i = e.values && e.values.length || 1; for (n.length > i && (n.slice(i).remove(), n = n.slice(0, i)), t = n.length; t < i; t++)r.push("<span tabindex='0'></span>"); this.handles = n.add(x(r.join("")).appendTo(this.element)), this._addClass(this.handles, "ui-slider-handle", "ui-state-default"), this.handle = this.handles.eq(0), this.handles.each(function (t) { x(this).data("ui-slider-handle-index", t).attr("tabIndex", 0) }) }, _createRange: function () { var t = this.options; t.range ? (!0 === t.range && (t.values ? t.values.length && 2 !== t.values.length ? t.values = [t.values[0], t.values[0]] : x.isArray(t.values) && (t.values = t.values.slice(0)) : t.values = [this._valueMin(), this._valueMin()]), this.range && this.range.length ? (this._removeClass(this.range, "ui-slider-range-min ui-slider-range-max"), this.range.css({ left: "", bottom: "" })) : (this.range = x("<div>").appendTo(this.element), this._addClass(this.range, "ui-slider-range")), "min" !== t.range && "max" !== t.range || this._addClass(this.range, "ui-slider-range-" + t.range)) : (this.range && this.range.remove(), this.range = null) }, _setupEvents: function () { this._off(this.handles), this._on(this.handles, this._handleEvents), this._hoverable(this.handles), this._focusable(this.handles) }, _destroy: function () { this.handles.remove(), this.range && this.range.remove(), this._mouseDestroy() }, _mouseCapture: function (t) { var n, r, i, o, e, s, a = this, u = this.options; return !u.disabled && (this.elementSize = { width: this.element.outerWidth(), height: this.element.outerHeight() }, this.elementOffset = this.element.offset(), s = { x: t.pageX, y: t.pageY }, n = this._normValueFromMouse(s), r = this._valueMax() - this._valueMin() + 1, this.handles.each(function (t) { var e = Math.abs(n - a.values(t)); (e < r || r === e && (t === a._lastChangedValue || a.values(t) === u.min)) && (r = e, i = x(this), o = t) }), !1 !== this._start(t, o) && (this._mouseSliding = !0, this._handleIndex = o, this._addClass(i, null, "ui-state-active"), i.trigger("focus"), e = i.offset(), s = !x(t.target).parents().addBack().is(".ui-slider-handle"), this._clickOffset = s ? { left: 0, top: 0 } : { left: t.pageX - e.left, top: t.pageY - e.top - i.height() / 2 - (parseInt(i.css("borderTopWidth"), 10) || 0) - (parseInt(i.css("borderBottomWidth"), 10) || 0) + (parseInt(i.css("marginTop"), 10) || 0) }, this._animateOff = !0)) }, _mouseStart: function () { return !0 }, _mouseDrag: function (t) { var e = { x: t.pageX, y: t.pageY }, e = this._normValueFromMouse(e); return this._slide(t, this._handleIndex, e), !1 }, _mouseStop: function (t) { return this._removeClass(this.handles, null, "ui-state-active"), this._mouseSliding = !1, this._stop(t, this._handleIndex), this._change(t, this._handleIndex), this._handleIndex = null, this._clickOffset = null, this._animateOff = !1 }, _detectOrientation: function () { this.orientation = "vertical" === this.options.orientation ? "vertical" : "horizontal" }, _normValueFromMouse: function (t) { var e, t = "horizontal" === this.orientation ? (e = this.elementSize.width, t.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0)) : (e = this.elementSize.height, t.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0)); return 1 < (t = t / e) && (t = 1), t < 0 && (t = 0), "vertical" === this.orientation && (t = 1 - t), e = this._valueMax() - this._valueMin(), e = this._valueMin() + t * e, this._trimAlignValue(e) }, _uiHash: function (t, e, n) { var r = { handle: this.handles[t], handleIndex: t, value: void 0 !== e ? e : this.value() }; return this._hasMultipleValues() && (r.value = void 0 !== e ? e : this.values(t), r.values = n || this.values()), r }, _hasMultipleValues: function () { return this.options.values && this.options.values.length }, _start: function (t, e) { return this._trigger("start", t, this._uiHash(e)) }, _slide: function (t, e, n) { var r, i = this.value(), o = this.values(); this._hasMultipleValues() && (r = this.values(e ? 0 : 1), i = this.values(e), 2 === this.options.values.length && !0 === this.options.range && (n = 0 === e ? Math.min(r, n) : Math.max(r, n)), o[e] = n), n !== i && !1 !== this._trigger("slide", t, this._uiHash(e, n, o)) && (this._hasMultipleValues() ? this.values(e, n) : this.value(n)) }, _stop: function (t, e) { this._trigger("stop", t, this._uiHash(e)) }, _change: function (t, e) { this._keySliding || this._mouseSliding || (this._lastChangedValue = e, this._trigger("change", t, this._uiHash(e))) }, value: function (t) { return arguments.length ? (this.options.value = this._trimAlignValue(t), this._refreshValue(), void this._change(null, 0)) : this._value() }, values: function (t, e) { var n, r, i; if (1 < arguments.length) return this.options.values[t] = this._trimAlignValue(e), this._refreshValue(), void this._change(null, t); if (!arguments.length) return this._values(); if (!x.isArray(t)) return this._hasMultipleValues() ? this._values(t) : this.value(); for (n = this.options.values, r = t, i = 0; i < n.length; i += 1)n[i] = this._trimAlignValue(r[i]), this._change(null, i); this._refreshValue() }, _setOption: function (t, e) { var n, r = 0; switch ("range" === t && !0 === this.options.range && ("min" === e ? (this.options.value = this._values(0), this.options.values = null) : "max" === e && (this.options.value = this._values(this.options.values.length - 1), this.options.values = null)), x.isArray(this.options.values) && (r = this.options.values.length), this._super(t, e), t) { case "orientation": this._detectOrientation(), this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-" + this.orientation), this._refreshValue(), this.options.range && this._refreshRange(e), this.handles.css("horizontal" === e ? "bottom" : "left", ""); break; case "value": this._animateOff = !0, this._refreshValue(), this._change(null, 0), this._animateOff = !1; break; case "values": for (this._animateOff = !0, this._refreshValue(), n = r - 1; 0 <= n; n--)this._change(null, n); this._animateOff = !1; break; case "step": case "min": case "max": this._animateOff = !0, this._calculateNewMax(), this._refreshValue(), this._animateOff = !1; break; case "range": this._animateOff = !0, this._refresh(), this._animateOff = !1 } }, _setOptionDisabled: function (t) { this._super(t), this._toggleClass(null, "ui-state-disabled", !!t) }, _value: function () { var t = this.options.value; return this._trimAlignValue(t) }, _values: function (t) { var e, n, r; if (arguments.length) return e = this.options.values[t], this._trimAlignValue(e); if (this._hasMultipleValues()) { for (n = this.options.values.slice(), r = 0; r < n.length; r += 1)n[r] = this._trimAlignValue(n[r]); return n } return [] }, _trimAlignValue: function (t) { if (t <= this._valueMin()) return this._valueMin(); if (t >= this._valueMax()) return this._valueMax(); var e = 0 < this.options.step ? this.options.step : 1, n = (t - this._valueMin()) % e, t = t - n; return 2 * Math.abs(n) >= e && (t += 0 < n ? e : -e), parseFloat(t.toFixed(5)) }, _calculateNewMax: function () { var t = this.options.max, e = this._valueMin(), n = this.options.step; (t = Math.round((t - e) / n) * n + e) > this.options.max && (t -= n), this.max = parseFloat(t.toFixed(this._precision())) }, _precision: function () { var t = this._precisionOf(this.options.step); return null !== this.options.min && (t = Math.max(t, this._precisionOf(this.options.min))), t }, _precisionOf: function (t) { var e = t.toString(), t = e.indexOf("."); return -1 === t ? 0 : e.length - t - 1 }, _valueMin: function () { return this.options.min }, _valueMax: function () { return this.max }, _refreshRange: function (t) { "vertical" === t && this.range.css({ width: "", left: "" }), "horizontal" === t && this.range.css({ height: "", bottom: "" }) }, _refreshValue: function () { var e, n, t, r, i, o = this.options.range, s = this.options, a = this, u = !this._animateOff && s.animate, c = {}; this._hasMultipleValues() ? this.handles.each(function (t) { n = (a.values(t) - a._valueMin()) / (a._valueMax() - a._valueMin()) * 100, c["horizontal" === a.orientation ? "left" : "bottom"] = n + "%", x(this).stop(1, 1)[u ? "animate" : "css"](c, s.animate), !0 === a.options.range && ("horizontal" === a.orientation ? (0 === t && a.range.stop(1, 1)[u ? "animate" : "css"]({ left: n + "%" }, s.animate), 1 === t && a.range[u ? "animate" : "css"]({ width: n - e + "%" }, { queue: !1, duration: s.animate })) : (0 === t && a.range.stop(1, 1)[u ? "animate" : "css"]({ bottom: n + "%" }, s.animate), 1 === t && a.range[u ? "animate" : "css"]({ height: n - e + "%" }, { queue: !1, duration: s.animate }))), e = n }) : (t = this.value(), r = this._valueMin(), i = this._valueMax(), n = i !== r ? (t - r) / (i - r) * 100 : 0, c["horizontal" === this.orientation ? "left" : "bottom"] = n + "%", this.handle.stop(1, 1)[u ? "animate" : "css"](c, s.animate), "min" === o && "horizontal" === this.orientation && this.range.stop(1, 1)[u ? "animate" : "css"]({ width: n + "%" }, s.animate), "max" === o && "horizontal" === this.orientation && this.range.stop(1, 1)[u ? "animate" : "css"]({ width: 100 - n + "%" }, s.animate), "min" === o && "vertical" === this.orientation && this.range.stop(1, 1)[u ? "animate" : "css"]({ height: n + "%" }, s.animate), "max" === o && "vertical" === this.orientation && this.range.stop(1, 1)[u ? "animate" : "css"]({ height: 100 - n + "%" }, s.animate)) }, _handleEvents: { keydown: function (t) { var e, n, r, i = x(t.target).data("ui-slider-handle-index"); switch (t.keyCode) { case x.ui.keyCode.HOME: case x.ui.keyCode.END: case x.ui.keyCode.PAGE_UP: case x.ui.keyCode.PAGE_DOWN: case x.ui.keyCode.UP: case x.ui.keyCode.RIGHT: case x.ui.keyCode.DOWN: case x.ui.keyCode.LEFT: if (t.preventDefault(), !this._keySliding && (this._keySliding = !0, this._addClass(x(t.target), null, "ui-state-active"), !1 === this._start(t, i))) return }switch (r = this.options.step, e = n = this._hasMultipleValues() ? this.values(i) : this.value(), t.keyCode) { case x.ui.keyCode.HOME: n = this._valueMin(); break; case x.ui.keyCode.END: n = this._valueMax(); break; case x.ui.keyCode.PAGE_UP: n = this._trimAlignValue(e + (this._valueMax() - this._valueMin()) / this.numPages); break; case x.ui.keyCode.PAGE_DOWN: n = this._trimAlignValue(e - (this._valueMax() - this._valueMin()) / this.numPages); break; case x.ui.keyCode.UP: case x.ui.keyCode.RIGHT: if (e === this._valueMax()) return; n = this._trimAlignValue(e + r); break; case x.ui.keyCode.DOWN: case x.ui.keyCode.LEFT: if (e === this._valueMin()) return; n = this._trimAlignValue(e - r) }this._slide(t, i, n) }, keyup: function (t) { var e = x(t.target).data("ui-slider-handle-index"); this._keySliding && (this._keySliding = !1, this._stop(t, e), this._change(t, e), this._removeClass(x(t.target), null, "ui-state-active")) } } }), x.widget("ui.spinner", { version: "1.12.1", defaultElement: "<input>", widgetEventPrefix: "spin", options: { classes: { "ui-spinner": "ui-corner-all", "ui-spinner-down": "ui-corner-br", "ui-spinner-up": "ui-corner-tr" }, culture: null, icons: { down: "ui-icon-triangle-1-s", up: "ui-icon-triangle-1-n" }, incremental: !0, max: null, min: null, numberFormat: null, page: 10, step: 1, change: null, spin: null, start: null, stop: null }, _create: function () { this._setOption("max", this.options.max), this._setOption("min", this.options.min), this._setOption("step", this.options.step), "" !== this.value() && this._value(this.element.val(), !0), this._draw(), this._on(this._events), this._refresh(), this._on(this.window, { beforeunload: function () { this.element.removeAttr("autocomplete") } }) }, _getCreateOptions: function () { var r = this._super(), i = this.element; return x.each(["min", "max", "step"], function (t, e) { var n = i.attr(e); null != n && n.length && (r[e] = n) }), r }, _events: { keydown: function (t) { this._start(t) && this._keydown(t) && t.preventDefault() }, keyup: "_stop", focus: function () { this.previous = this.element.val() }, blur: function (t) { this.cancelBlur ? delete this.cancelBlur : (this._stop(), this._refresh(), this.previous !== this.element.val() && this._trigger("change", t)) }, mousewheel: function (t, e) { if (e) { if (!this.spinning && !this._start(t)) return !1; this._spin((0 < e ? 1 : -1) * this.options.step, t), clearTimeout(this.mousewheelTimer), this.mousewheelTimer = this._delay(function () { this.spinning && this._stop(t) }, 100), t.preventDefault() } }, "mousedown .ui-spinner-button": function (t) { var e; function n() { this.element[0] === x.ui.safeActiveElement(this.document[0]) || (this.element.trigger("focus"), this.previous = e, this._delay(function () { this.previous = e })) } e = this.element[0] === x.ui.safeActiveElement(this.document[0]) ? this.previous : this.element.val(), t.preventDefault(), n.call(this), this.cancelBlur = !0, this._delay(function () { delete this.cancelBlur, n.call(this) }), !1 !== this._start(t) && this._repeat(null, x(t.currentTarget).hasClass("ui-spinner-up") ? 1 : -1, t) }, "mouseup .ui-spinner-button": "_stop", "mouseenter .ui-spinner-button": function (t) { if (x(t.currentTarget).hasClass("ui-state-active")) return !1 !== this._start(t) && void this._repeat(null, x(t.currentTarget).hasClass("ui-spinner-up") ? 1 : -1, t) }, "mouseleave .ui-spinner-button": "_stop" }, _enhance: function () { this.uiSpinner = this.element.attr("autocomplete", "off").wrap("<span>").parent().append("<a></a><a></a>") }, _draw: function () { this._enhance(), this._addClass(this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content"), this._addClass("ui-spinner-input"), this.element.attr("role", "spinbutton"), this.buttons = this.uiSpinner.children("a").attr("tabIndex", -1).attr("aria-hidden", !0).button({ classes: { "ui-button": "" } }), this._removeClass(this.buttons, "ui-corner-all"), this._addClass(this.buttons.first(), "ui-spinner-button ui-spinner-up"), this._addClass(this.buttons.last(), "ui-spinner-button ui-spinner-down"), this.buttons.first().button({ icon: this.options.icons.up, showLabel: !1 }), this.buttons.last().button({ icon: this.options.icons.down, showLabel: !1 }), this.buttons.height() > Math.ceil(.5 * this.uiSpinner.height()) && 0 < this.uiSpinner.height() && this.uiSpinner.height(this.uiSpinner.height()) }, _keydown: function (t) { var e = this.options, n = x.ui.keyCode; switch (t.keyCode) { case n.UP: return this._repeat(null, 1, t), !0; case n.DOWN: return this._repeat(null, -1, t), !0; case n.PAGE_UP: return this._repeat(null, e.page, t), !0; case n.PAGE_DOWN: return this._repeat(null, -e.page, t), !0 }return !1 }, _start: function (t) { return !(!this.spinning && !1 === this._trigger("start", t)) && (this.counter || (this.counter = 1), this.spinning = !0) }, _repeat: function (t, e, n) { t = t || 500, clearTimeout(this.timer), this.timer = this._delay(function () { this._repeat(40, e, n) }, t), this._spin(e * this.options.step, n) }, _spin: function (t, e) { var n = this.value() || 0; this.counter || (this.counter = 1), n = this._adjustValue(n + t * this._increment(this.counter)), this.spinning && !1 === this._trigger("spin", e, { value: n }) || (this._value(n), this.counter++) }, _increment: function (t) { var e = this.options.incremental; return e ? x.isFunction(e) ? e(t) : Math.floor(t * t * t / 5e4 - t * t / 500 + 17 * t / 200 + 1) : 1 }, _precision: function () { var t = this._precisionOf(this.options.step); return null !== this.options.min && (t = Math.max(t, this._precisionOf(this.options.min))), t }, _precisionOf: function (t) { var e = t.toString(), t = e.indexOf("."); return -1 === t ? 0 : e.length - t - 1 }, _adjustValue: function (t) { var e, n = this.options, r = t - (e = null !== n.min ? n.min : 0); return t = e + Math.round(r / n.step) * n.step, t = parseFloat(t.toFixed(this._precision())), null !== n.max && t > n.max ? n.max : null !== n.min && t < n.min ? n.min : t }, _stop: function (t) { this.spinning && (clearTimeout(this.timer), clearTimeout(this.mousewheelTimer), this.counter = 0, this.spinning = !1, this._trigger("stop", t)) }, _setOption: function (t, e) { var n; if ("culture" === t || "numberFormat" === t) return n = this._parse(this.element.val()), this.options[t] = e, void this.element.val(this._format(n)); "max" !== t && "min" !== t && "step" !== t || "string" == typeof e && (e = this._parse(e)), "icons" === t && (n = this.buttons.first().find(".ui-icon"), this._removeClass(n, null, this.options.icons.up), this._addClass(n, null, e.up), n = this.buttons.last().find(".ui-icon"), this._removeClass(n, null, this.options.icons.down), this._addClass(n, null, e.down)), this._super(t, e) }, _setOptionDisabled: function (t) { this._super(t), this._toggleClass(this.uiSpinner, null, "ui-state-disabled", !!t), this.element.prop("disabled", !!t), this.buttons.button(t ? "disable" : "enable") }, _setOptions: g(function (t) { this._super(t) }), _parse: function (t) { return "string" == typeof t && "" !== t && (t = window.Globalize && this.options.numberFormat ? Globalize.parseFloat(t, 10, this.options.culture) : +t), "" === t || isNaN(t) ? null : t }, _format: function (t) { return "" === t ? "" : window.Globalize && this.options.numberFormat ? Globalize.format(t, this.options.numberFormat, this.options.culture) : t }, _refresh: function () { this.element.attr({ "aria-valuemin": this.options.min, "aria-valuemax": this.options.max, "aria-valuenow": this._parse(this.element.val()) }) }, isValid: function () { var t = this.value(); return null !== t && t === this._adjustValue(t) }, _value: function (t, e) { var n; "" !== t && null !== (n = this._parse(t)) && (e || (n = this._adjustValue(n)), t = this._format(n)), this.element.val(t), this._refresh() }, _destroy: function () { this.element.prop("disabled", !1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"), this.uiSpinner.replaceWith(this.element) }, stepUp: g(function (t) { this._stepUp(t) }), _stepUp: function (t) { this._start() && (this._spin((t || 1) * this.options.step), this._stop()) }, stepDown: g(function (t) { this._stepDown(t) }), _stepDown: function (t) { this._start() && (this._spin((t || 1) * -this.options.step), this._stop()) }, pageUp: g(function (t) { this._stepUp((t || 1) * this.options.page) }), pageDown: g(function (t) { this._stepDown((t || 1) * this.options.page) }), value: function (t) { if (!arguments.length) return this._parse(this.element.val()); g(this._value).call(this, t) }, widget: function () { return this.uiSpinner } }), !1 !== x.uiBackCompat && x.widget("ui.spinner", x.ui.spinner, { _enhance: function () { this.uiSpinner = this.element.attr("autocomplete", "off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml()) }, _uiSpinnerHtml: function () { return "<span>" }, _buttonHtml: function () { return "<a></a><a></a>" } }), x.ui.spinner }; "function" == typeof define && define.amd ? define(["jquery"], t) : t(jQuery) }(), function (t) { "function" == typeof define && define.amd ? define(["jquery"], t) : "object" == typeof exports ? module.exports = t : t(jQuery) }(function (l) { function e(t) { var e, n = t || window.event, r = g.call(arguments, 1), i = 0, o = 0, s = 0, a = 0, u = 0, c = 0; if ((t = l.event.fix(n)).type = "mousewheel", "detail" in n && (s = -1 * n.detail), "wheelDelta" in n && (s = n.wheelDelta), "wheelDeltaY" in n && (s = n.wheelDeltaY), "wheelDeltaX" in n && (o = -1 * n.wheelDeltaX), "axis" in n && n.axis === n.HORIZONTAL_AXIS && (o = -1 * s, s = 0), i = 0 === s ? o : s, "deltaY" in n && (i = s = -1 * n.deltaY), "deltaX" in n && (o = n.deltaX, 0 === s && (i = -1 * o)), 0 !== s || 0 !== o) { 1 === n.deltaMode ? (i *= e = l.data(this, "mousewheel-line-height"), s *= e, o *= e) : 2 === n.deltaMode && (i *= e = l.data(this, "mousewheel-page-height"), s *= e, o *= e); var a = Math.max(Math.abs(s), Math.abs(o)); return d && !(a < d) || f(n, d = a) && (d /= 40), f(n, a) && (i /= 40, o /= 40, s /= 40), i = Math[1 <= i ? "floor" : "ceil"](i / d), o = Math[1 <= o ? "floor" : "ceil"](o / d), s = Math[1 <= s ? "floor" : "ceil"](s / d), m.settings.normalizeOffset && this.getBoundingClientRect && (a = this.getBoundingClientRect(), u = t.clientX - a.left, c = t.clientY - a.top), t.deltaX = o, t.deltaY = s, t.deltaFactor = d, t.offsetX = u, t.offsetY = c, t.deltaMode = 0, r.unshift(t, i, o, s), p && clearTimeout(p), p = setTimeout(h, 200), (l.event.dispatch || l.event.handle).apply(this, r) } } function h() { d = null } function f(t, e) { return m.settings.adjustOldDeltas && "mousewheel" === t.type && e % 120 == 0 } var p, d, t = ["wheel", "mousewheel", "DOMMouseScroll", "MozMousePixelScroll"], n = "onwheel" in document || 9 <= document.documentMode ? ["wheel"] : ["mousewheel", "DomMouseScroll", "MozMousePixelScroll"], g = Array.prototype.slice; if (l.event.fixHooks) for (var r = t.length; r;)l.event.fixHooks[t[--r]] = l.event.mouseHooks; var m = l.event.special.mousewheel = { version: "3.1.12", setup: function () { if (this.addEventListener) for (var t = n.length; t;)this.addEventListener(n[--t], e, !1); else this.onmousewheel = e; l.data(this, "mousewheel-line-height", m.getLineHeight(this)), l.data(this, "mousewheel-page-height", m.getPageHeight(this)) }, teardown: function () { if (this.removeEventListener) for (var t = n.length; t;)this.removeEventListener(n[--t], e, !1); else this.onmousewheel = null; l.removeData(this, "mousewheel-line-height"), l.removeData(this, "mousewheel-page-height") }, getLineHeight: function (t) { var e = l(t), t = e["offsetParent" in l.fn ? "offsetParent" : "parent"](); return t.length || (t = l("body")), parseInt(t.css("fontSize"), 10) || parseInt(e.css("fontSize"), 10) || 16 }, getPageHeight: function (t) { return l(t).height() }, settings: { adjustOldDeltas: !0, normalizeOffset: !0 } }; l.fn.extend({ mousewheel: function (t) { return t ? this.bind("mousewheel", t) : this.trigger("mousewheel") }, unmousewheel: function (t) { return this.unbind("mousewheel", t) } }) }), function (t) { var e; "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : ("undefined" != typeof window ? e = window : "undefined" != typeof global ? e = global : "undefined" != typeof self && (e = self), e.html2canvas = t()) }(function () { return function r(i, o, s) { function a(n, t) { if (!o[n]) { if (!i[n]) { var e = "function" == typeof require && require; if (!t && e) return e(n, !0); if (u) return u(n, !0); e = new Error("Cannot find module '" + n + "'"); throw e.code = "MODULE_NOT_FOUND", e } e = o[n] = { exports: {} }; i[n][0].call(e.exports, function (t) { var e = i[n][1][t]; return a(e || t) }, e, e.exports, r, i, o, s) } return o[n].exports } for (var u = "function" == typeof require && require, t = 0; t < s.length; t++)a(s[t]); return a }({ 1: [function (t, P, N) { (function (j) { !function (t) { function v(t) { throw RangeError(g[t]) } function n(t, e) { for (var n = t.length; n--;)t[n] = e(t[n]); return t } function e(t, e) { return n(t.split(p), e).join(".") } function y(t) { for (var e, n, r = [], i = 0, o = t.length; i < o;)55296 <= (e = t.charCodeAt(i++)) && e <= 56319 && i < o ? 56320 == (64512 & (n = t.charCodeAt(i++))) ? r.push(((1023 & e) << 10) + (1023 & n) + 65536) : (r.push(e), i--) : r.push(e); return r } function d(t) { return n(t, function (t) { var e = ""; return 65535 < t && (e += A((t -= 65536) >>> 10 & 1023 | 55296), t = 56320 | 1023 & t), e + A(t) }).join("") } function b(t, e) { return t + 22 + 75 * (t < 26) - ((0 != e) << 5) } function w(t, e, n) { var r = 0; for (t = n ? T(t / l) : t >> 1, t += T(t / e); m * k >> 1 < t; r += x)t = T(t / m); return T(r + (m + 1) * t / (t + c)) } function r(t) { var e, n, r, i, o, s, a, u = [], c = t.length, l = 0, h = O, f = S, p = t.lastIndexOf(E); for (p < 0 && (p = 0), n = 0; n < p; ++n)128 <= t.charCodeAt(n) && v("not-basic"), u.push(t.charCodeAt(n)); for (r = 0 < p ? p + 1 : 0; r < c;) { for (i = l, o = 1, s = x; c <= r && v("invalid-input"), a = t.charCodeAt(r++), (x <= (a = a - 48 < 10 ? a - 22 : a - 65 < 26 ? a - 65 : a - 97 < 26 ? a - 97 : x) || a > T((_ - l) / o)) && v("overflow"), l += a * o, !(a < (a = s <= f ? C : f + k <= s ? k : s - f)); s += x)o > T(_ / (a = x - a)) && v("overflow"), o *= a; f = w(l - i, e = u.length + 1, 0 == i), T(l / e) > _ - h && v("overflow"), h += T(l / e), l %= e, u.splice(l++, 0, h) } return d(u) } function i(t) { for (var e, n, r, i, o, s, a, u, c, l, h, f = [], p = (t = y(t)).length, d = O, g = S, m = e = 0; m < p; ++m)(u = t[m]) < 128 && f.push(A(u)); for (n = r = f.length, r && f.push(E); n < p;) { for (i = _, m = 0; m < p; ++m)d <= (u = t[m]) && u < i && (i = u); for (i - d > T((_ - e) / (c = n + 1)) && v("overflow"), e += (i - d) * c, d = i, m = 0; m < p; ++m)if ((u = t[m]) < d && ++e > _ && v("overflow"), u == d) { for (o = e, s = x; !(o < (a = s <= g ? C : g + k <= s ? k : s - g)); s += x)h = o - a, l = x - a, f.push(A(b(a + h % l, 0))), o = T(h / l); f.push(A(b(o, 0))), g = w(e, c, n == r), e = 0, ++n } ++e, ++d } return f.join("") } var o = "object" == typeof N && N, s = "object" == typeof P && P && P.exports == o && P, a = "object" == typeof j && j; a.global !== a && a.window !== a || (t = a); var u, _ = 2147483647, x = 36, C = 1, k = 26, c = 38, l = 700, S = 72, O = 128, E = "-", h = /^xn--/, f = /[^ -~]/, p = /\x2E|\u3002|\uFF0E|\uFF61/g, g = { overflow: "Overflow: input needs wider integers to process", "not-basic": "Illegal input >= 0x80 (not a basic code point)", "invalid-input": "Invalid input" }, m = x - C, T = Math.floor, A = String.fromCharCode, I = { version: "1.2.4", ucs2: { decode: y, encode: d }, decode: r, encode: i, toASCII: function (t) { return e(t, function (t) { return f.test(t) ? "xn--" + i(t) : t }) }, toUnicode: function (t) { return e(t, function (t) { return h.test(t) ? r(t.slice(4).toLowerCase()) : t }) } }; if (0, o && !o.nodeType) if (s) s.exports = I; else for (u in I) I.hasOwnProperty(u) && (o[u] = I[u]); else t.punycode = I }(this) }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}], 2: [function (t, e) { function i(t, e) { for (var n = 3 === t.nodeType ? document.createTextNode(t.nodeValue) : t.cloneNode(!1), r = t.firstChild; r;)!0 !== e && 1 === r.nodeType && "SCRIPT" === r.nodeName || n.appendChild(i(r, e)), r = r.nextSibling; return 1 === t.nodeType && (n._scrollTop = t.scrollTop, n._scrollLeft = t.scrollLeft, "CANVAS" === t.nodeName ? function (e, t) { try { t && (t.width = e.width, t.height = e.height, t.getContext("2d").putImageData(e.getContext("2d").getImageData(0, 0, e.width, e.height), 0, 0)) } catch (t) { o("Unable to copy canvas content from", e, t) } }(t, n) : "TEXTAREA" !== t.nodeName && "SELECT" !== t.nodeName || (n.value = t.value)), n } var o = t("./log"); e.exports = function (o, t, e, n, s, a, u) { var c = i(o.documentElement, s.javascriptEnabled), l = t.createElement("iframe"); return l.className = "html2canvas-container", l.style.visibility = "hidden", l.style.position = "fixed", l.style.left = "-10000px", l.style.top = "0px", l.style.border = "0", l.width = e, l.height = n, l.scrolling = "no", t.body.appendChild(l), new Promise(function (e) { var t, n, r, i = l.contentWindow.document; l.contentWindow.onload = l.onload = function () { var t = setInterval(function () { 0 < i.body.childNodes.length && (function t(e) { if (1 === e.nodeType) { e.scrollTop = e._scrollTop, e.scrollLeft = e._scrollLeft; for (var n = e.firstChild; n;)t(n), n = n.nextSibling } }(i.documentElement), clearInterval(t), "view" === s.type && (l.contentWindow.scrollTo(a, u), !/(iPad|iPhone|iPod)/g.test(navigator.userAgent) || l.contentWindow.scrollY === u && l.contentWindow.scrollX === a || (i.documentElement.style.top = -u + "px", i.documentElement.style.left = -a + "px", i.documentElement.style.position = "absolute")), e(l)) }, 50) }, i.open(), i.write("<!DOCTYPE html><html></html>"), n = a, r = u, !(t = o).defaultView || n === t.defaultView.pageXOffset && r === t.defaultView.pageYOffset || t.defaultView.scrollTo(n, r), i.replaceChild(i.adoptNode(c), i.documentElement), i.close() }) } }, { "./log": 13 }], 3: [function (t, e) { function n(t) { this.r = 0, this.g = 0, this.b = 0, this.a = null, this.fromArray(t) || this.namedColor(t) || this.rgb(t) || this.rgba(t) || this.hex6(t) || this.hex3(t) } n.prototype.darken = function (t) { t = 1 - t; return new n([Math.round(this.r * t), Math.round(this.g * t), Math.round(this.b * t), this.a]) }, n.prototype.isTransparent = function () { return 0 === this.a }, n.prototype.isBlack = function () { return 0 === this.r && 0 === this.g && 0 === this.b }, n.prototype.fromArray = function (t) { return Array.isArray(t) && (this.r = Math.min(t[0], 255), this.g = Math.min(t[1], 255), this.b = Math.min(t[2], 255), 3 < t.length && (this.a = t[3])), Array.isArray(t) }; var r = /^#([a-f0-9]{3})$/i; n.prototype.hex3 = function (t) { var e; return null !== (e = t.match(r)) && (this.r = parseInt(e[1][0] + e[1][0], 16), this.g = parseInt(e[1][1] + e[1][1], 16), this.b = parseInt(e[1][2] + e[1][2], 16)), null !== e }; var i = /^#([a-f0-9]{6})$/i; n.prototype.hex6 = function (t) { var e = null; return null !== (e = t.match(i)) && (this.r = parseInt(e[1].substring(0, 2), 16), this.g = parseInt(e[1].substring(2, 4), 16), this.b = parseInt(e[1].substring(4, 6), 16)), null !== e }; var o = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/; n.prototype.rgb = function (t) { var e; return null !== (e = t.match(o)) && (this.r = Number(e[1]), this.g = Number(e[2]), this.b = Number(e[3])), null !== e }; var s = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/; n.prototype.rgba = function (t) { var e; return null !== (e = t.match(s)) && (this.r = Number(e[1]), this.g = Number(e[2]), this.b = Number(e[3]), this.a = Number(e[4])), null !== e }, n.prototype.toString = function () { return null !== this.a && 1 !== this.a ? "rgba(" + [this.r, this.g, this.b, this.a].join(",") + ")" : "rgb(" + [this.r, this.g, this.b].join(",") + ")" }, n.prototype.namedColor = function (t) { t = t.toLowerCase(); var e = a[t]; if (e) this.r = e[0], this.g = e[1], this.b = e[2]; else if ("transparent" === t) return !(this.r = this.g = this.b = this.a = 0); return !!e }, n.prototype.isColor = !0; var a = { aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255], aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220], bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205], blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42], burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0], chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237], cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11], darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139], darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209], darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255], dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255], firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34], fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255], gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128], green: [0, 128, 0], greenyellow: [173, 255, 47], grey: [128, 128, 128], honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92], indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140], lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0], lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128], lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250], lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222], lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50], linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0], mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211], mediumpurple: [147, 112, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238], mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133], midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225], moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128], oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35], orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214], palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238], palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185], peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221], powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153], red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225], saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96], seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45], silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205], slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250], springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140], teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71], turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179], white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0], yellowgreen: [154, 205, 50] }; e.exports = n }, {}], 4: [function (t, e) { function n(t, e) { var n, r, i = C++; if ((e = e || {}).logging && (y.options.logging = !0, y.options.start = Date.now()), e.async = void 0 === e.async || e.async, e.allowTaint = void 0 !== e.allowTaint && e.allowTaint, e.removeContainer = void 0 === e.removeContainer || e.removeContainer, e.javascriptEnabled = void 0 !== e.javascriptEnabled && e.javascriptEnabled, e.imageTimeout = void 0 === e.imageTimeout ? 1e4 : e.imageTimeout, e.renderer = "function" == typeof e.renderer ? e.renderer : g, e.strict = !!e.strict, "string" == typeof t) { if ("string" != typeof e.proxy) return Promise.reject("Proxy must be used when rendering url"); var o = null != e.width ? e.width : window.innerWidth, s = null != e.height ? e.height : window.innerHeight; return w((n = t, (r = document.createElement("a")).href = n, r.href = r.href, r), e.proxy, document, o, s, e).then(function (t) { return f(t.contentWindow.document.documentElement, t, e, o, s) }) } var a, u, c, l, h, t = (void 0 === t ? [document.documentElement] : t.length ? t : [t])[0]; return t.setAttribute(x + i, i), a = t.ownerDocument, u = e, c = t.ownerDocument.defaultView.innerWidth, l = t.ownerDocument.defaultView.innerHeight, h = i, b(a, a, c, l, u, a.defaultView.pageXOffset, a.defaultView.pageYOffset).then(function (t) { y("Document cloned"); var e = x + h, n = "[" + e + "='" + h + "']"; a.querySelector(n).removeAttribute(e); var e = t.contentWindow, r = e.document.querySelector(n); return Promise.resolve("function" != typeof u.onclone || u.onclone(e.document)).then(function () { return f(r, t, u, c, l) }) }).then(function (t) { return "function" == typeof e.onrendered && (y("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"), e.onrendered(t)), t }) } function f(n, r, i, t, e) { var o, s, a = r.contentWindow, u = new d(a.document), c = new m(i, u), l = _(n), s = "view" === i.type ? t : (s = a.document, Math.max(Math.max(s.body.scrollWidth, s.documentElement.scrollWidth), Math.max(s.body.offsetWidth, s.documentElement.offsetWidth), Math.max(s.body.clientWidth, s.documentElement.clientWidth))), o = "view" === i.type ? e : (o = a.document, Math.max(Math.max(o.body.scrollHeight, o.documentElement.scrollHeight), Math.max(o.body.offsetHeight, o.documentElement.offsetHeight), Math.max(o.body.clientHeight, o.documentElement.clientHeight))), h = new i.renderer(s, o, c, i, document); return new v(n, h, u, c, i).ready.then(function () { var t, e; return y("Finished rendering"), t = "view" === i.type ? p(h.canvas, { width: h.canvas.width, height: h.canvas.height, top: 0, left: 0, x: 0, y: 0 }) : n === a.document.body || n === a.document.documentElement || null != i.canvas ? h.canvas : p(h.canvas, { width: (null != i.width ? i : l).width, height: (null != i.height ? i : l).height, top: l.top, left: l.left, x: 0, y: 0 }), e = r, i.removeContainer && (e.parentNode.removeChild(e), y("Cleaned up container")), t }) } function p(t, e) { var n = document.createElement("canvas"), r = Math.min(t.width - 1, Math.max(0, e.left)), i = Math.min(t.width, Math.max(1, e.left + e.width)), o = Math.min(t.height - 1, Math.max(0, e.top)), s = Math.min(t.height, Math.max(1, e.top + e.height)); n.width = e.width, n.height = e.height; i -= r, s -= o; return y("Cropping canvas at:", "left:", e.left, "top:", e.top, "width:", i, "height:", s), y("Resulting crop with width", e.width, "and height", e.height, "with x", r, "and y", o), n.getContext("2d").drawImage(t, r, o, i, s, e.x, e.y, i, s), n } var d = t("./support"), g = t("./renderers/canvas"), m = t("./imageloader"), v = t("./nodeparser"), r = t("./nodecontainer"), y = t("./log"), i = t("./utils"), b = t("./clone"), w = t("./proxy").loadUrlDocument, _ = i.getBounds, x = "data-html2canvas-node", C = 0; n.CanvasRenderer = g, n.NodeContainer = r, n.log = y, n.utils = i; i = "undefined" == typeof document || "function" != typeof Object.create || "function" != typeof document.createElement("canvas").getContext ? function () { return Promise.reject("No canvas support") } : n; e.exports = i }, { "./clone": 2, "./imageloader": 11, "./log": 13, "./nodecontainer": 14, "./nodeparser": 15, "./proxy": 16, "./renderers/canvas": 20, "./support": 22, "./utils": 26 }], 5: [function (t, e) { function r(t) { var n; this.src = t, i("DummyImageContainer for", t), this.promise && this.image || (i("Initiating DummyImageContainer"), r.prototype.image = new Image, n = this.image, r.prototype.promise = new Promise(function (t, e) { n.onload = t, n.onerror = e, n.src = o(), !0 === n.complete && t(n) })) } var i = t("./log"), o = t("./utils").smallImage; e.exports = r }, { "./log": 13, "./utils": 26 }], 6: [function (t, e) { var s = t("./utils").smallImage; e.exports = function (t, e) { var n = document.createElement("div"), r = document.createElement("img"), i = document.createElement("span"), o = "Hidden Text"; n.style.visibility = "hidden", n.style.fontFamily = t, n.style.fontSize = e, n.style.margin = 0, n.style.padding = 0, document.body.appendChild(n), r.src = s(), r.width = 1, r.height = 1, r.style.margin = 0, r.style.padding = 0, r.style.verticalAlign = "baseline", i.style.fontFamily = t, i.style.fontSize = e, i.style.margin = 0, i.style.padding = 0, i.appendChild(document.createTextNode(o)), n.appendChild(i), n.appendChild(r), e = r.offsetTop - i.offsetTop + 1, n.removeChild(i), n.appendChild(document.createTextNode(o)), n.style.lineHeight = "normal", r.style.verticalAlign = "super", r = r.offsetTop - n.offsetTop + 1, document.body.removeChild(n), this.baseline = e, this.lineWidth = 1, this.middle = r } }, { "./utils": 26 }], 7: [function (t, e) { function n() { this.data = {} } var r = t("./font"); n.prototype.getMetrics = function (t, e) { return void 0 === this.data[t + "-" + e] && (this.data[t + "-" + e] = new r(t, e)), this.data[t + "-" + e] }, e.exports = n }, { "./font": 6 }], 8: [function (o, t) { function e(e, t, n) { this.image = null, this.src = e; var r = this, i = s(e); this.promise = (t ? new Promise(function (t) { "about:blank" === e.contentWindow.document.URL || null == e.contentWindow.document.documentElement ? e.contentWindow.onload = e.onload = function () { t(e) } : t(e) }) : this.proxyLoad(n.proxy, i, n)).then(function (t) { return o("./core")(t.contentWindow.document.documentElement, { type: "view", width: t.width, height: t.height, proxy: n.proxy, javascriptEnabled: n.javascriptEnabled, removeContainer: n.removeContainer, allowTaint: n.allowTaint, imageTimeout: n.imageTimeout / 2 }) }).then(function (t) { return r.image = t }) } var s = o("./utils").getBounds, i = o("./proxy").loadUrlDocument; e.prototype.proxyLoad = function (t, e, n) { var r = this.src; return i(r.src, t, r.ownerDocument, e.width, e.height, n) }, t.exports = e }, { "./core": 4, "./proxy": 16, "./utils": 26 }], 9: [function (t, e) { function n(t) { this.src = t.value, this.colorStops = [], this.type = null, this.x0 = .5, this.y0 = .5, this.x1 = .5, this.y1 = .5, this.promise = Promise.resolve(!0) } n.TYPES = { LINEAR: 1, RADIAL: 2 }, n.REGEXP_COLORSTOP = /^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i, e.exports = n }, {}], 10: [function (t, e) { e.exports = function (n, r) { this.src = n, this.image = new Image; var i = this; this.tainted = null, this.promise = new Promise(function (t, e) { i.image.onload = t, i.image.onerror = e, r && (i.image.crossOrigin = "anonymous"), i.image.src = n, !0 === i.image.complete && t(i.image) }) } }, {}], 11: [function (t, e) { function n(t, e) { this.link = null, this.options = t, this.support = e, this.origin = this.getOrigin(window.location.href) } var o = t("./log"), r = t("./imagecontainer"), i = t("./dummyimagecontainer"), s = t("./proxyimagecontainer"), a = t("./framecontainer"), u = t("./svgcontainer"), c = t("./svgnodecontainer"), l = t("./lineargradientcontainer"), h = t("./webkitgradientcontainer"), f = t("./utils").bind; n.prototype.findImages = function (t) { var e = []; return t.reduce(function (t, e) { switch (e.node.nodeName) { case "IMG": return t.concat([{ args: [e.node.src], method: "url" }]); case "svg": case "IFRAME": return t.concat([{ args: [e.node], method: e.node.nodeName }]) }return t }, []).forEach(this.addImage(e, this.loadImage), this), e }, n.prototype.findBackgroundImage = function (t, e) { return e.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(t, this.loadImage), this), t }, n.prototype.addImage = function (n, r) { return function (e) { e.args.forEach(function (t) { this.imageExists(n, t) || (n.splice(0, 0, r.call(this, e)), o("Added image #" + n.length, "string" == typeof t ? t.substring(0, 100) : t)) }, this) } }, n.prototype.hasImageBackground = function (t) { return "none" !== t.method }, n.prototype.loadImage = function (t) { if ("url" !== t.method) return "linear-gradient" === t.method ? new l(t) : "gradient" === t.method ? new h(t) : "svg" === t.method ? new c(t.args[0], this.support.svg) : "IFRAME" === t.method ? new a(t.args[0], this.isSameOrigin(t.args[0].src), this.options) : new i(t); t = t.args[0]; return !this.isSVG(t) || this.support.svg || this.options.allowTaint ? t.match(/data:image\/.*;base64,/i) ? new r(t.replace(/url\(['"]{0,}|['"]{0,}\)$/gi, ""), !1) : this.isSameOrigin(t) || !0 === this.options.allowTaint || this.isSVG(t) ? new r(t, !1) : this.support.cors && !this.options.allowTaint && this.options.useCORS ? new r(t, !0) : this.options.proxy ? new s(t, this.options.proxy) : new i(t) : new u(t) }, n.prototype.isSVG = function (t) { return "svg" === t.substring(t.length - 3).toLowerCase() || u.prototype.isInline(t) }, n.prototype.imageExists = function (t, e) { return t.some(function (t) { return t.src === e }) }, n.prototype.isSameOrigin = function (t) { return this.getOrigin(t) === this.origin }, n.prototype.getOrigin = function (t) { var e = this.link || (this.link = document.createElement("a")); return e.href = t, e.href = e.href, e.protocol + e.hostname + e.port }, n.prototype.getPromise = function (e) { return this.timeout(e, this.options.imageTimeout).catch(function () { return new i(e.src).promise.then(function (t) { e.image = t }) }) }, n.prototype.get = function (e) { var n = null; return this.images.some(function (t) { return (n = t).src === e }) ? n : null }, n.prototype.fetch = function (t) { return this.images = t.reduce(f(this.findBackgroundImage, this), this.findImages(t)), this.images.forEach(function (e, n) { e.promise.then(function () { o("Succesfully loaded image #" + (n + 1), e) }, function (t) { o("Failed loading image #" + (n + 1), e, t) }) }), this.ready = Promise.all(this.images.map(this.getPromise, this)), o("Finished searching images"), this }, n.prototype.timeout = function (n, r) { var i, t = Promise.race([n.promise, new Promise(function (t, e) { i = setTimeout(function () { o("Timed out loading image", n), e(n) }, r) })]).then(function (t) { return clearTimeout(i), t }); return t.catch(function () { clearTimeout(i) }), t }, e.exports = n }, { "./dummyimagecontainer": 5, "./framecontainer": 8, "./imagecontainer": 10, "./lineargradientcontainer": 12, "./log": 13, "./proxyimagecontainer": 17, "./svgcontainer": 23, "./svgnodecontainer": 24, "./utils": 26, "./webkitgradientcontainer": 27 }], 12: [function (t, e) { function n(t) { r.apply(this, arguments), this.type = r.TYPES.LINEAR; var e = n.REGEXP_DIRECTION.test(t.args[0]) || !r.REGEXP_COLORSTOP.test(t.args[0]); e ? t.args[0].split(/\s+/).reverse().forEach(function (t, e) { switch (t) { case "left": this.x0 = 0, this.x1 = 1; break; case "top": this.y0 = 0, this.y1 = 1; break; case "right": this.x0 = 1, this.x1 = 0; break; case "bottom": this.y0 = 1, this.y1 = 0; break; case "to": var n = this.y0, r = this.x0; this.y0 = this.y1, this.x0 = this.x1, this.x1 = r, this.y1 = n; break; case "center": break; default: n = .01 * parseFloat(t, 10); if (isNaN(n)) break; 0 === e ? (this.y0 = n, this.y1 = 1 - this.y0) : (this.x0 = n, this.x1 = 1 - this.x0) } }, this) : (this.y0 = 0, this.y1 = 1), this.colorStops = t.args.slice(e ? 1 : 0).map(function (t) { var e = t.match(r.REGEXP_COLORSTOP), n = +e[2], t = 0 == n ? "%" : e[3]; return { color: new i(e[1]), stop: "%" === t ? n / 100 : null } }), null === this.colorStops[0].stop && (this.colorStops[0].stop = 0), null === this.colorStops[this.colorStops.length - 1].stop && (this.colorStops[this.colorStops.length - 1].stop = 1), this.colorStops.forEach(function (n, r) { null === n.stop && this.colorStops.slice(r).some(function (t, e) { return null !== t.stop && (n.stop = (t.stop - this.colorStops[r - 1].stop) / (e + 1) + this.colorStops[r - 1].stop, !0) }, this) }, this) } var r = t("./gradientcontainer"), i = t("./color"); n.prototype = Object.create(r.prototype), n.REGEXP_DIRECTION = /^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i, e.exports = n }, { "./color": 3, "./gradientcontainer": 9 }], 13: [function (t, e) { var n = function () { n.options.logging && window.console && window.console.log && Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - n.options.start + "ms", "html2canvas:"].concat([].slice.call(arguments, 0))) }; n.options = { logging: !1 }, e.exports = n }, {}], 14: [function (t, e) { function n(t, e) { this.node = t, this.parent = e, this.stack = null, this.bounds = null, this.borders = null, this.clip = [], this.backgroundClip = [], this.offsetBounds = null, this.visible = null, this.computedStyles = null, this.colors = {}, this.styles = {}, this.backgroundImages = null, this.transformData = null, this.transformMatrix = null, this.isPseudoElement = !1, this.opacity = null } function s(t) { return -1 !== t.toString().indexOf("%") } function r(t) { return t.replace("px", "") } function i(t) { return parseFloat(t) } var o = t("./color"), t = t("./utils"), a = t.getBounds, u = t.parseBackgrounds, c = t.offsetBounds; n.prototype.cloneTo = function (t) { t.visible = this.visible, t.borders = this.borders, t.bounds = this.bounds, t.clip = this.clip, t.backgroundClip = this.backgroundClip, t.computedStyles = this.computedStyles, t.styles = this.styles, t.backgroundImages = this.backgroundImages, t.opacity = this.opacity }, n.prototype.getOpacity = function () { return null === this.opacity ? this.opacity = this.cssFloat("opacity") : this.opacity }, n.prototype.assignStack = function (t) { (this.stack = t).children.push(this) }, n.prototype.isElementVisible = function () { return this.node.nodeType === Node.TEXT_NODE ? this.parent.visible : "none" !== this.css("display") && "hidden" !== this.css("visibility") && !this.node.hasAttribute("data-html2canvas-ignore") && ("INPUT" !== this.node.nodeName || "hidden" !== this.node.getAttribute("type")) }, n.prototype.css = function (t) { return this.computedStyles || (this.computedStyles = this.isPseudoElement ? this.parent.computedStyle(this.before ? ":before" : ":after") : this.computedStyle(null)), this.styles[t] || (this.styles[t] = this.computedStyles[t]) }, n.prototype.prefixedCss = function (e) { var n = this.css(e); return void 0 === n && ["webkit", "moz", "ms", "o"].some(function (t) { return void 0 !== (n = this.css(t + e.substr(0, 1).toUpperCase() + e.substr(1))) }, this), void 0 === n ? null : n }, n.prototype.computedStyle = function (t) { return this.node.ownerDocument.defaultView.getComputedStyle(this.node, t) }, n.prototype.cssInt = function (t) { t = parseInt(this.css(t), 10); return isNaN(t) ? 0 : t }, n.prototype.color = function (t) { return this.colors[t] || (this.colors[t] = new o(this.css(t))) }, n.prototype.cssFloat = function (t) { t = parseFloat(this.css(t)); return isNaN(t) ? 0 : t }, n.prototype.fontWeight = function () { var t = this.css("fontWeight"); switch (parseInt(t, 10)) { case 401: t = "bold"; break; case 400: t = "normal" }return t }, n.prototype.parseClip = function () { var t = this.css("clip").match(this.CLIP); return t ? { top: parseInt(t[1], 10), right: parseInt(t[2], 10), bottom: parseInt(t[3], 10), left: parseInt(t[4], 10) } : null }, n.prototype.parseBackgroundImages = function () { return this.backgroundImages || (this.backgroundImages = u(this.css("backgroundImage"))) }, n.prototype.cssList = function (t, e) { t = (this.css(t) || "").split(","); return 1 === (t = (t = t[e || 0] || t[0] || "auto").trim().split(" ")).length && (t = [t[0], s(t[0]) ? "auto" : t[0]]), t }, n.prototype.parseBackgroundSize = function (t, e, n) { var r, i = this.cssList("backgroundSize", n); if (s(i[0])) r = t.width * parseFloat(i[0]) / 100; else { if (/contain|cover/.test(i[0])) { var o = t.width / t.height, n = e.width / e.height; return o < n ^ "contain" === i[0] ? { width: t.height * n, height: t.height } : { width: t.width, height: t.width / n } } r = parseInt(i[0], 10) } return t = "auto" === i[0] && "auto" === i[1] ? e.height : "auto" === i[1] ? r / e.width * e.height : s(i[1]) ? t.height * parseFloat(i[1]) / 100 : parseInt(i[1], 10), "auto" === i[0] && (r = t / e.height * e.width), { width: r, height: t } }, n.prototype.parseBackgroundPosition = function (t, e, n, r) { var i = this.cssList("backgroundPosition", n), n = s(i[0]) ? (t.width - (r || e).width) * (parseFloat(i[0]) / 100) : parseInt(i[0], 10), r = "auto" === i[1] ? n / e.width * e.height : s(i[1]) ? (t.height - (r || e).height) * parseFloat(i[1]) / 100 : parseInt(i[1], 10); return "auto" === i[0] && (n = r / e.height * e.width), { left: n, top: r } }, n.prototype.parseBackgroundRepeat = function (t) { return this.cssList("backgroundRepeat", t)[0] }, n.prototype.parseTextShadows = function () { var t = this.css("textShadow"), e = []; if (t && "none" !== t) for (var n = t.match(this.TEXT_SHADOW_PROPERTY), r = 0; n && r < n.length; r++) { var i = n[r].match(this.TEXT_SHADOW_VALUES); e.push({ color: new o(i[0]), offsetX: i[1] ? parseFloat(i[1].replace("px", "")) : 0, offsetY: i[2] ? parseFloat(i[2].replace("px", "")) : 0, blur: i[3] ? i[3].replace("px", "") : 0 }) } return e }, n.prototype.parseTransform = function () { var t, e; return this.transformData || (this.hasTransform() ? (t = this.parseBounds(), (e = this.prefixedCss("transformOrigin").split(" ").map(r).map(i))[0] += t.left, e[1] += t.top, this.transformData = { origin: e, matrix: this.parseTransformMatrix() }) : this.transformData = { origin: [0, 0], matrix: [1, 0, 0, 1, 0, 0] }), this.transformData }, n.prototype.parseTransformMatrix = function () { var t; return this.transformMatrix || (t = (t = this.prefixedCss("transform")) ? function (t) { if (t && "matrix" === t[1]) return t[2].split(",").map(function (t) { return parseFloat(t.trim()) }); if (t && "matrix3d" === t[1]) { t = t[2].split(",").map(function (t) { return parseFloat(t.trim()) }); return [t[0], t[1], t[4], t[5], t[12], t[13]] } }(t.match(this.MATRIX_PROPERTY)) : null, this.transformMatrix = t || [1, 0, 0, 1, 0, 0]), this.transformMatrix }, n.prototype.parseBounds = function () { return this.bounds || (this.bounds = (this.hasTransform() ? c : a)(this.node)) }, n.prototype.hasTransform = function () { return "1,0,0,1,0,0" !== this.parseTransformMatrix().join(",") || this.parent && this.parent.hasTransform() }, n.prototype.getValue = function () { var t, e = this.node.value || ""; return "SELECT" === this.node.tagName ? e = (t = (t = this.node).options[t.selectedIndex || 0]) && t.text || "" : "password" === this.node.type && (e = Array(e.length + 1).join("•")), 0 === e.length ? this.node.placeholder || "" : e }, n.prototype.MATRIX_PROPERTY = /(matrix|matrix3d)\((.+)\)/, n.prototype.TEXT_SHADOW_PROPERTY = /((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g, n.prototype.TEXT_SHADOW_VALUES = /(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g, n.prototype.CLIP = /^rect\((\d+)px,? (\d+)px,? (\d+)px,? (\d+)px\)$/, e.exports = n }, { "./color": 3, "./utils": 26 }], 15: [function (t, e) { function n(t, e, n, r, i) { T("Starting NodeParser"), this.renderer = e, this.options = i, this.range = null, this.support = n, this.renderQueue = [], this.stack = new R(!0, 1, t.ownerDocument, null); var o = new I(t, null); i.background && e.rectangle(0, 0, e.width, e.height, new D(i.background)), t === t.ownerDocument.documentElement && (n = new I(o.color("backgroundColor").isTransparent() ? t.ownerDocument.body : t.ownerDocument.documentElement, null), e.rectangle(0, 0, e.width, e.height, n.color("backgroundColor"))), o.visibile = o.isElementVisible(), this.createPseudoHideStyles(t.ownerDocument), this.disableAnimations(t.ownerDocument), this.nodes = E([o].concat(this.getChildren(o)).filter(function (t) { return t.visible = t.isElementVisible() }).map(this.getPseudoElements, this)), this.fontMetrics = new N, T("Fetched nodes, total:", this.nodes.length), T("Calculate overflow clips"), this.calculateOverflowClips(), T("Start fetching images"), this.images = r.fetch(this.nodes.filter(x)), this.ready = this.images.ready.then(M(function () { return T("Images loaded, starting parsing"), T("Creating stacking contexts"), this.createStackingContexts(), T("Sorting stacking contexts"), this.sortStackingContexts(this.stack), this.parse(this.stack), T("Render queue created with " + this.renderQueue.length + " items"), new Promise(M(function (t) { i.async ? "function" == typeof i.async ? i.async.call(this, this.renderQueue, t) : 0 < this.renderQueue.length ? (this.renderIndex = 0, this.asyncRenderer(this.renderQueue, t)) : t() : (this.renderQueue.forEach(this.paint, this), t()) }, this)) }, this)) } function r(t) { return t.parent && t.parent.clip.length } function a() { } function u(s, a, u, c) { return s.map(function (t, e) { if (0 < t.width) { var n = a.left, r = a.top, i = a.width, o = a.height - s[2].width; switch (e) { case 0: o = s[0].width, t.args = h({ c1: [n, r], c2: [n + i, r], c3: [n + i - s[1].width, r + o], c4: [n + s[3].width, r + o] }, c[0], c[1], u.topLeftOuter, u.topLeftInner, u.topRightOuter, u.topRightInner); break; case 1: n = a.left + a.width - s[1].width, i = s[1].width, t.args = h({ c1: [n + i, r], c2: [n + i, r + o + s[2].width], c3: [n, r + o], c4: [n, r + s[0].width] }, c[1], c[2], u.topRightOuter, u.topRightInner, u.bottomRightOuter, u.bottomRightInner); break; case 2: r = r + a.height - s[2].width, o = s[2].width, t.args = h({ c1: [n + i, r + o], c2: [n, r + o], c3: [n + s[3].width, r], c4: [n + i - s[3].width, r] }, c[2], c[3], u.bottomRightOuter, u.bottomRightInner, u.bottomLeftOuter, u.bottomLeftInner); break; case 3: i = s[3].width, t.args = h({ c1: [n, r + o + s[2].width], c2: [n, r], c3: [n + i, r + s[0].width], c4: [n + i, r + o] }, c[3], c[0], u.bottomLeftOuter, u.bottomLeftInner, u.topLeftOuter, u.topLeftInner) } } return t }) } function v(t, e, n, r) { var i = (Math.sqrt(2) - 1) / 3 * 4, o = n * i, i = r * i, n = t + n, r = e + r; return { topLeft: l({ x: t, y: r }, { x: t, y: r - i }, { x: n - o, y: e }, { x: n, y: e }), topRight: l({ x: t, y: e }, { x: t + o, y: e }, { x: n, y: r - i }, { x: n, y: r }), bottomRight: l({ x: n, y: e }, { x: n, y: e + i }, { x: t + o, y: r }, { x: t, y: r }), bottomLeft: l({ x: n, y: r }, { x: n - o, y: r }, { x: t, y: e + i }, { x: t, y: e }) } } function c(t, e, n) { var r = t.left, i = t.top, o = t.width, s = t.height, a = e[0][0] < o / 2 ? e[0][0] : o / 2, u = e[0][1] < s / 2 ? e[0][1] : s / 2, c = e[1][0] < o / 2 ? e[1][0] : o / 2, l = e[1][1] < s / 2 ? e[1][1] : s / 2, h = e[2][0] < o / 2 ? e[2][0] : o / 2, f = e[2][1] < s / 2 ? e[2][1] : s / 2, p = e[3][0] < o / 2 ? e[3][0] : o / 2, d = e[3][1] < s / 2 ? e[3][1] : s / 2, g = o - c, m = s - f, t = o - h, e = s - d; return { topLeftOuter: v(r, i, a, u).topLeft.subdivide(.5), topLeftInner: v(r + n[3].width, i + n[0].width, Math.max(0, a - n[3].width), Math.max(0, u - n[0].width)).topLeft.subdivide(.5), topRightOuter: v(r + g, i, c, l).topRight.subdivide(.5), topRightInner: v(r + Math.min(g, o + n[3].width), i + n[0].width, g > o + n[3].width ? 0 : c - n[3].width, l - n[0].width).topRight.subdivide(.5), bottomRightOuter: v(r + t, i + m, h, f).bottomRight.subdivide(.5), bottomRightInner: v(r + Math.min(t, o - n[3].width), i + Math.min(m, s + n[0].width), Math.max(0, h - n[1].width), f - n[2].width).bottomRight.subdivide(.5), bottomLeftOuter: v(r, i + e, p, d).bottomLeft.subdivide(.5), bottomLeftInner: v(r + n[3].width, i + e, Math.max(0, p - n[3].width), d - n[2].width).bottomLeft.subdivide(.5) } } function l(o, s, a, u) { function c(t, e, n) { return { x: t.x + (e.x - t.x) * n, y: t.y + (e.y - t.y) * n } } return { start: o, startControl: s, endControl: a, end: u, subdivide: function (t) { var e = c(o, s, t), n = c(s, a, t), r = c(a, u, t), i = c(e, n, t), n = c(n, r, t), t = c(i, n, t); return [l(o, e, i, t), l(t, n, r, u)] }, curveTo: function (t) { t.push(["bezierCurve", s.x, s.y, a.x, a.y, u.x, u.y]) }, curveToReversed: function (t) { t.push(["bezierCurve", a.x, a.y, s.x, s.y, o.x, o.y]) } } } function h(t, e, n, r, i, o, s) { var a = []; return 0 < e[0] || 0 < e[1] ? (a.push(["line", r[1].start.x, r[1].start.y]), r[1].curveTo(a)) : a.push(["line", t.c1[0], t.c1[1]]), 0 < n[0] || 0 < n[1] ? (a.push(["line", o[0].start.x, o[0].start.y]), o[0].curveTo(a), a.push(["line", s[0].end.x, s[0].end.y]), s[0].curveToReversed(a)) : (a.push(["line", t.c2[0], t.c2[1]]), a.push(["line", t.c3[0], t.c3[1]])), 0 < e[0] || 0 < e[1] ? (a.push(["line", i[1].end.x, i[1].end.y]), i[1].curveToReversed(a)) : a.push(["line", t.c4[0], t.c4[1]]), a } function s(t, e, n, r, i, o, s) { 0 < e[0] || 0 < e[1] ? (t.push(["line", r[0].start.x, r[0].start.y]), r[0].curveTo(t), r[1].curveTo(t)) : t.push(["line", o, s]), (0 < n[0] || 0 < n[1]) && t.push(["line", i[0].start.x, i[0].start.y]) } function f(t) { return t.cssInt("zIndex") < 0 } function p(t) { return 0 < t.cssInt("zIndex") } function d(t) { return 0 === t.cssInt("zIndex") } function g(t) { return -1 !== ["inline", "inline-block", "inline-table"].indexOf(t.css("display")) } function m(t) { return t instanceof R } function y(t) { return 0 < t.node.data.trim().length } function i(t) { return t.nodeType === Node.TEXT_NODE || t.nodeType === Node.ELEMENT_NODE } function b(t) { return "static" !== t.css("position") } function w(t) { return "none" !== t.css("float") } function _(t) { var e = this; return function () { return !t.apply(e, arguments) } } function x(t) { return t.node.nodeType === Node.ELEMENT_NODE } function o(t) { return !0 === t.isPseudoElement } function C(t) { return t.node.nodeType === Node.TEXT_NODE } function k(t) { return parseInt(t, 10) } function S(t) { return t.width } function O(t) { return t.node.nodeType !== Node.ELEMENT_NODE || -1 === ["SCRIPT", "HEAD", "TITLE", "OBJECT", "BR", "OPTION"].indexOf(t.node.nodeName) } function E(t) { return [].concat.apply([], t) } var T = t("./log"), A = t("punycode"), I = t("./nodecontainer"), j = t("./textcontainer"), P = t("./pseudoelementcontainer"), N = t("./fontmetrics"), D = t("./color"), R = t("./stackingcontext"), t = t("./utils"), M = t.bind, W = t.getBounds, L = t.parseBackgrounds, F = t.offsetBounds; n.prototype.calculateOverflowClips = function () { this.nodes.forEach(function (t) { var e, n; x(t) ? (o(t) && t.appendToDOM(), t.borders = this.parseBorders(t), e = "hidden" === t.css("overflow") ? [t.borders.clip] : [], (n = t.parseClip()) && -1 !== ["absolute", "fixed"].indexOf(t.css("position")) && e.push([["rect", t.bounds.left + n.left, t.bounds.top + n.top, n.right - n.left, n.bottom - n.top]]), t.clip = r(t) ? t.parent.clip.concat(e) : e, t.backgroundClip = "hidden" !== t.css("overflow") ? t.clip.concat([t.borders.clip]) : t.clip, o(t) && t.cleanDOM()) : C(t) && (t.clip = r(t) ? t.parent.clip : []), o(t) || (t.bounds = null) }, this) }, n.prototype.asyncRenderer = function (t, e, n) { n = n || Date.now(), this.paint(t[this.renderIndex++]), t.length === this.renderIndex ? e() : n + 20 > Date.now() ? this.asyncRenderer(t, e, n) : setTimeout(M(function () { this.asyncRenderer(t, e) }, this), 0) }, n.prototype.createPseudoHideStyles = function (t) { this.createStyles(t, "." + P.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ':before { content: "" !important; display: none !important; }.' + P.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER + ':after { content: "" !important; display: none !important; }') }, n.prototype.disableAnimations = function (t) { this.createStyles(t, "* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; -webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}") }, n.prototype.createStyles = function (t, e) { var n = t.createElement("style"); n.innerHTML = e, t.body.appendChild(n) }, n.prototype.getPseudoElements = function (t) { var e, n = [[t]]; return t.node.nodeType === Node.ELEMENT_NODE && (e = this.getPseudoElement(t, ":before"), t = this.getPseudoElement(t, ":after"), e && n.push(e), t && n.push(t)), E(n) }, n.prototype.getPseudoElement = function (t, e) { var n = t.computedStyle(e); if (!n || !n.content || "none" === n.content || "-moz-alt-content" === n.content || "none" === n.display) return null; for (var r, i = (r = n.content, (i = r.substr(0, 1)) === r.substr(r.length - 1) && i.match(/'|"/) ? r.substr(1, r.length - 2) : r), r = "url" === i.substr(0, 3), o = document.createElement(r ? "img" : "html2canvaspseudoelement"), e = new P(o, t, e), s = n.length - 1; 0 <= s; s--) { var a = n.item(s).replace(/(\-[a-z])/g, function (t) { return t.toUpperCase().replace("-", "") }); o.style[a] = n[a] } if (o.className = P.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + " " + P.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER, r) return o.src = L(i)[0].args[0], [e]; var i = document.createTextNode(i); return o.appendChild(i), [e, new j(i, e)] }, n.prototype.getChildren = function (n) { return E([].filter.call(n.node.childNodes, i).map(function (t) { var e = [new (t.nodeType === Node.TEXT_NODE ? j : I)(t, n)].filter(O); return t.nodeType === Node.ELEMENT_NODE && e.length && "TEXTAREA" !== t.tagName ? e[0].isElementVisible() ? e.concat(this.getChildren(e[0])) : [] : e }, this)) }, n.prototype.newStackingContext = function (t, e) { var n = new R(e, t.getOpacity(), t.node, t.parent); t.cloneTo(n), (e ? n.getParentStack(this) : n.parent.stack).contexts.push(n), t.stack = n }, n.prototype.createStackingContexts = function () { this.nodes.forEach(function (t) { var e, n; x(t) && (this.isRootElement(t) || t.getOpacity() < 1 || (n = (e = t).css("position"), "auto" !== (-1 !== ["absolute", "relative", "fixed"].indexOf(n) ? e.css("zIndex") : "auto")) || this.isBodyWithTransparentRoot(t) || t.hasTransform()) ? this.newStackingContext(t, !0) : x(t) && (b(t) && d(t) || -1 !== ["inline-block", "inline-table"].indexOf(t.css("display")) || w(t)) ? this.newStackingContext(t, !1) : t.assignStack(t.parent.stack) }, this) }, n.prototype.isBodyWithTransparentRoot = function (t) { return "BODY" === t.node.nodeName && t.parent.color("backgroundColor").isTransparent() }, n.prototype.isRootElement = function (t) { return null === t.parent }, n.prototype.sortStackingContexts = function (t) { var n; t.contexts.sort((n = t.contexts.slice(0), function (t, e) { return t.cssInt("zIndex") + n.indexOf(t) / n.length - (e.cssInt("zIndex") + n.indexOf(e) / n.length) })), t.contexts.forEach(this.sortStackingContexts, this) }, n.prototype.parseTextBounds = function (i) { return function (t, e, n) { if ("none" !== i.parent.css("textDecoration").substr(0, 4) || 0 !== t.trim().length) { if (this.support.rangeBounds && !i.parent.hasTransform()) { var r = n.slice(0, e).join("").length; return this.getRangeBounds(i.node, r, t.length) } if (i.node && "string" == typeof i.node.data) { e = i.node.splitText(t.length), r = this.getWrapperBounds(i.node, i.parent.hasTransform()); return i.node = e, r } } else this.support.rangeBounds && !i.parent.hasTransform() || (i.node = i.node.splitText(t.length)); return {} } }, n.prototype.getWrapperBounds = function (t, e) { var n = t.ownerDocument.createElement("html2canvaswrapper"), r = t.parentNode, i = t.cloneNode(!0); n.appendChild(t.cloneNode(!0)), r.replaceChild(n, t); e = (e ? F : W)(n); return r.replaceChild(i, n), e }, n.prototype.getRangeBounds = function (t, e, n) { var r = this.range || (this.range = t.ownerDocument.createRange()); return r.setStart(t, e), r.setEnd(t, e + n), r.getBoundingClientRect() }, n.prototype.parse = function (t) { var e = t.contexts.filter(f), n = t.children.filter(x), r = n.filter(_(w)), i = r.filter(_(b)).filter(_(g)), o = n.filter(_(b)).filter(w), s = r.filter(_(b)).filter(g), n = t.contexts.concat(r.filter(b)).filter(d), r = t.children.filter(C).filter(y), t = t.contexts.filter(p); e.concat(i).concat(o).concat(s).concat(n).concat(r).concat(t).forEach(function (t) { this.renderQueue.push(t), m(t) && (this.parse(t), this.renderQueue.push(new a)) }, this) }, n.prototype.paint = function (t) { try { t instanceof a ? this.renderer.ctx.restore() : C(t) ? (o(t.parent) && t.parent.appendToDOM(), this.paintText(t), o(t.parent) && t.parent.cleanDOM()) : this.paintNode(t) } catch (t) { if (T(t), this.options.strict) throw t } }, n.prototype.paintNode = function (t) { m(t) && (this.renderer.setOpacity(t.opacity), this.renderer.ctx.save(), t.hasTransform() && this.renderer.setTransform(t.parseTransform())), "INPUT" === t.node.nodeName && "checkbox" === t.node.type ? this.paintCheckbox(t) : "INPUT" === t.node.nodeName && "radio" === t.node.type ? this.paintRadio(t) : this.paintElement(t) }, n.prototype.paintElement = function (e) { var n = e.parseBounds(); this.renderer.clip(e.backgroundClip, function () { this.renderer.renderBackground(e, n, e.borders.borders.map(S)) }, this), this.renderer.clip(e.clip, function () { this.renderer.renderBorders(e.borders.borders) }, this), this.renderer.clip(e.backgroundClip, function () { switch (e.node.nodeName) { case "svg": case "IFRAME": var t = this.images.get(e.node); t ? this.renderer.renderImage(e, n, e.borders, t) : T("Error loading <" + e.node.nodeName + ">", e.node); break; case "IMG": t = this.images.get(e.node.src); t ? this.renderer.renderImage(e, n, e.borders, t) : T("Error loading <img>", e.node.src); break; case "CANVAS": this.renderer.renderImage(e, n, e.borders, { image: e.node }); break; case "SELECT": case "INPUT": case "TEXTAREA": this.paintFormValue(e) } }, this) }, n.prototype.paintCheckbox = function (t) { var e = t.parseBounds(), n = Math.min(e.width, e.height), r = { width: n - 1, height: n - 1, top: e.top, left: e.left }, e = [3, 3], i = [e, e, e, e], o = [1, 1, 1, 1].map(function (t) { return { color: new D("#A5A5A5"), width: t } }), s = c(r, i, o); this.renderer.clip(t.backgroundClip, function () { this.renderer.rectangle(r.left + 1, r.top + 1, r.width - 2, r.height - 2, new D("#DEDEDE")), this.renderer.renderBorders(u(o, r, s, i)), t.node.checked && (this.renderer.font(new D("#424242"), "normal", "normal", "bold", n - 3 + "px", "arial"), this.renderer.text("✔", r.left + n / 6, r.top + n - 1)) }, this) }, n.prototype.paintRadio = function (t) { var e = t.parseBounds(), n = Math.min(e.width, e.height) - 2; this.renderer.clip(t.backgroundClip, function () { this.renderer.circleStroke(e.left + 1, e.top + 1, n, new D("#DEDEDE"), 1, new D("#A5A5A5")), t.node.checked && this.renderer.circle(Math.ceil(e.left + n / 4) + 1, Math.ceil(e.top + n / 4) + 1, Math.floor(n / 2), new D("#424242")) }, this) }, n.prototype.paintFormValue = function (e) { var t, n, r, i = e.getValue(); 0 < i.length && (t = e.node.ownerDocument, n = t.createElement("html2canvaswrapper"), ["lineHeight", "textAlign", "fontFamily", "fontWeight", "fontSize", "color", "paddingLeft", "paddingTop", "paddingRight", "paddingBottom", "width", "height", "borderLeftStyle", "borderTopStyle", "borderLeftWidth", "borderTopWidth", "boxSizing", "whiteSpace", "wordWrap"].forEach(function (t) { try { n.style[t] = e.css(t) } catch (t) { T("html2canvas: Parse: Exception caught in renderFormValue: " + t.message) } }), r = e.parseBounds(), n.style.position = "fixed", n.style.left = r.left + "px", n.style.top = r.top + "px", n.textContent = i, t.body.appendChild(n), this.paintText(new j(n.firstChild, e)), t.body.removeChild(n)) }, n.prototype.paintText = function (n) { n.applyTextTransform(); var t = A.ucs2.decode(n.node.data), r = this.options.letterRendering && !/^(normal|none|0px)$/.test(n.parent.css("letterSpacing")) || /[^\u0000-\u00ff]/.test(n.node.data) ? t.map(function (t) { return A.ucs2.encode([t]) }) : function (t) { for (var e, n = [], r = 0, i = !1; t.length;)-1 !== [32, 13, 10, 9, 45].indexOf(t[r]) === i ? ((e = t.splice(0, r)).length && n.push(A.ucs2.encode(e)), i = !i, r = 0) : r++, r >= t.length && ((e = t.splice(0, r)).length && n.push(A.ucs2.encode(e))); return n }(t), e = n.parent.fontWeight(), i = n.parent.css("fontSize"), o = n.parent.css("fontFamily"), t = n.parent.parseTextShadows(); this.renderer.font(n.parent.color("color"), n.parent.css("fontStyle"), n.parent.css("fontVariant"), e, i, o), t.length ? this.renderer.fontShadow(t[0].color, t[0].offsetX, t[0].offsetY, t[0].blur) : this.renderer.clearShadow(), this.renderer.clip(n.parent.clip, function () { r.map(this.parseTextBounds(n), this).forEach(function (t, e) { t && (this.renderer.text(r[e], t.left, t.bottom), this.renderTextDecoration(n.parent, t, this.fontMetrics.getMetrics(o, i))) }, this) }, this) }, n.prototype.renderTextDecoration = function (t, e, n) { switch (t.css("textDecoration").split(" ")[0]) { case "underline": this.renderer.rectangle(e.left, Math.round(e.top + n.baseline + n.lineWidth), e.width, 1, t.color("color")); break; case "overline": this.renderer.rectangle(e.left, Math.round(e.top), e.width, 1, t.color("color")); break; case "line-through": this.renderer.rectangle(e.left, Math.ceil(e.top + n.middle + n.lineWidth), e.width, 1, t.color("color")) } }; var H = { inset: [["darken", .6], ["darken", .1], ["darken", .1], ["darken", .6]] }; n.prototype.parseBorders = function (i) { var e, t = i.parseBounds(), n = (e = i, ["TopLeft", "TopRight", "BottomRight", "BottomLeft"].map(function (t) { t = e.css("border" + t + "Radius").split(" "); return t.length <= 1 && (t[1] = t[0]), t.map(k) })), r = ["Top", "Right", "Bottom", "Left"].map(function (t, e) { var n = i.css("border" + t + "Style"), r = i.color("border" + t + "Color"); "inset" === n && r.isBlack() && (r = new D([255, 255, 255, r.a])); e = H[n] ? H[n][e] : null; return { width: i.cssInt("border" + t + "Width"), color: e ? r[e[0]](e[1]) : r, args: null } }), o = c(t, n, r); return { clip: this.parseBackgroundClip(i, o, r, n, t), borders: u(r, t, o, n) } }, n.prototype.parseBackgroundClip = function (t, e, n, r, i) { var o = []; switch (t.css("backgroundClip")) { case "content-box": case "padding-box": s(o, r[0], r[1], e.topLeftInner, e.topRightInner, i.left + n[3].width, i.top + n[0].width), s(o, r[1], r[2], e.topRightInner, e.bottomRightInner, i.left + i.width - n[1].width, i.top + n[0].width), s(o, r[2], r[3], e.bottomRightInner, e.bottomLeftInner, i.left + i.width - n[1].width, i.top + i.height - n[2].width), s(o, r[3], r[0], e.bottomLeftInner, e.topLeftInner, i.left + n[3].width, i.top + i.height - n[2].width); break; default: s(o, r[0], r[1], e.topLeftOuter, e.topRightOuter, i.left, i.top), s(o, r[1], r[2], e.topRightOuter, e.bottomRightOuter, i.left + i.width, i.top), s(o, r[2], r[3], e.bottomRightOuter, e.bottomLeftOuter, i.left + i.width, i.top + i.height), s(o, r[3], r[0], e.bottomLeftOuter, e.topLeftOuter, i.left, i.top + i.height) }return o }, e.exports = n }, { "./color": 3, "./fontmetrics": 7, "./log": 13, "./nodecontainer": 14, "./pseudoelementcontainer": 18, "./stackingcontext": 21, "./textcontainer": 25, "./utils": 26, punycode: 1 }], 16: [function (t, e, n) { function a(t, e, n) { var r = "withCredentials" in new XMLHttpRequest; if (!e) return Promise.reject("No proxy configured"); var i = s(r), t = u(e, t, i); return r ? c(t) : o(n, t, i).then(function (t) { return f(t.content) }) } function o(i, o, s) { return new Promise(function (e, n) { function r() { delete window.html2canvas.proxy[s], i.body.removeChild(t) } var t = i.createElement("script"); window.html2canvas.proxy[s] = function (t) { r(), e(t) }, t.src = o, t.onerror = function (t) { r(), n(t) }, i.body.appendChild(t) }) } function s(t) { return t ? "" : "html2canvas_" + Date.now() + "_" + ++i + "_" + Math.round(1e5 * Math.random()) } function u(t, e, n) { return t + "?url=" + encodeURIComponent(e) + (n.length ? "&callback=html2canvas.proxy." + n : "") } var c = t("./xhr"), r = t("./utils"), l = t("./log"), h = t("./clone"), f = r.decode64, i = 0; n.Proxy = a, n.ProxyURL = function (t, e, n) { var r = "crossOrigin" in new Image, i = s(r), t = u(e, t, i); return r ? Promise.resolve(t) : o(n, t, i).then(function (t) { return "data:" + t.type + ";base64," + t.content }) }, n.loadUrlDocument = function (t, e, n, r, i, o) { return new a(t, e, window.document).then((s = t, function (e) { var n, t = new DOMParser; try { n = t.parseFromString(e, "text/html") } catch (t) { l("DOMParser not supported, falling back to createHTMLDocument"), n = document.implementation.createHTMLDocument(""); try { n.open(), n.write(e), n.close() } catch (t) { l("createHTMLDocument write not supported, falling back to document.body.innerHTML"), n.body.innerHTML = e } } var r = n.querySelector("base"); return r && r.href.host || ((r = n.createElement("base")).href = s, n.head.insertBefore(r, n.head.firstChild)), n })).then(function (t) { return h(t, n, r, i, o, 0, 0) }); var s } }, { "./clone": 2, "./log": 13, "./utils": 26, "./xhr": 28 }], 17: [function (t, e) { var o = t("./proxy").ProxyURL; e.exports = function (n, r) { var t = document.createElement("a"); t.href = n, n = t.href, this.src = n, this.image = new Image; var i = this; this.promise = new Promise(function (t, e) { i.image.crossOrigin = "Anonymous", i.image.onload = t, i.image.onerror = e, new o(n, r, document).then(function (t) { i.image.src = t }).catch(e) }) } }, { "./proxy": 16 }], 18: [function (t, e) { function n(t, e, n) { r.call(this, t, e), this.isPseudoElement = !0, this.before = ":before" === n } var r = t("./nodecontainer"); n.prototype.cloneTo = function (t) { n.prototype.cloneTo.call(this, t), t.isPseudoElement = !0, t.before = this.before }, (n.prototype = Object.create(r.prototype)).appendToDOM = function () { this.before ? this.parent.node.insertBefore(this.node, this.parent.node.firstChild) : this.parent.node.appendChild(this.node), this.parent.node.className += " " + this.getHideClass() }, n.prototype.cleanDOM = function () { this.node.parentNode.removeChild(this.node), this.parent.node.className = this.parent.node.className.replace(this.getHideClass(), "") }, n.prototype.getHideClass = function () { return this["PSEUDO_HIDE_ELEMENT_CLASS_" + (this.before ? "BEFORE" : "AFTER")] }, n.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = "___html2canvas___pseudoelement_before", n.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER = "___html2canvas___pseudoelement_after", e.exports = n }, { "./nodecontainer": 14 }], 19: [function (t, e) { function n(t, e, n, r, i) { this.width = t, this.height = e, this.images = n, this.options = r, this.document = i } var a = t("./log"); n.prototype.renderImage = function (t, e, n, r) { var i = t.cssInt("paddingLeft"), o = t.cssInt("paddingTop"), s = t.cssInt("paddingRight"), t = t.cssInt("paddingBottom"), n = n.borders, s = e.width - (n[1].width + n[3].width + i + s), t = e.height - (n[0].width + n[2].width + o + t); this.drawImage(r, 0, 0, r.image.width || s, r.image.height || t, e.left + i + n[3].width, e.top + o + n[0].width, s, t) }, n.prototype.renderBackground = function (t, e, n) { 0 < e.height && 0 < e.width && (this.renderBackgroundColor(t, e), this.renderBackgroundImage(t, e, n)) }, n.prototype.renderBackgroundColor = function (t, e) { t = t.color("backgroundColor"); t.isTransparent() || this.rectangle(e.left, e.top, e.width, e.height, t) }, n.prototype.renderBorders = function (t) { t.forEach(this.renderBorder, this) }, n.prototype.renderBorder = function (t) { t.color.isTransparent() || null === t.args || this.drawShape(t.args, t.color) }, n.prototype.renderBackgroundImage = function (i, o, s) { i.parseBackgroundImages().reverse().forEach(function (t, e, n) { switch (t.method) { case "url": var r = this.images.get(t.args[0]); r ? this.renderBackgroundRepeating(i, o, r, n.length - (e + 1), s) : a("Error loading background-image", t.args[0]); break; case "linear-gradient": case "gradient": r = this.images.get(t.value); r ? this.renderBackgroundGradient(r, o, s) : a("Error loading background-image", t.args[0]); break; case "none": break; default: a("Unknown background-image type", t.args[0]) } }, this) }, n.prototype.renderBackgroundRepeating = function (t, e, n, r, i) { var o = t.parseBackgroundSize(e, n.image, r), s = t.parseBackgroundPosition(e, n.image, r, o); switch (t.parseBackgroundRepeat(r)) { case "repeat-x": case "repeat no-repeat": this.backgroundRepeatShape(n, s, o, e, e.left + i[3], e.top + s.top + i[0], 99999, o.height, i); break; case "repeat-y": case "no-repeat repeat": this.backgroundRepeatShape(n, s, o, e, e.left + s.left + i[3], e.top + i[0], o.width, 99999, i); break; case "no-repeat": this.backgroundRepeatShape(n, s, o, e, e.left + s.left + i[3], e.top + s.top + i[0], o.width, o.height, i); break; default: this.renderBackgroundRepeat(n, s, o, { top: e.top, left: e.left }, i[3], i[0]) } }, e.exports = n }, { "./log": 13 }], 20: [function (t, e) { function n(t, e) { i.apply(this, arguments), this.canvas = this.options.canvas || this.document.createElement("canvas"), this.options.canvas || (this.canvas.width = t, this.canvas.height = e), this.ctx = this.canvas.getContext("2d"), this.taintCtx = this.document.createElement("canvas").getContext("2d"), this.ctx.textBaseline = "bottom", this.variables = {}, s("Initialized CanvasRenderer with size", t, "x", e) } function r(t) { return 0 < t.length } var i = t("../renderer"), o = t("../lineargradientcontainer"), s = t("../log"); (n.prototype = Object.create(i.prototype)).setFillStyle = function (t) { return this.ctx.fillStyle = "object" == typeof t && t.isColor ? t.toString() : t, this.ctx }, n.prototype.rectangle = function (t, e, n, r, i) { this.setFillStyle(i).fillRect(t, e, n, r) }, n.prototype.circle = function (t, e, n, r) { this.setFillStyle(r), this.ctx.beginPath(), this.ctx.arc(t + n / 2, e + n / 2, n / 2, 0, 2 * Math.PI, !0), this.ctx.closePath(), this.ctx.fill() }, n.prototype.circleStroke = function (t, e, n, r, i, o) { this.circle(t, e, n, r), this.ctx.strokeStyle = o.toString(), this.ctx.stroke() }, n.prototype.drawShape = function (t, e) { this.shape(t), this.setFillStyle(e).fill() }, n.prototype.taints = function (e) { if (null === e.tainted) { this.taintCtx.drawImage(e.image, 0, 0); try { this.taintCtx.getImageData(0, 0, 1, 1), e.tainted = !1 } catch (t) { this.taintCtx = document.createElement("canvas").getContext("2d"), e.tainted = !0 } } return e.tainted }, n.prototype.drawImage = function (t, e, n, r, i, o, s, a, u) { this.taints(t) && !this.options.allowTaint || this.ctx.drawImage(t.image, e, n, r, i, o, s, a, u) }, n.prototype.clip = function (t, e, n) { this.ctx.save(), t.filter(r).forEach(function (t) { this.shape(t).clip() }, this), e.call(n), this.ctx.restore() }, n.prototype.shape = function (t) { return this.ctx.beginPath(), t.forEach(function (t, e) { ("rect" === t[0] ? this.ctx.rect : this.ctx[0 === e ? "moveTo" : t[0] + "To"]).apply(this.ctx, t.slice(1)) }, this), this.ctx.closePath(), this.ctx }, n.prototype.font = function (t, e, n, r, i, o) { this.setFillStyle(t).font = [e, n, r, i, o].join(" ").split(",")[0] }, n.prototype.fontShadow = function (t, e, n, r) { this.setVariable("shadowColor", t.toString()).setVariable("shadowOffsetY", e).setVariable("shadowOffsetX", n).setVariable("shadowBlur", r) }, n.prototype.clearShadow = function () { this.setVariable("shadowColor", "rgba(0,0,0,0)") }, n.prototype.setOpacity = function (t) { this.ctx.globalAlpha = t }, n.prototype.setTransform = function (t) { this.ctx.translate(t.origin[0], t.origin[1]), this.ctx.transform.apply(this.ctx, t.matrix), this.ctx.translate(-t.origin[0], -t.origin[1]) }, n.prototype.setVariable = function (t, e) { return this.variables[t] !== e && (this.variables[t] = this.ctx[t] = e), this }, n.prototype.text = function (t, e, n) { this.ctx.fillText(t, e, n) }, n.prototype.backgroundRepeatShape = function (t, e, n, r, i, o, s, a, u) { o = [["line", Math.round(i), Math.round(o)], ["line", Math.round(i + s), Math.round(o)], ["line", Math.round(i + s), Math.round(a + o)], ["line", Math.round(i), Math.round(a + o)]]; this.clip([o], function () { this.renderBackgroundRepeat(t, e, n, r, u[3], u[0]) }, this) }, n.prototype.renderBackgroundRepeat = function (t, e, n, r, i, o) { i = Math.round(r.left + e.left + i), o = Math.round(r.top + e.top + o); this.setFillStyle(this.ctx.createPattern(this.resizeImage(t, n), "repeat")), this.ctx.translate(i, o), this.ctx.fill(), this.ctx.translate(-i, -o) }, n.prototype.renderBackgroundGradient = function (t, e) { var n; t instanceof o && (n = this.ctx.createLinearGradient(e.left + e.width * t.x0, e.top + e.height * t.y0, e.left + e.width * t.x1, e.top + e.height * t.y1), t.colorStops.forEach(function (t) { n.addColorStop(t.stop, t.color.toString()) }), this.rectangle(e.left, e.top, e.width, e.height, n)) }, n.prototype.resizeImage = function (t, e) { var n = t.image; if (n.width === e.width && n.height === e.height) return n; t = document.createElement("canvas"); return t.width = e.width, t.height = e.height, t.getContext("2d").drawImage(n, 0, 0, n.width, n.height, 0, 0, e.width, e.height), t }, e.exports = n }, { "../lineargradientcontainer": 12, "../log": 13, "../renderer": 19 }], 21: [function (t, e) { function n(t, e, n, r) { i.call(this, n, r), this.ownStacking = t, this.contexts = [], this.children = [], this.opacity = (this.parent ? this.parent.stack.opacity : 1) * e } var i = t("./nodecontainer"); (n.prototype = Object.create(i.prototype)).getParentStack = function (t) { var e = this.parent ? this.parent.stack : null; return e ? e.ownStacking ? e : e.getParentStack(t) : t.stack }, e.exports = n }, { "./nodecontainer": 14 }], 22: [function (t, e) { function n(t) { this.rangeBounds = this.testRangeBounds(t), this.cors = this.testCORS(), this.svg = this.testSVG() } n.prototype.testRangeBounds = function (t) { var e, n, r = !1; return t.createRange && ((e = t.createRange()).getBoundingClientRect && ((n = t.createElement("boundtest")).style.height = "123px", n.style.display = "block", t.body.appendChild(n), e.selectNode(n), 123 === e.getBoundingClientRect().height && (r = !0), t.body.removeChild(n))), r }, n.prototype.testCORS = function () { return void 0 !== (new Image).crossOrigin }, n.prototype.testSVG = function () { var t = new Image, e = document.createElement("canvas"), n = e.getContext("2d"); t.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>"; try { n.drawImage(t, 0, 0), e.toDataURL() } catch (t) { return !1 } return !0 }, e.exports = n }, {}], 23: [function (t, e) { function n(t) { this.src = t, this.image = null; var n = this; this.promise = this.hasFabric().then(function () { return n.isInline(t) ? Promise.resolve(n.inlineFormatting(t)) : r(t) }).then(function (e) { return new Promise(function (t) { window.html2canvas.svg.fabric.loadSVGFromString(e, n.createCanvas.call(n, t)) }) }) } var r = t("./xhr"), i = t("./utils").decode64; n.prototype.hasFabric = function () { return window.html2canvas.svg && window.html2canvas.svg.fabric ? Promise.resolve() : Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) }, n.prototype.inlineFormatting = function (t) { return /^data:image\/svg\+xml;base64,/.test(t) ? this.decode64(this.removeContentType(t)) : this.removeContentType(t) }, n.prototype.removeContentType = function (t) { return t.replace(/^data:image\/svg\+xml(;base64)?,/, "") }, n.prototype.isInline = function (t) { return /^data:image\/svg\+xml/i.test(t) }, n.prototype.createCanvas = function (r) { var i = this; return function (t, e) { var n = new window.html2canvas.svg.fabric.StaticCanvas("c"); i.image = n.lowerCanvasEl, n.setWidth(e.width).setHeight(e.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(t, e)).renderAll(), r(n.lowerCanvasEl) } }, n.prototype.decode64 = function (t) { return "function" == typeof window.atob ? window.atob(t) : i(t) }, e.exports = n }, { "./utils": 26, "./xhr": 28 }], 24: [function (t, e) { function n(n, t) { this.src = n, this.image = null; var r = this; this.promise = t ? new Promise(function (t, e) { r.image = new Image, r.image.onload = t, r.image.onerror = e, r.image.src = "data:image/svg+xml," + (new XMLSerializer).serializeToString(n), !0 === r.image.complete && t(r.image) }) : this.hasFabric().then(function () { return new Promise(function (t) { window.html2canvas.svg.fabric.parseSVGDocument(n, r.createCanvas.call(r, t)) }) }) } t = t("./svgcontainer"); n.prototype = Object.create(t.prototype), e.exports = n }, { "./svgcontainer": 23 }], 25: [function (t, e) { function n(t, e) { i.call(this, t, e) } function r(t, e, n) { return 0 < t.length ? e + n.toUpperCase() : void 0 } var i = t("./nodecontainer"); (n.prototype = Object.create(i.prototype)).applyTextTransform = function () { this.node.data = this.transform(this.parent.css("textTransform")) }, n.prototype.transform = function (t) { var e = this.node.data; switch (t) { case "lowercase": return e.toLowerCase(); case "capitalize": return e.replace(/(^|\s|:|-|\(|\))([a-z])/g, r); case "uppercase": return e.toUpperCase(); default: return e } }, e.exports = n }, { "./nodecontainer": 14 }], 26: [function (t, e, n) { n.smallImage = function () { return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" }, n.bind = function (t, e) { return function () { return t.apply(e, arguments) } }, n.decode64 = function (t) { for (var e, n, r, i, o, s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", a = t.length, u = "", c = 0; c < a; c += 4)r = s.indexOf(t[c]) << 2 | (o = s.indexOf(t[c + 1])) >> 4, i = (15 & o) << 4 | (e = s.indexOf(t[c + 2])) >> 2, o = (3 & e) << 6 | (n = s.indexOf(t[c + 3])), u += 64 === e ? String.fromCharCode(r) : 64 === n || -1 === n ? String.fromCharCode(r, i) : String.fromCharCode(r, i, o); return u }, n.getBounds = function (t) { if (t.getBoundingClientRect) { var e = t.getBoundingClientRect(), n = null == t.offsetWidth ? e.width : t.offsetWidth; return { top: e.top, bottom: e.bottom || e.top + e.height, right: e.left + n, left: e.left, width: n, height: null == t.offsetHeight ? e.height : t.offsetHeight } } return {} }, n.offsetBounds = function (t) { var e = t.offsetParent ? n.offsetBounds(t.offsetParent) : { top: 0, left: 0 }; return { top: t.offsetTop + e.top, bottom: t.offsetTop + t.offsetHeight + e.top, right: t.offsetLeft + e.left + t.offsetWidth, left: t.offsetLeft + e.left, width: t.offsetWidth, height: t.offsetHeight } }, n.parseBackgrounds = function (t) { function e() { h && ('"' === n.substr(0, 1) && (n = n.substr(1, n.length - 2)), n && l.push(n), "-" === h.substr(0, 1) && 0 < (i = h.indexOf("-", 1) + 1) && (r = h.substr(0, i), h = h.substr(i)), a.push({ prefix: r, method: h.toLowerCase(), value: o, args: l, image: null })), l = [], h = r = n = o = "" } var n, r, i, o, s, a = [], u = 0, c = 0, l = [], h = r = n = o = ""; return t.split("").forEach(function (t) { if (!(0 === u && -1 < " \r\n\t".indexOf(t))) { switch (t) { case '"': s ? s === t && (s = null) : s = t; break; case "(": if (s) break; if (0 === u) return u = 1, void (o += t); c++; break; case ")": if (s) break; if (1 === u) { if (0 === c) return u = 0, o += t, void e(); c-- } break; case ",": if (s) break; if (0 === u) return void e(); if (1 === u && 0 === c && !h.match(/^url$/i)) return l.push(n), n = "", void (o += t) }o += t, 0 === u ? h += t : n += t } }), e(), a } }, {}], 27: [function (t, e) { function n(t) { r.apply(this, arguments), this.type = "linear" === t.args[0] ? r.TYPES.LINEAR : r.TYPES.RADIAL } var r = t("./gradientcontainer"); n.prototype = Object.create(r.prototype), e.exports = n }, { "./gradientcontainer": 9 }], 28: [function (t, e) { e.exports = function (r) { return new Promise(function (t, e) { var n = new XMLHttpRequest; n.open("GET", r), n.onload = function () { 200 === n.status ? t(n.responseText) : e(new Error(n.statusText)) }, n.onerror = function () { e(new Error("Network Error")) }, n.send() }) } }, {}] }, {}, [4])(4) }), function (t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).localforage = t() }(function () { return function r(i, o, s) { function a(e, t) { if (!o[e]) { if (!i[e]) { var n = "function" == typeof require && require; if (!t && n) return n(e, !0); if (u) return u(e, !0); n = new Error("Cannot find module '" + e + "'"); throw n.code = "MODULE_NOT_FOUND", n } n = o[e] = { exports: {} }; i[e][0].call(n.exports, function (t) { return a(i[e][1][t] || t) }, n, n.exports, r, i, o, s) } return o[e].exports } for (var u = "function" == typeof require && require, t = 0; t < s.length; t++)a(s[t]); return a }({ 1: [function (t, c, e) { (function (e) { "use strict"; function n() { o = !0; for (var t, e, n = u.length; n;) { for (e = u, u = [], t = -1; ++t < n;)e[t](); n = u.length } o = !1 } var t, r, i, o, s = e.MutationObserver || e.WebKitMutationObserver, a = s ? (t = 0, s = new s(n), r = e.document.createTextNode(""), s.observe(r, { characterData: !0 }), function () { r.data = t = ++t % 2 }) : e.setImmediate || void 0 === e.MessageChannel ? "document" in e && "onreadystatechange" in e.document.createElement("script") ? function () { var t = e.document.createElement("script"); t.onreadystatechange = function () { n(), t.onreadystatechange = null, t.parentNode.removeChild(t), t = null }, e.document.documentElement.appendChild(t) } : function () { setTimeout(n, 0) } : ((i = new e.MessageChannel).port1.onmessage = n, function () { i.port2.postMessage(0) }), u = []; c.exports = function (t) { 1 !== u.push(t) || o || a() } }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}], 2: [function (t, e, n) { "use strict"; function u() { } function r(t) { if ("function" != typeof t) throw new TypeError("resolver must be a function"); this.state = d, this.queue = [], this.outcome = void 0, t !== u && a(this, t) } function i(t, e, n) { this.promise = t, "function" == typeof e && (this.onFulfilled = e, this.callFulfilled = this.otherCallFulfilled), "function" == typeof n && (this.onRejected = n, this.callRejected = this.otherCallRejected) } function o(e, n, r) { l(function () { var t; try { t = n(r) } catch (t) { return h.reject(e, t) } t === e ? h.reject(e, new TypeError("Cannot resolve promise with itself")) : h.resolve(e, t) }) } function s(t) { var e = t && t.then; if (t && ("object" == typeof t || "function" == typeof t) && "function" == typeof e) return function () { e.apply(t, arguments) } } function a(e, t) { function n(t) { i || (i = !0, h.reject(e, t)) } function r(t) { i || (i = !0, h.resolve(e, t)) } var i = !1, o = c(function () { t(r, n) }); "error" === o.status && n(o.value) } function c(t, e) { var n = {}; try { n.value = t(e), n.status = "success" } catch (t) { n.status = "error", n.value = t } return n } var l = t(1), h = {}, f = ["REJECTED"], p = ["FULFILLED"], d = ["PENDING"]; (e.exports = r).prototype.catch = function (t) { return this.then(null, t) }, r.prototype.then = function (t, e) { if ("function" != typeof t && this.state === p || "function" != typeof e && this.state === f) return this; var n = new this.constructor(u); return this.state !== d ? o(n, this.state === p ? t : e, this.outcome) : this.queue.push(new i(n, t, e)), n }, i.prototype.callFulfilled = function (t) { h.resolve(this.promise, t) }, i.prototype.otherCallFulfilled = function (t) { o(this.promise, this.onFulfilled, t) }, i.prototype.callRejected = function (t) { h.reject(this.promise, t) }, i.prototype.otherCallRejected = function (t) { o(this.promise, this.onRejected, t) }, h.resolve = function (t, e) { var n = c(s, e); if ("error" === n.status) return h.reject(t, n.value); n = n.value; if (n) a(t, n); else { t.state = p, t.outcome = e; for (var r = -1, i = t.queue.length; ++r < i;)t.queue[r].callFulfilled(e) } return t }, h.reject = function (t, e) { t.state = f, t.outcome = e; for (var n = -1, r = t.queue.length; ++n < r;)t.queue[n].callRejected(e); return t }, r.resolve = function (t) { return t instanceof this ? t : h.resolve(new this(u), t) }, r.reject = function (t) { var e = new this(u); return h.reject(e, t) }, r.all = function (t) { var n = this; if ("[object Array]" !== Object.prototype.toString.call(t)) return this.reject(new TypeError("must be an array")); var r = t.length, i = !1; if (!r) return this.resolve([]); for (var o = new Array(r), s = 0, e = -1, a = new this(u); ++e < r;)!function (t, e) { n.resolve(t).then(function (t) { o[e] = t, ++s !== r || i || (i = !0, h.resolve(a, o)) }, function (t) { i || (i = !0, h.reject(a, t)) }) }(t[e], e); return a }, r.race = function (t) { var e = this; if ("[object Array]" !== Object.prototype.toString.call(t)) return this.reject(new TypeError("must be an array")); var n = t.length, r = !1; if (!n) return this.resolve([]); for (var i, o = -1, s = new this(u); ++o < n;)i = t[o], e.resolve(i).then(function (t) { r || (r = !0, h.resolve(s, t)) }, function (t) { r || (r = !0, h.reject(s, t)) }); return s } }, { 1: 1 }], 3: [function (e, t, n) { (function (t) { "use strict"; "function" != typeof t.Promise && (t.Promise = e(2)) }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, { 2: 2 }], 4: [function (t, e, n) { "use strict"; function o(e, n) { e = e || [], n = n || {}; try { return new Blob(e, n) } catch (t) { if ("TypeError" !== t.name) throw t; for (var r = new ("undefined" != typeof BlobBuilder ? BlobBuilder : "undefined" != typeof MSBlobBuilder ? MSBlobBuilder : "undefined" != typeof MozBlobBuilder ? MozBlobBuilder : WebKitBlobBuilder), i = 0; i < e.length; i += 1)r.append(e[i]); return r.getBlob(n.type) } } function l(t, e) { e && t.then(function (t) { e(null, t) }, function (t) { e(t) }) } function u(t, e, n) { "function" == typeof e && t.then(e), "function" == typeof n && t.catch(n) } function h(t) { return "string" != typeof t && (t = String(t)), t } function a() { if (arguments.length && "function" == typeof arguments[arguments.length - 1]) return arguments[arguments.length - 1] } function r(t) { return "boolean" == typeof D ? P.resolve(D) : (r = t, new P(function (n) { var t = r.transaction(N, L), e = o([""]); t.objectStore(N).put(e, "key"), t.onabort = function (t) { t.preventDefault(), t.stopPropagation(), n(!1) }, t.oncomplete = function () { var t = navigator.userAgent.match(/Chrome\/(\d+)/), e = navigator.userAgent.match(/Edge\//); n(e || !t || 43 <= parseInt(t[1], 10)) } }).catch(function () { return !1 }).then(function (t) { return D = t })); var r } function c(t) { var t = R[t.name], n = {}; n.promise = new P(function (t, e) { n.resolve = t, n.reject = e }), t.deferredOperations.push(n), t.dbReady ? t.dbReady = t.dbReady.then(function () { return n.promise }) : t.dbReady = n.promise } function f(t) { t = R[t.name].deferredOperations.pop(); return t && (t.resolve(), t.promise) } function p(t, e) { t = R[t.name].deferredOperations.pop(); if (t) return t.reject(e), t.promise } function i(i, o) { return new P(function (t, e) { if (R[i.name] = R[i.name] || _(), i.db) { if (!o) return t(i.db); c(i), i.db.close() } var n = [i.name]; o && n.push(i.version); var r = I.open.apply(I, n); o && (r.onupgradeneeded = function (t) { var e = r.result; try { e.createObjectStore(i.storeName), t.oldVersion <= 1 && e.createObjectStore(N) } catch (e) { if ("ConstraintError" !== e.name) throw e } }), r.onerror = function (t) { t.preventDefault(), e(r.error) }, r.onsuccess = function () { t(r.result), f(i) } }) } function d(t) { return i(t, !1) } function g(t) { return i(t, !0) } function m(t) { if (!t.db) return 1; var e = !t.db.objectStoreNames.contains(t.storeName), n = t.version < t.db.version, r = t.version > t.db.version; return n && (t.version, t.version = t.db.version), (r || e) && (!e || (e = t.db.version + 1) > t.version && (t.version = e), 1) } function v(t) { return o([function (t) { for (var e = t.length, n = new ArrayBuffer(e), r = new Uint8Array(n), i = 0; i < e; i++)r[i] = t.charCodeAt(i); return n }(atob(t.data))], { type: t.type }) } function y(t) { return t && t.__local_forage_encoded_blob } function b(t) { var e = this, n = e._initReady().then(function () { var t = R[e._dbInfo.name]; if (t && t.dbReady) return t.dbReady }); return u(n, t, t), n } function w(t, e, n, r) { void 0 === r && (r = 1); try { var i = t.db.transaction(t.storeName, e); n(null, i) } catch (i) { if (0 < r && (!t.db || "InvalidStateError" === i.name || "NotFoundError" === i.name)) return P.resolve().then(function () { if (!t.db || "NotFoundError" === i.name && !t.db.objectStoreNames.contains(t.storeName) && t.version <= t.db.version) return t.db && (t.version = t.db.version + 1), g(t) }).then(function () { return function (n) { c(n); for (var r = R[n.name], i = r.forages, t = 0; t < i.length; t++) { var e = i[t]; e._dbInfo.db && (e._dbInfo.db.close(), e._dbInfo.db = null) } return n.db = null, d(n).then(function (t) { return n.db = t, m(n) ? g(n) : t }).then(function (t) { n.db = r.db = t; for (var e = 0; e < i.length; e++)i[e]._dbInfo.db = t }).catch(function (t) { throw p(n, t), t }) }(t).then(function () { w(t, e, n, r - 1) }) }).catch(n); n(i) } } function _() { return { forages: [], db: null, dbReady: null, deferredOperations: [] } } function s(t) { var e, n, r, i, o = .75 * t.length, s = t.length, a = 0; "=" === t[t.length - 1] && (o--, "=" === t[t.length - 2] && o--); for (var o = new ArrayBuffer(o), u = new Uint8Array(o), c = 0; c < s; c += 4)e = H.indexOf(t[c]), n = H.indexOf(t[c + 1]), r = H.indexOf(t[c + 2]), i = H.indexOf(t[c + 3]), u[a++] = e << 2 | n >> 4, u[a++] = (15 & n) << 4 | r >> 2, u[a++] = (3 & r) << 6 | 63 & i; return o } function x(t) { for (var e = new Uint8Array(t), n = "", r = 0; r < e.length; r += 3)n += H[e[r] >> 2], n += H[(3 & e[r]) << 4 | e[r + 1] >> 4], n += H[(15 & e[r + 1]) << 2 | e[r + 2] >> 6], n += H[63 & e[r + 2]]; return e.length % 3 == 2 ? n = n.substring(0, n.length - 1) + "=" : e.length % 3 == 1 && (n = n.substring(0, n.length - 2) + "=="), n } function C(t, e, n, r) { t.executeSql("CREATE TABLE IF NOT EXISTS " + e.storeName + " (id INTEGER PRIMARY KEY, key unique, value)", [], n, r) } function k(t, r, i, o, s, a) { t.executeSql(i, o, s, function (t, n) { n.code === n.SYNTAX_ERR ? t.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?", [name], function (t, e) { e.rows.length ? a(t, n) : C(t, r, function () { t.executeSql(i, o, s, a) }, a) }, a) : a(t, n) }, a) } function S(s, t, a, u) { var c = this; s = h(s); var e = new P(function (i, o) { c.ready().then(function () { void 0 === t && (t = null); var n = t, r = c._dbInfo; r.serializer.serialize(t, function (e, t) { t ? o(t) : r.db.transaction(function (t) { k(t, r, "INSERT OR REPLACE INTO " + r.storeName + " (key, value) VALUES (?, ?)", [s, e], function () { i(n) }, function (t, e) { o(e) }) }, function (t) { t.code === t.QUOTA_ERR && (0 < u ? i(S.apply(c, [s, n, a, u - 1])) : o(t)) }) }) }).catch(o) }); return l(e, a), e } function O(t, e) { var n = t.name + "/"; return t.storeName !== e.storeName && (n += t.storeName + "/"), n } function E() { return !function () { var t = "_localforage_support_test"; try { return localStorage.setItem(t, !0), localStorage.removeItem(t), 0 } catch (t) { return 1 } }() || 0 < localStorage.length } function T(t) { for (var e = 1; e < arguments.length; e++) { var n = arguments[e]; if (n) for (var r in n) n.hasOwnProperty(r) && (X(n[r]) ? t[r] = n[r].slice() : t[r] = n[r]) } return t } var A = "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 }, I = function () { try { if ("undefined" != typeof indexedDB) return indexedDB; if ("undefined" != typeof webkitIndexedDB) return webkitIndexedDB; if ("undefined" != typeof mozIndexedDB) return mozIndexedDB; if ("undefined" != typeof OIndexedDB) return OIndexedDB; if ("undefined" != typeof msIndexedDB) return msIndexedDB } catch (t) { return } }(); "undefined" == typeof Promise && t(3); function j(t, e) { for (var n, r, i = t.length, o = 0; o < i;) { if ((n = t[o]) === (r = e) || "number" == typeof n && "number" == typeof r && isNaN(n) && isNaN(r)) return 1; o++ } } var P = Promise, N = "local-forage-detect-blob-support", D = void 0, R = {}, M = Object.prototype.toString, W = "readonly", L = "readwrite", F = { _driver: "asyncStorage", _initStorage: function (t) { function e() { return P.resolve() } var r = this, i = { db: null }; if (t) for (var n in t) i[n] = t[n]; var o = R[i.name]; o || (o = _(), R[i.name] = o), o.forages.push(r), r._initReady || (r._initReady = r.ready, r.ready = b); for (var s = [], a = 0; a < o.forages.length; a++) { var u = o.forages[a]; u !== r && s.push(u._initReady().catch(e)) } var c = o.forages.slice(0); return P.all(s).then(function () { return i.db = o.db, d(i) }).then(function (t) { return i.db = t, m(i, r._defaultConfig.version) ? g(i) : t }).then(function (t) { i.db = o.db = t, r._dbInfo = i; for (var e = 0; e < c.length; e++) { var n = c[e]; n !== r && (n._dbInfo.db = i.db, n._dbInfo.version = i.version) } }) }, _support: function () { try { if (!I) return !1; var t = "undefined" != typeof openDatabase && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform), e = "function" == typeof fetch && -1 !== fetch.toString().indexOf("[native code"); return (!t || e) && "undefined" != typeof indexedDB && "undefined" != typeof IDBKeyRange } catch (t) { return !1 } }(), iterate: function (s, t) { var a = this, e = new P(function (i, o) { a.ready().then(function () { w(a._dbInfo, W, function (t, e) { if (t) return o(t); try { var n = e.objectStore(a._dbInfo.storeName).openCursor(), r = 1; n.onsuccess = function () { var t, e = n.result; e ? (y(t = e.value) && (t = v(t)), void 0 !== (t = s(t, e.key, r++)) ? i(t) : e.continue()) : i() }, n.onerror = function () { o(n.error) } } catch (t) { o(t) } }) }).catch(o) }); return l(e, t), e }, getItem: function (o, t) { var s = this; o = h(o); var e = new P(function (r, i) { s.ready().then(function () { w(s._dbInfo, W, function (t, e) { if (t) return i(t); try { var n = e.objectStore(s._dbInfo.storeName).get(o); n.onsuccess = function () { var t = n.result; void 0 === t && (t = null), y(t) && (t = v(t)), r(t) }, n.onerror = function () { i(n.error) } } catch (t) { i(t) } }) }).catch(i) }); return l(e, t), e }, setItem: function (a, e, t) { var u = this; a = h(a); var n = new P(function (o, s) { var t; u.ready().then(function () { return t = u._dbInfo, "[object Blob]" === M.call(e) ? r(t.db).then(function (t) { return t ? e : (r = e, new P(function (e, t) { var n = new FileReader; n.onerror = t, n.onloadend = function (t) { t = btoa(t.target.result || ""); e({ __local_forage_encoded_blob: !0, data: t, type: r.type }) }, n.readAsBinaryString(r) })); var r }) : e }).then(function (i) { w(u._dbInfo, L, function (t, e) { if (t) return s(t); try { var n = e.objectStore(u._dbInfo.storeName); null === i && (i = void 0); var r = n.put(i, a); e.oncomplete = function () { void 0 === i && (i = null), o(i) }, e.onabort = e.onerror = function () { var t = r.error || r.transaction.error; s(t) } } catch (t) { s(t) } }) }).catch(s) }); return l(n, t), n }, removeItem: function (o, t) { var s = this; o = h(o); var e = new P(function (r, i) { s.ready().then(function () { w(s._dbInfo, L, function (t, e) { if (t) return i(t); try { var n = e.objectStore(s._dbInfo.storeName).delete(o); e.oncomplete = function () { r() }, e.onerror = function () { i(n.error) }, e.onabort = function () { var t = n.error || n.transaction.error; i(t) } } catch (t) { i(t) } }) }).catch(i) }); return l(e, t), e }, clear: function (t) { var o = this, e = new P(function (r, i) { o.ready().then(function () { w(o._dbInfo, L, function (t, e) { if (t) return i(t); try { var n = e.objectStore(o._dbInfo.storeName).clear(); e.oncomplete = function () { r() }, e.onabort = e.onerror = function () { var t = n.error || n.transaction.error; i(t) } } catch (t) { i(t) } }) }).catch(i) }); return l(e, t), e }, length: function (t) { var o = this, e = new P(function (r, i) { o.ready().then(function () { w(o._dbInfo, W, function (t, e) { if (t) return i(t); try { var n = e.objectStore(o._dbInfo.storeName).count(); n.onsuccess = function () { r(n.result) }, n.onerror = function () { i(n.error) } } catch (t) { i(t) } }) }).catch(i) }); return l(e, t), e }, key: function (a, t) { var u = this, e = new P(function (o, s) { a < 0 ? o(null) : u.ready().then(function () { w(u._dbInfo, W, function (t, e) { if (t) return s(t); try { var n = e.objectStore(u._dbInfo.storeName), r = !1, i = n.openCursor(); i.onsuccess = function () { var t = i.result; t ? 0 === a || r ? o(t.key) : (r = !0, t.advance(a)) : o(null) }, i.onerror = function () { s(i.error) } } catch (t) { s(t) } }) }).catch(s) }); return l(e, t), e }, keys: function (t) { var s = this, e = new P(function (i, o) { s.ready().then(function () { w(s._dbInfo, W, function (t, e) { if (t) return o(t); try { var n = e.objectStore(s._dbInfo.storeName).openCursor(), r = []; n.onsuccess = function () { var t = n.result; t ? (r.push(t.key), t.continue()) : i(r) }, n.onerror = function () { o(n.error) } } catch (t) { o(t) } }) }).catch(o) }); return l(e, t), e }, dropInstance: function (s, t) { t = a.apply(this, arguments); var e, n = this.config(); return (s = "function" != typeof s && s || {}).name || (s.name = s.name || n.name, s.storeName = s.storeName || n.storeName), l(e = s.name ? (e = s.name === n.name && this._dbInfo.db ? P.resolve(this._dbInfo.db) : d(s).then(function (t) { var e = R[s.name], n = e.forages; e.db = t; for (var r = 0; r < n.length; r++)n[r]._dbInfo.db = t; return t }), s.storeName ? e.then(function (t) { if (t.objectStoreNames.contains(s.storeName)) { var i = t.version + 1; c(s); var r = R[s.name], o = r.forages; t.close(); for (var e = 0; e < o.length; e++) { var n = o[e]; n._dbInfo.db = null, n._dbInfo.version = i } return new P(function (e, n) { var r = I.open(s.name, i); r.onerror = function (t) { r.result.close(), n(t) }, r.onupgradeneeded = function () { r.result.deleteObjectStore(s.storeName) }, r.onsuccess = function () { var t = r.result; t.close(), e(t) } }).then(function (t) { r.db = t; for (var e = 0; e < o.length; e++) { var n = o[e]; n._dbInfo.db = t, f(n._dbInfo) } }).catch(function (t) { throw (p(s, t) || P.resolve()).catch(function () { }), t }) } }) : e.then(function (t) { c(s); var n = R[s.name], r = n.forages; t.close(); for (var e = 0; e < r.length; e++)r[e]._dbInfo.db = null; return new P(function (e, n) { var r = I.deleteDatabase(s.name); r.onerror = r.onblocked = function (t) { var e = r.result; e && e.close(), n(t) }, r.onsuccess = function () { var t = r.result; t && t.close(), e(t) } }).then(function (t) { n.db = t; for (var e = 0; e < r.length; e++)f(r[e]._dbInfo) }).catch(function (t) { throw (p(s, t) || P.resolve()).catch(function () { }), t }) })) : P.reject("Invalid arguments"), t), e } }, H = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", B = /^~~local_forage_type~([^~]+)~/, q = "__lfsc__:", z = q.length, U = z + "arbf".length, G = Object.prototype.toString, V = { serialize: function (e, n) { var t = ""; if (e && (t = G.call(e)), e && ("[object ArrayBuffer]" === t || e.buffer && "[object ArrayBuffer]" === G.call(e.buffer))) { var r = q; e instanceof ArrayBuffer ? (i = e, r += "arbf") : (i = e.buffer, "[object Int8Array]" === t ? r += "si08" : "[object Uint8Array]" === t ? r += "ui08" : "[object Uint8ClampedArray]" === t ? r += "uic8" : "[object Int16Array]" === t ? r += "si16" : "[object Uint16Array]" === t ? r += "ur16" : "[object Int32Array]" === t ? r += "si32" : "[object Uint32Array]" === t ? r += "ui32" : "[object Float32Array]" === t ? r += "fl32" : "[object Float64Array]" === t ? r += "fl64" : n(new Error("Failed to get type for BinaryArray"))), n(r + x(i)) } else if ("[object Blob]" === t) { var i = new FileReader; i.onload = function () { var t = "~~local_forage_type~" + e.type + "~" + x(this.result); n(q + "blob" + t) }, i.readAsArrayBuffer(e) } else try { n(JSON.stringify(e)) } catch (t) { n(null, t) } }, deserialize: function (t) { if (t.substring(0, z) !== q) return JSON.parse(t); var e, n = t.substring(U), r = t.substring(z, U); "blob" === r && B.test(n) && (e = (t = n.match(B))[1], n = n.substring(t[0].length)); var i = s(n); switch (r) { case "arbf": return i; case "blob": return o([i], { type: e }); case "si08": return new Int8Array(i); case "ui08": return new Uint8Array(i); case "uic8": return new Uint8ClampedArray(i); case "si16": return new Int16Array(i); case "ur16": return new Uint16Array(i); case "si32": return new Int32Array(i); case "ui32": return new Uint32Array(i); case "fl32": return new Float32Array(i); case "fl64": return new Float64Array(i); default: throw new Error("Unkown type: " + r) } }, stringToBuffer: s, bufferToString: x }, $ = { _driver: "webSQLStorage", _initStorage: function (t) { var r = this, i = { db: null }; if (t) for (var e in t) i[e] = "string" != typeof t[e] ? t[e].toString() : t[e]; var n = new P(function (e, n) { try { i.db = openDatabase(i.name, String(i.version), i.description, i.size) } catch (e) { return n(e) } i.db.transaction(function (t) { C(t, i, function () { r._dbInfo = i, e() }, function (t, e) { n(e) }) }, n) }); return i.serializer = V, n }, _support: "function" == typeof openDatabase, iterate: function (c, t) { var e = this, n = new P(function (u, n) { e.ready().then(function () { var a = e._dbInfo; a.db.transaction(function (t) { k(t, a, "SELECT * FROM " + a.storeName, [], function (t, e) { for (var n = e.rows, r = n.length, i = 0; i < r; i++) { var o = n.item(i), s = (s = o.value) && a.serializer.deserialize(s); if (void 0 !== (s = c(s, o.key, i + 1))) return void u(s) } u() }, function (t, e) { n(e) }) }) }).catch(n) }); return l(n, t), n }, getItem: function (e, t) { var o = this; e = h(e); var n = new P(function (r, i) { o.ready().then(function () { var n = o._dbInfo; n.db.transaction(function (t) { k(t, n, "SELECT * FROM " + n.storeName + " WHERE key = ? LIMIT 1", [e], function (t, e) { e = (e = e.rows.length ? e.rows.item(0).value : null) && n.serializer.deserialize(e); r(e) }, function (t, e) { i(e) }) }) }).catch(i) }); return l(n, t), n }, setItem: function (t, e, n) { return S.apply(this, [t, e, n, 1]) }, removeItem: function (i, t) { var o = this; i = h(i); var e = new P(function (n, r) { o.ready().then(function () { var e = o._dbInfo; e.db.transaction(function (t) { k(t, e, "DELETE FROM " + e.storeName + " WHERE key = ?", [i], function () { n() }, function (t, e) { r(e) }) }) }).catch(r) }); return l(e, t), e }, clear: function (t) { var i = this, e = new P(function (n, r) { i.ready().then(function () { var e = i._dbInfo; e.db.transaction(function (t) { k(t, e, "DELETE FROM " + e.storeName, [], function () { n() }, function (t, e) { r(e) }) }) }).catch(r) }); return l(e, t), e }, length: function (t) { var i = this, e = new P(function (n, r) { i.ready().then(function () { var e = i._dbInfo; e.db.transaction(function (t) { k(t, e, "SELECT COUNT(key) as c FROM " + e.storeName, [], function (t, e) { e = e.rows.item(0).c; n(e) }, function (t, e) { r(e) }) }) }).catch(r) }); return l(e, t), e }, key: function (i, t) { var o = this, e = new P(function (n, r) { o.ready().then(function () { var e = o._dbInfo; e.db.transaction(function (t) { k(t, e, "SELECT key FROM " + e.storeName + " WHERE id = ? LIMIT 1", [i + 1], function (t, e) { e = e.rows.length ? e.rows.item(0).key : null; n(e) }, function (t, e) { r(e) }) }) }).catch(r) }); return l(e, t), e }, keys: function (t) { var r = this, e = new P(function (i, n) { r.ready().then(function () { var e = r._dbInfo; e.db.transaction(function (t) { k(t, e, "SELECT key FROM " + e.storeName, [], function (t, e) { for (var n = [], r = 0; r < e.rows.length; r++)n.push(e.rows.item(r).key); i(n) }, function (t, e) { n(e) }) }) }).catch(n) }); return l(e, t), e }, dropInstance: function (n, t) { t = a.apply(this, arguments); var r = this.config(); (n = "function" != typeof n && n || {}).name || (n.name = n.name || r.name, n.storeName = n.storeName || r.storeName); var i = this, e = n.name ? new P(function (t) { var o, e = n.name === r.name ? i._dbInfo.db : openDatabase(n.name, "", "", 0); t(n.storeName ? { db: e, storeNames: [n.storeName] } : (o = e, new P(function (i, n) { o.transaction(function (t) { t.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, e) { for (var n = [], r = 0; r < e.rows.length; r++)n.push(e.rows.item(r).name); i({ db: o, storeNames: n }) }, function (t, e) { n(e) }) }, function (t) { n(t) }) }))) }).then(function (s) { return new P(function (i, o) { s.db.transaction(function (r) { for (var t = [], e = 0, n = s.storeNames.length; e < n; e++)t.push(function (e) { return new P(function (t, n) { r.executeSql("DROP TABLE IF EXISTS " + e, [], function () { t() }, function (t, e) { n(e) }) }) }(s.storeNames[e])); P.all(t).then(function () { i() }).catch(function (t) { o(t) }) }, function (t) { o(t) }) }) }) : P.reject("Invalid arguments"); return l(e, t), e } }, t = { _driver: "localStorageWrapper", _initStorage: function (t) { var e = {}; if (t) for (var n in t) e[n] = t[n]; return e.keyPrefix = O(t, this._defaultConfig), E() ? ((this._dbInfo = e).serializer = V, P.resolve()) : P.reject() }, _support: function () { try { return "undefined" != typeof localStorage && "setItem" in localStorage && !!localStorage.setItem } catch (t) { return !1 } }(), iterate: function (u, t) { var c = this, e = c.ready().then(function () { for (var t = c._dbInfo, e = t.keyPrefix, n = e.length, r = localStorage.length, i = 1, o = 0; o < r; o++) { var s = localStorage.key(o); if (0 === s.indexOf(e)) { var a = (a = localStorage.getItem(s)) && t.serializer.deserialize(a); if (void 0 !== (a = u(a, s.substring(n), i++))) return a } } }); return l(e, t), e }, getItem: function (n, t) { var r = this; n = h(n); var e = r.ready().then(function () { var t = r._dbInfo, e = localStorage.getItem(t.keyPrefix + n); return e = e && t.serializer.deserialize(e) }); return l(e, t), e }, setItem: function (s, t, e) { var a = this; s = h(s); var n = a.ready().then(function () { void 0 === t && (t = null); var o = t; return new P(function (n, r) { var i = a._dbInfo; i.serializer.serialize(t, function (t, e) { if (e) r(e); else try { localStorage.setItem(i.keyPrefix + s, t), n(o) } catch (t) { "QuotaExceededError" !== t.name && "NS_ERROR_DOM_QUOTA_REACHED" !== t.name || r(t), r(t) } }) }) }); return l(n, e), n }, removeItem: function (e, t) { var n = this; e = h(e); var r = n.ready().then(function () { var t = n._dbInfo; localStorage.removeItem(t.keyPrefix + e) }); return l(r, t), r }, clear: function (t) { var r = this, e = r.ready().then(function () { for (var t = r._dbInfo.keyPrefix, e = localStorage.length - 1; 0 <= e; e--) { var n = localStorage.key(e); 0 === n.indexOf(t) && localStorage.removeItem(n) } }); return l(e, t), e }, length: function (t) { var e = this.keys().then(function (t) { return t.length }); return l(e, t), e }, key: function (n, t) { var r = this, e = r.ready().then(function () { var e, t = r._dbInfo; try { e = localStorage.key(n) } catch (t) { e = null } return e = e && e.substring(t.keyPrefix.length) }); return l(e, t), e }, keys: function (t) { var o = this, e = o.ready().then(function () { for (var t = o._dbInfo, e = localStorage.length, n = [], r = 0; r < e; r++) { var i = localStorage.key(r); 0 === i.indexOf(t.keyPrefix) && n.push(i.substring(t.keyPrefix.length)) } return n }); return l(e, t), e }, dropInstance: function (e, t) { t = a.apply(this, arguments), (e = "function" != typeof e && e || {}).name || (r = this.config(), e.name = e.name || r.name, e.storeName = e.storeName || r.storeName); var n = this, r = e.name ? new P(function (t) { t(e.storeName ? O(e, n._defaultConfig) : e.name + "/") }).then(function (t) { for (var e = localStorage.length - 1; 0 <= e; e--) { var n = localStorage.key(e); 0 === n.indexOf(t) && localStorage.removeItem(n) } }) : P.reject("Invalid arguments"); return l(r, t), r } }, X = Array.isArray || function (t) { return "[object Array]" === Object.prototype.toString.call(t) }, Y = {}, K = {}, Q = { INDEXEDDB: F, WEBSQL: $, LOCALSTORAGE: t }, t = [Q.INDEXEDDB._driver, Q.WEBSQL._driver, Q.LOCALSTORAGE._driver], J = ["dropInstance"], Z = ["clear", "getItem", "iterate", "key", "keys", "length", "removeItem", "setItem"].concat(J), tt = { description: "", driver: t.slice(), name: "localforage", size: 4980736, storeName: "keyvaluepairs", version: 1 }, t = new (et.prototype.config = function (t) { if ("object" !== (void 0 === t ? "undefined" : A(t))) return "string" == typeof t ? this._config[t] : this._config; if (this._ready) return new Error("Can't call config() after localforage has been used."); for (var e in t) { if ("storeName" === e && (t[e] = t[e].replace(/\W/g, "_")), "version" === e && "number" != typeof t[e]) return new Error("Database version must be a number."); this._config[e] = t[e] } return !("driver" in t && t.driver) || this.setDriver(this._config.driver) }, et.prototype.defineDriver = function (c, t, e) { var n = new P(function (e, n) { try { var r = c._driver, t = new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver"); if (!c._driver) return void n(t); for (var i = Z.concat("_initStorage"), o = 0, s = i.length; o < s; o++) { var a = i[o]; if ((!j(J, a) || c[a]) && "function" != typeof c[a]) return void n(t) } !function () { for (var t = 0, e = J.length; t < e; t++) { var n = J[t]; c[n] || (c[n] = function (e) { return function () { var t = new Error("Method " + e + " is not implemented by the current driver"), t = P.reject(t); return l(t, arguments[arguments.length - 1]), t } }(n)) } }(); var u = function (t) { Y[r], Y[r] = c, K[r] = t, e() }; "_support" in c ? c._support && "function" == typeof c._support ? c._support().then(u, n) : u(!!c._support) : u(!0) } catch (t) { n(t) } }); return u(n, t, e), n }, et.prototype.driver = function () { return this._driver || null }, et.prototype.getDriver = function (t, e, n) { t = Y[t] ? P.resolve(Y[t]) : P.reject(new Error("Driver not found.")); return u(t, e, n), t }, et.prototype.getSerializer = function (t) { var e = P.resolve(V); return u(e, t), e }, et.prototype.ready = function (t) { var e = this, n = e._driverSet.then(function () { return null === e._ready && (e._ready = e._initDriver()), e._ready }); return u(n, t, t), n }, et.prototype.setDriver = function (t, e, n) { function o() { a._config.driver = a.driver() } function s(t) { return a._extend(t), o(), a._ready = a._initStorage(a._config), a._ready } function r(i) { return function () { var r = 0; return function t() { for (; r < i.length;) { var e = i[r]; return r++, a._dbInfo = null, a._ready = null, a.getDriver(e).then(s).catch(t) } o(); var n = new Error("No available storage method found."); return a._driverSet = P.reject(n), a._driverSet }() } } var a = this; X(t) || (t = [t]); var i = this._getSupportedDrivers(t), t = null !== this._driverSet ? this._driverSet.catch(function () { return P.resolve() }) : P.resolve(); return this._driverSet = t.then(function () { var t = i[0]; return a._dbInfo = null, a._ready = null, a.getDriver(t).then(function (t) { a._driver = t._driver, o(), a._wrapLibraryMethodsWithReady(), a._initDriver = r(i) }) }).catch(function () { o(); var t = new Error("No available storage method found."); return a._driverSet = P.reject(t), a._driverSet }), u(this._driverSet, e, n), this._driverSet }, et.prototype.supports = function (t) { return !!K[t] }, et.prototype._extend = function (t) { T(this, t) }, et.prototype._getSupportedDrivers = function (t) { for (var e = [], n = 0, r = t.length; n < r; n++) { var i = t[n]; this.supports(i) && e.push(i) } return e }, et.prototype._wrapLibraryMethodsWithReady = function () { for (var t = 0, e = Z.length; t < e; t++)!function (e, n) { e[n] = function () { var t = arguments; return e.ready().then(function () { return e[n].apply(e, t) }) } }(this, Z[t]) }, et.prototype.createInstance = function (t) { return new et(t) }, et); function et(t) { for (var e in !function (t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") }(this, et), Q) { var n, r; Q.hasOwnProperty(e) && (r = (n = Q[e])._driver, this[e] = r, Y[r] || this.defineDriver(n)) } this._defaultConfig = T({}, tt), this._config = T({}, this._defaultConfig, t), this._driverSet = null, this._initDriver = null, this._ready = !1, this._dbInfo = null, this._wrapLibraryMethodsWithReady(), this.setDriver(this._config.driver).catch(function () { }) } e.exports = t }, { 3: 3 }] }, {}, [4])(4) }), function () { function Bo(t, e) { return t.set(e[0], e[1]), t } function qo(t, e) { return t.add(e), t } function zo(t, e, n) { switch (n.length) { case 0: return t.call(e); case 1: return t.call(e, n[0]); case 2: return t.call(e, n[0], n[1]); case 3: return t.call(e, n[0], n[1], n[2]) }return t.apply(e, n) } function Uo(t, e, n, r) { for (var i = -1, o = null == t ? 0 : t.length; ++i < o;) { var s = t[i]; e(r, s, n(s), t) } return r } function Go(t, e) { for (var n = -1, r = null == t ? 0 : t.length; ++n < r && !1 !== e(t[n], n, t);); return t } function Vo(t, e) { for (var n = null == t ? 0 : t.length; n-- && !1 !== e(t[n], n, t);); return t } function $o(t, e) { for (var n = -1, r = null == t ? 0 : t.length; ++n < r;)if (!e(t[n], n, t)) return !1; return !0 } function Xo(t, e) { for (var n = -1, r = null == t ? 0 : t.length, i = 0, o = []; ++n < r;) { var s = t[n]; e(s, n, t) && (o[i++] = s) } return o } function Yo(t, e) { return !!(null == t ? 0 : t.length) && -1 < is(t, e, 0) } function Ko(t, e, n) { for (var r = -1, i = null == t ? 0 : t.length; ++r < i;)if (n(e, t[r])) return !0; return !1 } function Qo(t, e) { for (var n = -1, r = null == t ? 0 : t.length, i = Array(r); ++n < r;)i[n] = e(t[n], n, t); return i } function Jo(t, e) { for (var n = -1, r = e.length, i = t.length; ++n < r;)t[i + n] = e[n]; return t } function Zo(t, e, n, r) { var i = -1, o = null == t ? 0 : t.length; for (r && o && (n = t[++i]); ++i < o;)n = e(n, t[i], i, t); return n } function ts(t, e, n, r) { var i = null == t ? 0 : t.length; for (r && i && (n = t[--i]); i--;)n = e(n, t[i], i, t); return n } function es(t, e) { for (var n = -1, r = null == t ? 0 : t.length; ++n < r;)if (e(t[n], n, t)) return !0; return !1 } function ns(t, r, e) { var i; return e(t, function (t, e, n) { if (r(t, e, n)) return i = e, !1 }), i } function rs(t, e, n, r) { for (var i = t.length, o = n + (r ? 1 : -1); r ? o-- : ++o < i;)if (e(t[o], o, t)) return o; return -1 } function is(t, e, n) { return e == e ? function (t, e, n) { for (var r = n - 1, i = t.length; ++r < i;)if (t[r] === e) return r; return -1 }(t, e, n) : rs(t, ss, n) } function os(t, e, n, r) { for (var i = n - 1, o = t.length; ++i < o;)if (r(t[i], e)) return i; return -1 } function ss(t) { return t != t } function as(t, e) { var n = null == t ? 0 : t.length; return n ? ls(t, e) / n : Is } function us(e) { return function (t) { return null == t ? Ss : t[e] } } function t(e) { return function (t) { return null == e ? Ss : e[t] } } function cs(t, r, i, o, e) { return e(t, function (t, e, n) { i = o ? (o = !1, t) : r(i, t, e, n) }), i } function ls(t, e) { for (var n, r = -1, i = t.length; ++r < i;) { var o = e(t[r]); o !== Ss && (n = n === Ss ? o : n + o) } return n } function hs(t, e) { for (var n = -1, r = Array(t); ++n < t;)r[n] = e(n); return r } function fs(e) { return function (t) { return e(t) } } function ps(e, t) { return Qo(t, function (t) { return e[t] }) } function ds(t, e) { return t.has(e) } function gs(t, e) { for (var n = -1, r = t.length; ++n < r && -1 < is(e, t[n], 0);); return n } function ms(t, e) { for (var n = t.length; n-- && -1 < is(e, t[n], 0);); return n } function vs(t) { return "\\" + C[t] } function ys(t) { return x.test(t) } function bs(t) { var n = -1, r = Array(t.size); return t.forEach(function (t, e) { r[++n] = [e, t] }), r } function ws(e, n) { return function (t) { return e(n(t)) } } function _s(t, e) { for (var n = -1, r = t.length, i = 0, o = []; ++n < r;) { var s = t[n]; s !== e && s !== Ts || (t[n] = Ts, o[i++] = n) } return o } function xs(t) { var e = -1, n = Array(t.size); return t.forEach(function (t) { n[++e] = t }), n } function Cs(t) { return (ys(t) ? function (t) { for (var e = _.lastIndex = 0; _.test(t);)++e; return e } : S)(t) } function ks(t) { return ys(t) ? t.match(_) || [] : t.split("") } var Ss, Os = "Expected a function", Es = "__lodash_hash_undefined__", Ts = "__lodash_placeholder__", As = 9007199254740991, Is = NaN, js = 4294967295, Ps = [["ary", 128], ["bind", 1], ["bindKey", 2], ["curry", 8], ["curryRight", 16], ["flip", 512], ["partial", 32], ["partialRight", 64], ["rearg", 256]], Ns = "[object Arguments]", Ds = "[object Array]", Rs = "[object Boolean]", Ms = "[object Date]", Ws = "[object Error]", Ls = "[object Function]", Fs = "[object GeneratorFunction]", Hs = "[object Map]", Bs = "[object Number]", qs = "[object Object]", zs = "[object Promise]", Us = "[object RegExp]", Gs = "[object Set]", Vs = "[object String]", $s = "[object Symbol]", Xs = "[object WeakMap]", Ys = "[object ArrayBuffer]", Ks = "[object DataView]", Qs = "[object Float32Array]", Js = "[object Float64Array]", Zs = "[object Int8Array]", ta = "[object Int16Array]", ea = "[object Int32Array]", na = "[object Uint8Array]", ra = "[object Uint8ClampedArray]", ia = "[object Uint16Array]", oa = "[object Uint32Array]", sa = /\b__p \+= '';/g, aa = /\b(__p \+=) '' \+/g, ua = /(__e\(.*?\)|\b__t\)) \+\n'';/g, ca = /&(?:amp|lt|gt|quot|#39);/g, la = /[&<>"']/g, ha = RegExp(ca.source), fa = RegExp(la.source), pa = /<%-([\s\S]+?)%>/g, da = /<%([\s\S]+?)%>/g, ga = /<%=([\s\S]+?)%>/g, ma = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, va = /^\w*$/, ya = /^\./, ba = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, wa = /[\\^$.*+?()[\]{}|]/g, _a = RegExp(wa.source), xa = /^\s+|\s+$/g, Ca = /^\s+/, ka = /\s+$/, Sa = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, Oa = /\{\n\/\* \[wrapped with (.+)\] \*/, Ea = /,? & /, Ta = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g, Aa = /\\(\\)?/g, Ia = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, ja = /\w*$/, Pa = /^[-+]0x[0-9a-f]+$/i, Na = /^0b[01]+$/i, Da = /^\[object .+?Constructor\]$/, Ra = /^0o[0-7]+$/i, Ma = /^(?:0|[1-9]\d*)$/, Wa = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g, La = /($^)/, Fa = /['\n\r\u2028\u2029\\]/g, e = "\\ud800-\\udfff", n = "\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff", r = "\\u2700-\\u27bf", i = "a-z\\xdf-\\xf6\\xf8-\\xff", o = "A-Z\\xc0-\\xd6\\xd8-\\xde", s = "\\ufe0e\\ufe0f", a = "\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", u = "[" + e + "]", c = "[" + a + "]", l = "[" + n + "]", h = "\\d+", f = "[" + r + "]", p = "[" + i + "]", d = "[^" + e + a + h + r + i + o + "]", g = "\\ud83c[\\udffb-\\udfff]", m = "[^" + e + "]", v = "(?:\\ud83c[\\udde6-\\uddff]){2}", y = "[\\ud800-\\udbff][\\udc00-\\udfff]", b = "[" + o + "]", w = "(?:" + p + "|" + d + ")", a = "(?:" + b + "|" + d + ")", r = "(?:['](?:d|ll|m|re|s|t|ve))?", i = "(?:['](?:D|LL|M|RE|S|T|VE))?", o = "(?:" + l + "|" + g + ")" + "?", d = "[" + s + "]?", o = d + o + ("(?:\\u200d(?:" + [m, v, y].join("|") + ")" + d + o + ")*"), f = "(?:" + [f, v, y].join("|") + ")" + o, u = "(?:" + [m + l + "?", l, v, y, u].join("|") + ")", Ha = RegExp("[']", "g"), Ba = RegExp(l, "g"), _ = RegExp(g + "(?=" + g + ")|" + u + o, "g"), qa = RegExp([b + "?" + p + "+" + r + "(?=" + [c, b, "$"].join("|") + ")", a + "+" + i + "(?=" + [c, b + w, "$"].join("|") + ")", b + "?" + w + "+" + r, b + "+" + i, "\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)", "\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)", h, f].join("|"), "g"), x = RegExp("[\\u200d" + e + n + s + "]"), za = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/, Ua = ["Array", "Buffer", "DataView", "Date", "Error", "Float32Array", "Float64Array", "Function", "Int8Array", "Int16Array", "Int32Array", "Map", "Math", "Object", "Promise", "RegExp", "Set", "String", "Symbol", "TypeError", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "WeakMap", "_", "clearTimeout", "isFinite", "parseInt", "setTimeout"], Ga = -1, Va = {}; Va[Qs] = Va[Js] = Va[Zs] = Va[ta] = Va[ea] = Va[na] = Va[ra] = Va[ia] = Va[oa] = !0, Va[Ns] = Va[Ds] = Va[Ys] = Va[Rs] = Va[Ks] = Va[Ms] = Va[Ws] = Va[Ls] = Va[Hs] = Va[Bs] = Va[qs] = Va[Us] = Va[Gs] = Va[Vs] = Va[Xs] = !1; var $a = {}; $a[Ns] = $a[Ds] = $a[Ys] = $a[Ks] = $a[Rs] = $a[Ms] = $a[Qs] = $a[Js] = $a[Zs] = $a[ta] = $a[ea] = $a[Hs] = $a[Bs] = $a[qs] = $a[Us] = $a[Gs] = $a[Vs] = $a[$s] = $a[na] = $a[ra] = $a[ia] = $a[oa] = !0, $a[Ws] = $a[Ls] = $a[Xs] = !1; var C = { "\\": "\\", "'": "'", "\n": "n", "\r": "r", "\u2028": "u2028", "\u2029": "u2029" }, Xa = parseFloat, Ya = parseInt, e = "object" == typeof global && global && global.Object === Object && global, n = "object" == typeof self && self && self.Object === Object && self, Ka = e || n || Function("return this")(), s = "object" == typeof exports && exports && !exports.nodeType && exports, n = s && "object" == typeof module && module && !module.nodeType && module, Qa = n && n.exports === s, k = Qa && e.process, e = function () { try { return k && k.binding && k.binding("util") } catch (t) { } }(), Ja = e && e.isArrayBuffer, Za = e && e.isDate, tu = e && e.isMap, eu = e && e.isRegExp, nu = e && e.isSet, ru = e && e.isTypedArray, S = us("length"), iu = t({ "À": "A", "Á": "A", "Â": "A", "Ã": "A", "Ä": "A", "Å": "A", "à": "a", "á": "a", "â": "a", "ã": "a", "ä": "a", "å": "a", "Ç": "C", "ç": "c", "Ð": "D", "ð": "d", "È": "E", "É": "E", "Ê": "E", "Ë": "E", "è": "e", "é": "e", "ê": "e", "ë": "e", "Ì": "I", "Í": "I", "Î": "I", "Ï": "I", "ì": "i", "í": "i", "î": "i", "ï": "i", "Ñ": "N", "ñ": "n", "Ò": "O", "Ó": "O", "Ô": "O", "Õ": "O", "Ö": "O", "Ø": "O", "ò": "o", "ó": "o", "ô": "o", "õ": "o", "ö": "o", "ø": "o", "Ù": "U", "Ú": "U", "Û": "U", "Ü": "U", "ù": "u", "ú": "u", "û": "u", "ü": "u", "Ý": "Y", "ý": "y", "ÿ": "y", "Æ": "Ae", "æ": "ae", "Þ": "Th", "þ": "th", "ß": "ss", "Ā": "A", "Ă": "A", "Ą": "A", "ā": "a", "ă": "a", "ą": "a", "Ć": "C", "Ĉ": "C", "Ċ": "C", "Č": "C", "ć": "c", "ĉ": "c", "ċ": "c", "č": "c", "Ď": "D", "Đ": "D", "ď": "d", "đ": "d", "Ē": "E", "Ĕ": "E", "Ė": "E", "Ę": "E", "Ě": "E", "ē": "e", "ĕ": "e", "ė": "e", "ę": "e", "ě": "e", "Ĝ": "G", "Ğ": "G", "Ġ": "G", "Ģ": "G", "ĝ": "g", "ğ": "g", "ġ": "g", "ģ": "g", "Ĥ": "H", "Ħ": "H", "ĥ": "h", "ħ": "h", "Ĩ": "I", "Ī": "I", "Ĭ": "I", "Į": "I", "İ": "I", "ĩ": "i", "ī": "i", "ĭ": "i", "į": "i", "ı": "i", "Ĵ": "J", "ĵ": "j", "Ķ": "K", "ķ": "k", "ĸ": "k", "Ĺ": "L", "Ļ": "L", "Ľ": "L", "Ŀ": "L", "Ł": "L", "ĺ": "l", "ļ": "l", "ľ": "l", "ŀ": "l", "ł": "l", "Ń": "N", "Ņ": "N", "Ň": "N", "Ŋ": "N", "ń": "n", "ņ": "n", "ň": "n", "ŋ": "n", "Ō": "O", "Ŏ": "O", "Ő": "O", "ō": "o", "ŏ": "o", "ő": "o", "Ŕ": "R", "Ŗ": "R", "Ř": "R", "ŕ": "r", "ŗ": "r", "ř": "r", "Ś": "S", "Ŝ": "S", "Ş": "S", "Š": "S", "ś": "s", "ŝ": "s", "ş": "s", "š": "s", "Ţ": "T", "Ť": "T", "Ŧ": "T", "ţ": "t", "ť": "t", "ŧ": "t", "Ũ": "U", "Ū": "U", "Ŭ": "U", "Ů": "U", "Ű": "U", "Ų": "U", "ũ": "u", "ū": "u", "ŭ": "u", "ů": "u", "ű": "u", "ų": "u", "Ŵ": "W", "ŵ": "w", "Ŷ": "Y", "ŷ": "y", "Ÿ": "Y", "Ź": "Z", "Ż": "Z", "Ž": "Z", "ź": "z", "ż": "z", "ž": "z", "IJ": "IJ", "ij": "ij", "Œ": "Oe", "œ": "oe", "ʼn": "'n", "ſ": "s" }), ou = t({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }), su = t({ "&amp;": "&", "&lt;": "<", "&gt;": ">", "&quot;": '"', "&#39;": "'" }), au = function t(e) { function d(t) { if (hn(t) && !io(t) && !(t instanceof m)) { if (t instanceof g) return t; if (tr.call(t, "__wrapped__")) return Me(t) } return new g(t) } function o() { } function g(t, e) { this.__wrapped__ = t, this.__actions__ = [], this.__chain__ = !!e, this.__index__ = 0, this.__values__ = Ss } function m(t) { this.__wrapped__ = t, this.__actions__ = [], this.__dir__ = 1, this.__filtered__ = !1, this.__iteratees__ = [], this.__takeCount__ = js, this.__views__ = [] } function n(t) { var e = -1, n = null == t ? 0 : t.length; for (this.clear(); ++e < n;) { var r = t[e]; this.set(r[0], r[1]) } } function i(t) { var e = -1, n = null == t ? 0 : t.length; for (this.clear(); ++e < n;) { var r = t[e]; this.set(r[0], r[1]) } } function s(t) { var e = -1, n = null == t ? 0 : t.length; for (this.clear(); ++e < n;) { var r = t[e]; this.set(r[0], r[1]) } } function v(t) { var e = -1, n = null == t ? 0 : t.length; for (this.__data__ = new s; ++e < n;)this.add(t[e]) } function y(t) { t = this.__data__ = new i(t); this.size = t.size } function r(t, e) { var n, r = io(t), i = !r && ro(t), o = !r && !i && so(t), s = !r && !i && !o && ho(t), a = r || i || o || s, u = a ? hs(t.length, $n) : [], c = u.length; for (n in t) !e && !tr.call(t, n) || a && ("length" == n || o && ("offset" == n || "parent" == n) || s && ("buffer" == n || "byteLength" == n || "byteOffset" == n) || xe(n, c)) || u.push(n); return u } function a(t) { var e = t.length; return e ? t[ot(0, e - 1)] : Ss } function u(t, e) { return Ne(Mt(t), x(e, 0, t.length)) } function c(t) { return Ne(Mt(t)) } function p(t, e, n) { (n === Ss || nn(t[e], n)) && (n !== Ss || e in t) || f(t, e, n) } function b(t, e, n) { var r = t[e]; tr.call(t, e) && nn(r, n) && (n !== Ss || e in t) || f(t, e, n) } function l(t, e) { for (var n = t.length; n--;)if (nn(t[n][0], e)) return n; return -1 } function h(t, r, i, o) { return Zr(t, function (t, e, n) { r(o, t, i(t), n) }), o } function w(t, e) { return t && Wt(e, Sn(e), t) } function f(t, e, n) { "__proto__" == e && yr ? yr(t, e, { configurable: !0, enumerable: !0, value: n, writable: !0 }) : t[e] = n } function _(t, e) { for (var n = -1, r = e.length, i = Hn(r), o = null == t; ++n < r;)i[n] = o ? Ss : Cn(t, e[n]); return i } function x(t, e, n) { return t == t && (n !== Ss && (t = t <= n ? t : n), e !== Ss && (t = e <= t ? t : e)), t } function C(n, r, i, t, e, o) { var s, a = 1 & r, u = 2 & r, c = 4 & r; if (i && (s = e ? i(n, t, e, o) : i(n)), s !== Ss) return s; if (!ln(n)) return n; var l, h, f = io(n); if (f) { if (t = (p = n).length, d = p.constructor(t), t && "string" == typeof p[0] && tr.call(p, "index") && (d.index = p.index, d.input = p.input), s = d, !a) return Mt(n, s) } else { var p = hi(n), d = p == Ls || p == Fs; if (so(n)) return It(n, a); if (p == qs || p == Ns || d && !e) { if (s = u || d ? {} : we(n), !a) return u ? (d = l = n, h = (h = s) && Wt(d, On(d), h), Wt(l, li(l), h)) : (h = w(s, l = n), Wt(l, ci(l), h)) } else { if (!$a[p]) return e ? n : {}; s = function (t, e, n, r) { var i = t.constructor; switch (e) { case Ys: return jt(t); case Rs: case Ms: return new i(+t); case Ks: return function (t, e) { e = e ? jt(t.buffer) : t.buffer; return new t.constructor(e, t.byteOffset, t.byteLength) }(t, r); case Qs: case Js: case Zs: case ta: case ea: case na: case ra: case ia: case oa: return Pt(t, r); case Hs: return function (t, e, n) { return Zo(e ? n(bs(t), 1) : bs(t), Bo, new t.constructor) }(t, r, n); case Bs: case Vs: return new i(t); case Us: return function (t) { var e = new t.constructor(t.source, ja.exec(t)); return e.lastIndex = t.lastIndex, e }(t); case Gs: return function (t, e, n) { return Zo(e ? n(xs(t), 1) : xs(t), qo, new t.constructor) }(t, r, n); case $s: return function (t) { return Yr ? Gn(Yr.call(t)) : {} }(t) } }(n, p, C, a) } } a = (o = o || new y).get(n); if (a) return a; o.set(n, s); var g = f ? Ss : (c ? u ? fe : he : u ? On : Sn)(n); return Go(g || n, function (t, e) { g && (t = n[e = t]), b(s, e, C(t, r, i, e, n, o)) }), s } function k(t, e, n) { var r = n.length; if (null == t) return !r; for (t = Gn(t); r--;) { var i = n[r], o = e[i], s = t[i]; if (s === Ss && !(i in t) || !o(s)) return !1 } return !0 } function S(t, e, n) { if ("function" != typeof t) throw new Xn(Os); return mi(function () { t.apply(Ss, n) }, e) } function O(t, e, n, r) { var i = -1, o = Yo, s = !0, a = t.length, u = [], c = e.length; if (!a) return u; n && (e = Qo(e, fs(n))), r ? (o = Ko, s = !1) : 200 <= e.length && (o = ds, s = !1, e = new v(e)); t: for (; ++i < a;) { var l = t[i], h = null == n ? l : n(l), l = r || 0 !== l ? l : 0; if (s && h == h) { for (var f = c; f--;)if (e[f] === h) continue t; u.push(l) } else o(e, h, r) || u.push(l) } return u } function E(t, r) { var i = !0; return Zr(t, function (t, e, n) { return i = !!r(t, e, n) }), i } function T(t, e, n) { for (var r = -1, i = t.length; ++r < i;) { var o, s, a = t[r], u = e(a); null != u && (o === Ss ? u == u && !gn(u) : n(u, o)) && (o = u, s = a) } return s } function A(t, r) { var i = []; return Zr(t, function (t, e, n) { r(t, e, n) && i.push(t) }), i } function I(t, e, n, r, i) { var o = -1, s = t.length; for (n = n || _e, i = i || []; ++o < s;) { var a = t[o]; 0 < e && n(a) ? 1 < e ? I(a, e - 1, n, r, i) : Jo(i, a) : r || (i[i.length] = a) } return i } function j(t, e) { return t && ei(t, e, Sn) } function P(t, e) { return t && ni(t, e, Sn) } function N(e, t) { return Xo(t, function (t) { return an(e[t]) }) } function D(t, e) { for (var n = 0, r = (e = Tt(e, t)).length; null != t && n < r;)t = t[De(e[n++])]; return n && n == r ? t : Ss } function R(t, e, n) { e = e(t); return io(t) ? e : Jo(e, n(t)) } function M(t) { return null == t ? t === Ss ? "[object Undefined]" : "[object Null]" : vr && vr in Gn(t) ? function (t) { var e = tr.call(t, vr), n = t[vr]; try { t[vr] = Ss; var r = !0 } catch (t) { } var i = rr.call(t); return r && (e ? t[vr] = n : delete t[vr]), i }(t) : (t = t, rr.call(t)) } function W(t, e) { return e < t } function L(t, e) { return null != t && tr.call(t, e) } function F(t, e) { return null != t && e in Gn(t) } function H(t, e, n) { for (var r = n ? Ko : Yo, i = t[0].length, o = t.length, s = o, a = Hn(o), u = 1 / 0, c = []; s--;) { var l = t[s]; s && e && (l = Qo(l, fs(e))), u = Ir(l.length, u), a[s] = !n && (e || 120 <= i && 120 <= l.length) ? new v(s && l) : Ss } l = t[0]; var h = -1, f = a[0]; t: for (; ++h < i && c.length < u;) { var p = l[h], d = e ? e(p) : p, p = n || 0 !== p ? p : 0; if (!(f ? ds(f, d) : r(c, d, n))) { for (s = o; --s;) { var g = a[s]; if (!(g ? ds(g, d) : r(t[s], d, n))) continue t } f && f.push(d), c.push(p) } } return c } function B(t, e, n) { e = null == (t = Ie(t, e = Tt(e, t))) ? t : t[De(Be(e))]; return null == e ? Ss : zo(e, t, n) } function q(t) { return hn(t) && M(t) == Ns } function z(t, e, n, r, i) { return t === e || (null == t || null == e || !hn(t) && !hn(e) ? t != t && e != e : function (t, e, n, r, i, o) { var s = io(t), a = io(e), u = s ? Ds : hi(t), c = a ? Ds : hi(e), l = (u = u == Ns ? qs : u) == qs, a = (c = c == Ns ? qs : c) == qs, c = u == c; if (c && so(t)) { if (!so(e)) return !1; l = !(s = !0) } if (c && !l) return o = o || new y, s || ho(t) ? ce(t, e, n, r, i, o) : function (t, e, n, r, i, o, s) { switch (n) { case Ks: if (t.byteLength != e.byteLength || t.byteOffset != e.byteOffset) return !1; t = t.buffer, e = e.buffer; case Ys: return !(t.byteLength != e.byteLength || !o(new cr(t), new cr(e))); case Rs: case Ms: case Bs: return nn(+t, +e); case Ws: return t.name == e.name && t.message == e.message; case Us: case Vs: return t == e + ""; case Hs: var a = bs; case Gs: var u = 1 & r; if (a = a || xs, t.size != e.size && !u) return !1; u = s.get(t); if (u) return u == e; r |= 2, s.set(t, e); a = ce(a(t), a(e), r, i, o, s); return s.delete(t), a; case $s: if (Yr) return Yr.call(t) == Yr.call(e) }return !1 }(t, e, u, n, r, i, o); if (!(1 & n)) { l = l && tr.call(t, "__wrapped__"), a = a && tr.call(e, "__wrapped__"); if (l || a) { l = l ? t.value() : t, a = a ? e.value() : e; return o = o || new y, i(l, a, n, r, o) } } return !!c && (o = o || new y, function (t, e, n, r, i, o) { var s = 1 & n, a = he(t), u = a.length, c = he(e).length; if (u != c && !s) return !1; for (var l = u; l--;) { var h = a[l]; if (!(s ? h in e : tr.call(e, h))) return !1 } var f = o.get(t); if (f && o.get(e)) return f == e; var p = !0; o.set(t, e), o.set(e, t); for (var d = s; ++l < u;) { h = a[l]; var g, m = t[h], v = e[h]; if (r && (g = s ? r(v, m, h, e, t, o) : r(m, v, h, t, e, o)), !(g === Ss ? m === v || i(m, v, n, r, o) : g)) { p = !1; break } d = d || "constructor" == h } p && !d && (c = t.constructor, f = e.constructor, c != f && "constructor" in t && "constructor" in e && !("function" == typeof c && c instanceof c && "function" == typeof f && f instanceof f) && (p = !1)); return o.delete(t), o.delete(e), p }(t, e, n, r, i, o)) }(t, e, n, r, z, i)) } function U(t, e, n, r) { var i = n.length, o = i, s = !r; if (null == t) return !o; for (t = Gn(t); i--;) { var a = n[i]; if (s && a[2] ? a[1] !== t[a[0]] : !(a[0] in t)) return !1 } for (; ++i < o;) { var u = (a = n[i])[0], c = t[u], l = a[1]; if (s && a[2]) { if (c === Ss && !(u in t)) return !1 } else { var h, f = new y; if (r && (h = r(c, l, u, t, e, f)), !(h === Ss ? z(l, c, 3, r, f) : h)) return !1 } } return !0 } function G(t) { return !(!ln(t) || (e = t, nr && nr in e)) && (an(t) ? sr : Da).test(Re(t)); var e } function V(t) { return "function" == typeof t ? t : null == t ? Nn : "object" == typeof t ? io(t) ? J(t[0], t[1]) : Q(t) : Wn(t) } function $(t) { if (!Oe(t)) return Tr(t); var e, n = []; for (e in Gn(t)) tr.call(t, e) && "constructor" != e && n.push(e); return n } function X(t) { if (!ln(t)) return function (t) { var e = []; if (null != t) for (var n in Gn(t)) e.push(n); return e }(t); var e, n = Oe(t), r = []; for (e in t) ("constructor" != e || !n && tr.call(t, e)) && r.push(e); return r } function Y(t, e) { return t < e } function K(t, r) { var i = -1, o = rn(t) ? Hn(t.length) : []; return Zr(t, function (t, e, n) { o[++i] = r(t, e, n) }), o } function Q(e) { var n = ve(e); return 1 == n.length && n[0][2] ? Te(n[0][0], n[0][1]) : function (t) { return t === e || U(t, e, n) } } function J(n, r) { return ke(n) && Ee(r) ? Te(De(n), r) : function (t) { var e = Cn(t, n); return e === Ss && e === r ? kn(t, n) : z(r, e, 3) } } function Z(r, i, o, s, a) { r !== i && ei(i, function (t, e) { var n; ln(t) ? (a = a || new y, function (t, e, n, r, i, o, s) { var a = t[n], u = e[n], c = s.get(u); if (c) return p(t, n, c); var l = o ? o(a, u, n + "", t, e, s) : Ss, h = l === Ss; { var f; h && (f = io(u), c = !f && so(u), e = !f && !c && ho(u), l = u, f || c || e ? l = io(a) ? a : on(a) ? Mt(a) : c ? It(u, !(h = !1)) : e ? Pt(u, !(h = !1)) : [] : pn(u) || ro(u) ? ro(l = a) ? l = _n(a) : (!ln(a) || r && an(a)) && (l = we(u)) : h = !1) } h && (s.set(u, l), i(l, u, r, o, s), s.delete(u)), p(t, n, l) }(r, i, e, o, Z, s, a)) : ((n = s ? s(r[e], t, e + "", r, i, a) : Ss) === Ss && (n = t), p(r, e, n)) }, On) } function tt(t, e) { var n = t.length; if (n) return xe(e += e < 0 ? n : 0, n) ? t[e] : Ss } function et(t, r, n) { var i = -1; return r = Qo(r.length ? r : [Nn], fs(ge())), function (t, e) { var n = t.length; for (t.sort(e); n--;)t[n] = t[n].value; return t }(K(t, function (e, t, n) { return { criteria: Qo(r, function (t) { return t(e) }), index: ++i, value: e } }), function (t, e) { return function (t, e, n) { for (var r = -1, i = t.criteria, o = e.criteria, s = i.length, a = n.length; ++r < s;) { var u = Nt(i[r], o[r]); if (u) { if (a <= r) return u; var c = n[r]; return u * ("desc" == c ? -1 : 1) } } return t.index - e.index }(t, e, n) }) } function nt(t, e, n) { for (var r = -1, i = e.length, o = {}; ++r < i;) { var s = e[r], a = D(t, s); n(a, s) && lt(o, Tt(s, t), a) } return o } function rt(t, e, n, r) { var i = r ? os : is, o = -1, s = e.length, a = t; for (t === e && (e = Mt(e)), n && (a = Qo(t, fs(n))); ++o < s;)for (var u = 0, c = e[o], l = n ? n(c) : c; -1 < (u = i(a, l, u, r));)a !== t && dr.call(a, u, 1), dr.call(t, u, 1); return t } function it(t, e) { for (var n = t ? e.length : 0, r = n - 1; n--;) { var i, o = e[n]; n != r && o === i || (xe(i = o) ? dr.call(t, o, 1) : wt(t, o)) } return t } function ot(t, e) { return t + Cr(Nr() * (e - t + 1)) } function st(t, e) { var n = ""; if (!t || e < 1 || As < e) return n; for (; e % 2 && (n += t), e = Cr(e / 2), e && (t += t), e;); return n } function at(t, e) { return vi(Ae(t, e, Nn), t + "") } function ut(t) { return a(Tn(t)) } function ct(t, e) { t = Tn(t); return Ne(t, x(e, 0, t.length)) } function lt(t, e, n, r) { if (!ln(t)) return t; for (var i = -1, o = (e = Tt(e, t)).length, s = o - 1, a = t; null != a && ++i < o;) { var u, c = De(e[i]), l = n; i != s && (u = a[c], (l = r ? r(u, c, a) : Ss) === Ss && (l = ln(u) ? u : xe(e[i + 1]) ? [] : {})), b(a, c, l), a = a[c] } return t } function ht(t) { return Ne(Tn(t)) } function ft(t, e, n) { var r = -1, i = t.length; e < 0 && (e = i < -e ? 0 : i + e), (n = i < n ? i : n) < 0 && (n += i), i = n < e ? 0 : n - e >>> 0, e >>>= 0; for (var o = Hn(i); ++r < i;)o[r] = t[r + e]; return o } function pt(t, r) { var i; return Zr(t, function (t, e, n) { return !(i = r(t, e, n)) }), !!i } function dt(t, e, n) { var r = 0, i = null == t ? r : t.length; if ("number" == typeof e && e == e && i <= 2147483647) { for (; r < i;) { var o = r + i >>> 1, s = t[o]; null !== s && !gn(s) && (n ? s <= e : s < e) ? r = 1 + o : i = o } return i } return gt(t, e, Nn, n) } function gt(t, e, n, r) { e = n(e); for (var i = 0, o = null == t ? 0 : t.length, s = e != e, a = null === e, u = gn(e), c = e === Ss; i < o;) { var l = Cr((i + o) / 2), h = n(t[l]), f = h !== Ss, p = null === h, d = h == h, g = gn(h), h = s ? r || d : c ? d && (r || f) : a ? d && f && (r || !p) : u ? d && f && !p && (r || !g) : !p && !g && (r ? h <= e : h < e); h ? i = l + 1 : o = l } return Ir(o, 4294967294) } function mt(t, e) { for (var n = -1, r = t.length, i = 0, o = []; ++n < r;) { var s, a = t[n], u = e ? e(a) : a; n && nn(u, s) || (s = u, o[i++] = 0 === a ? 0 : a) } return o } function vt(t) { return "number" == typeof t ? t : gn(t) ? Is : +t } function yt(t) { if ("string" == typeof t) return t; if (io(t)) return Qo(t, yt) + ""; if (gn(t)) return Kr ? Kr.call(t) : ""; var e = t + ""; return "0" == e && 1 / t == -1 / 0 ? "-0" : e } function bt(t, e, n) { var r = -1, i = Yo, o = t.length, s = !0, a = [], u = a; if (n) s = !1, i = Ko; else if (200 <= o) { var c = e ? null : ai(t); if (c) return xs(c); s = !1, i = ds, u = new v } else u = e ? [] : a; t: for (; ++r < o;) { var l = t[r], h = e ? e(l) : l, l = n || 0 !== l ? l : 0; if (s && h == h) { for (var f = u.length; f--;)if (u[f] === h) continue t; e && u.push(h), a.push(l) } else i(u, h, n) || (u !== a && u.push(h), a.push(l)) } return a } function wt(t, e) { return null == (t = Ie(t, e = Tt(e, t))) || delete t[De(Be(e))] } function _t(t, e, n, r) { return lt(t, e, n(D(t, e)), r) } function xt(t, e, n, r) { for (var i = t.length, o = r ? i : -1; (r ? o-- : ++o < i) && e(t[o], o, t);); return n ? ft(t, r ? 0 : o, r ? o + 1 : i) : ft(t, r ? o + 1 : 0, r ? i : o) } function Ct(t, e) { return t instanceof m && (t = t.value()), Zo(e, function (t, e) { return e.func.apply(e.thisArg, Jo([t], e.args)) }, t) } function kt(t, e, n) { var r = t.length; if (r < 2) return r ? bt(t[0]) : []; for (var i = -1, o = Hn(r); ++i < r;)for (var s = t[i], a = -1; ++a < r;)a != i && (o[i] = O(o[i] || s, t[a], e, n)); return bt(I(o, 1), e, n) } function St(t, e, n) { for (var r = -1, i = t.length, o = e.length, s = {}; ++r < i;) { var a = r < o ? e[r] : Ss; n(s, t[r], a) } return s } function Ot(t) { return on(t) ? t : [] } function Et(t) { return "function" == typeof t ? t : Nn } function Tt(t, e) { return io(t) ? t : ke(t, e) ? [t] : yi(xn(t)) } function At(t, e, n) { var r = t.length; return n = n === Ss ? r : n, !e && r <= n ? t : ft(t, e, n) } function It(t, e) { if (e) return t.slice(); e = t.length, e = lr ? lr(e) : new t.constructor(e); return t.copy(e), e } function jt(t) { var e = new t.constructor(t.byteLength); return new cr(e).set(new cr(t)), e } function Pt(t, e) { e = e ? jt(t.buffer) : t.buffer; return new t.constructor(e, t.byteOffset, t.length) } function Nt(t, e) { if (t !== e) { var n = t !== Ss, r = null === t, i = t == t, o = gn(t), s = e !== Ss, a = null === e, u = e == e, c = gn(e); if (!a && !c && !o && e < t || o && s && u && !a && !c || r && s && u || !n && u || !i) return 1; if (!r && !o && !c && t < e || c && n && i && !r && !o || a && n && i || !s && i || !u) return -1 } return 0 } function Dt(t, e, n, r) { for (var i = -1, o = t.length, s = n.length, a = -1, u = e.length, c = Ar(o - s, 0), l = Hn(u + c), h = !r; ++a < u;)l[a] = e[a]; for (; ++i < s;)(h || i < o) && (l[n[i]] = t[i]); for (; c--;)l[a++] = t[i++]; return l } function Rt(t, e, n, r) { for (var i = -1, o = t.length, s = -1, a = n.length, u = -1, c = e.length, l = Ar(o - a, 0), h = Hn(l + c), f = !r; ++i < l;)h[i] = t[i]; for (var p = i; ++u < c;)h[p + u] = e[u]; for (; ++s < a;)(f || i < o) && (h[p + n[s]] = t[i++]); return h } function Mt(t, e) { var n = -1, r = t.length; for (e = e || Hn(r); ++n < r;)e[n] = t[n]; return e } function Wt(t, e, n, r) { var i = !n; n = n || {}; for (var o = -1, s = e.length; ++o < s;) { var a = e[o], u = r ? r(n[a], t[a], a, n, t) : Ss; u === Ss && (u = t[a]), (i ? f : b)(n, a, u) } return n } function Lt(i, o) { return function (t, e) { var n = io(t) ? Uo : h, r = o ? o() : {}; return n(t, i, ge(e, 2), r) } } function Ft(a) { return at(function (t, e) { var n = -1, r = e.length, i = 1 < r ? e[r - 1] : Ss, o = 2 < r ? e[2] : Ss, i = 3 < a.length && "function" == typeof i ? (r--, i) : Ss; for (o && Ce(e[0], e[1], o) && (i = r < 3 ? Ss : i, r = 1), t = Gn(t); ++n < r;) { var s = e[n]; s && a(t, s, n, i) } return t }) } function Ht(o, s) { return function (t, e) { if (null == t) return t; if (!rn(t)) return o(t, e); for (var n = t.length, r = s ? n : -1, i = Gn(t); (s ? r-- : ++r < n) && !1 !== e(i[r], r, i);); return t } } function Bt(u) { return function (t, e, n) { for (var r = -1, i = Gn(t), o = n(t), s = o.length; s--;) { var a = o[u ? s : ++r]; if (!1 === e(i[a], a, i)) break } return t } } function qt(r) { return function (t) { var e = ys(t = xn(t)) ? ks(t) : Ss, n = e ? e[0] : t.charAt(0), t = e ? At(e, 1).join("") : t.slice(1); return n[r]() + t } } function zt(e) { return function (t) { return Zo(jn(In(t).replace(Ha, "")), e, "") } } function Ut(r) { return function () { var t = arguments; switch (t.length) { case 0: return new r; case 1: return new r(t[0]); case 2: return new r(t[0], t[1]); case 3: return new r(t[0], t[1], t[2]); case 4: return new r(t[0], t[1], t[2], t[3]); case 5: return new r(t[0], t[1], t[2], t[3], t[4]); case 6: return new r(t[0], t[1], t[2], t[3], t[4], t[5]); case 7: return new r(t[0], t[1], t[2], t[3], t[4], t[5], t[6]) }var e = Qr(r.prototype), n = r.apply(e, t); return ln(n) ? n : e } } function Gt(o, s, a) { var u = Ut(o); return function t() { for (var e = arguments.length, n = Hn(e), r = e, i = de(t); r--;)n[r] = arguments[r]; i = e < 3 && n[0] !== i && n[e - 1] !== i ? [] : _s(n, i); return (e -= i.length) < a ? ne(o, s, Xt, t.placeholder, Ss, n, i, Ss, Ss, a - e) : zo(this && this !== Ka && this instanceof t ? u : o, this, n) } } function Vt(o) { return function (t, e, n) { var r, i = Gn(t); rn(t) || (r = ge(e, 3), t = Sn(t), e = function (t) { return r(i[t], t, i) }); n = o(t, e, n); return -1 < n ? i[r ? t[n] : n] : Ss } } function $t(u) { return le(function (i) { var o = i.length, t = o, e = g.prototype.thru; for (u && i.reverse(); t--;) { var n = i[t]; if ("function" != typeof n) throw new Xn(Os); e && !a && "wrapper" == pe(n) && (a = new g([], !0)) } for (t = a ? t : o; ++t < o;)var r = pe(n = i[t]), s = "wrapper" == r ? ui(n) : Ss, a = s && Se(s[0]) && 424 == s[1] && !s[4].length && 1 == s[9] ? a[pe(s[0])].apply(a, s[3]) : 1 == n.length && Se(n) ? a[r]() : a.thru(n); return function () { var t = arguments, e = t[0]; if (a && 1 == t.length && io(e)) return a.plant(e).value(); for (var n = 0, r = o ? i[n].apply(this, t) : e; ++n < o;)r = i[n].call(this, r); return r } }) } function Xt(a, u, c, l, h, f, p, d, g, m) { var v = 128 & u, y = 1 & u, b = 2 & u, w = 24 & u, _ = 512 & u, x = b ? Ss : Ut(a); return function t() { for (var e, n = Hn(s = arguments.length), r = s; r--;)n[r] = arguments[r]; if (w && (e = function (t, e) { for (var n = t.length, r = 0; n--;)t[n] === e && ++r; return r }(n, o = de(t))), l && (n = Dt(n, l, h, w)), f && (n = Rt(n, f, p, w)), s -= e, w && s < m) { var i = _s(n, o); return ne(a, u, Xt, t.placeholder, c, n, i, d, g, m - s) } var o = y ? c : this, i = b ? o[a] : a, s = n.length; return d ? n = function (t, e) { for (var n = t.length, r = Ir(e.length, n), i = Mt(t); r--;) { var o = e[r]; t[r] = xe(o, n) ? i[o] : Ss } return t }(n, d) : _ && 1 < s && n.reverse(), v && g < s && (n.length = g), this && this !== Ka && this instanceof t && (i = x || Ut(i)), i.apply(o, n) } } function Yt(n, s) { return function (t, e) { return t = t, r = n, i = s(e), o = {}, j(t, function (t, e, n) { r(o, i(t), e, n) }), o; var r, i, o } } function Kt(r, i) { return function (t, e) { var n; if (t === Ss && e === Ss) return i; if (t !== Ss && (n = t), e !== Ss) { if (n === Ss) return e; e = "string" == typeof t || "string" == typeof e ? (t = yt(t), yt(e)) : (t = vt(t), vt(e)), n = r(t, e) } return n } } function Qt(r) { return le(function (t) { return t = Qo(t, fs(ge())), at(function (e) { var n = this; return r(t, function (t) { return zo(t, n, e) }) }) }) } function Jt(t, e) { var n = (e = e === Ss ? " " : yt(e)).length; if (n < 2) return n ? st(e, t) : e; n = st(e, xr(t / Cs(e))); return ys(e) ? At(ks(n), 0, t).join("") : n.slice(0, t) } function Zt(a, t, u, c) { var l = 1 & t, h = Ut(a); return function t() { for (var e = -1, n = arguments.length, r = -1, i = c.length, o = Hn(i + n), s = this && this !== Ka && this instanceof t ? h : a; ++r < i;)o[r] = c[r]; for (; n--;)o[r++] = arguments[++e]; return zo(s, l ? u : this, o) } } function te(r) { return function (t, e, n) { return n && "number" != typeof n && Ce(t, e, n) && (e = n = Ss), t = vn(t), e === Ss ? (e = t, t = 0) : e = vn(e), function (t, e, n, r) { for (var i = -1, o = Ar(xr((e - t) / (n || 1)), 0), s = Hn(o); o--;)s[r ? o : ++i] = t, t += n; return s }(t, e, n = n === Ss ? t < e ? 1 : -1 : vn(n), r) } } function ee(n) { return function (t, e) { return "string" == typeof t && "string" == typeof e || (t = wn(t), e = wn(e)), n(t, e) } } function ne(t, e, n, r, i, o, s, a, u, c) { var l = 8 & e; e |= l ? 32 : 64, 4 & (e &= ~(l ? 64 : 32)) || (e &= -4); c = [t, e, i, l ? o : Ss, l ? s : Ss, l ? Ss : o, l ? Ss : s, a, u, c], n = n.apply(Ss, c); return Se(t) && gi(n, c), n.placeholder = r, je(n, t, e) } function re(t) { var r = Un[t]; return function (t, e) { if (t = wn(t), e = null == e ? 0 : Ir(yn(e), 292)) { var n = (xn(t) + "e").split("e"); return +((n = (xn(r(n[0] + "e" + (+n[1] + e))) + "e").split("e"))[0] + "e" + (+n[1] - e)) } return r(t) } } function ie(o) { return function (t) { var e, n, r, i = hi(t); return i == Hs ? bs(t) : i == Gs ? (i = t, n = -1, r = Array(i.size), i.forEach(function (t) { r[++n] = [t, t] }), r) : Qo(o(e = t), function (t) { return [t, e[t]] }) } } function oe(t, e, n, r, i, o, s, a) { var u = 2 & e; if (!u && "function" != typeof t) throw new Xn(Os); var c, l, h = r ? r.length : 0; h || (e &= -97, r = i = Ss), s = s === Ss ? s : Ar(yn(s), 0), a = a === Ss ? a : yn(a), h -= i ? i.length : 0, 64 & e && (c = r, l = i, r = i = Ss); var f, p, d, g, m = u ? Ss : ui(t), s = [t, e, n, r, i, c, l, o, s, a]; return m && function (t, e) { var n = t[1], r = e[1], i = n | r, o = i < 131, s = 128 == r && 8 == n || 128 == r && 256 == n && t[7].length <= e[8] || 384 == r && e[7].length <= e[8] && 8 == n; if (!o && !s) return; 1 & r && (t[2] = e[2], i |= 1 & n ? 0 : 4); n = e[3]; { var a; n && (a = t[3], t[3] = a ? Dt(a, n, e[4]) : n, t[4] = a ? _s(t[3], Ts) : e[4]) } (n = e[5]) && (a = t[5], t[5] = a ? Rt(a, n, e[6]) : n, t[6] = a ? _s(t[5], Ts) : e[6]), (n = e[7]) && (t[7] = n), 128 & r && (t[8] = null == t[8] ? e[8] : Ir(t[8], e[8])), null == t[9] && (t[9] = e[9]), t[0] = e[0], t[1] = i }(s, m), t = s[0], e = s[1], n = s[2], r = s[3], i = s[4], !(a = s[9] = s[9] === Ss ? u ? 0 : t.length : Ar(s[9] - h, 0)) && 24 & e && (e &= -25), n = e && 1 != e ? 8 == e || 16 == e ? Gt(t, e, a) : 32 != e && 33 != e || i.length ? Xt.apply(Ss, s) : Zt(t, e, n, r) : (p = n, d = 1 & e, g = Ut(f = t), function t() { return (this && this !== Ka && this instanceof t ? g : f).apply(d ? p : this, arguments) }), je((m ? ri : gi)(n, s), t, e) } function se(t, e, n, r) { return t === Ss || nn(t, Qn[n]) && !tr.call(r, n) ? e : t } function ae(t, e, n, r, i, o) { return ln(t) && ln(e) && (o.set(e, t), Z(t, e, Ss, ae, o), o.delete(e)), t } function ue(t) { return pn(t) ? Ss : t } function ce(t, e, n, r, i, o) { var s = 1 & n, a = t.length, u = e.length; if (a != u && !(s && a < u)) return !1; u = o.get(t); if (u && o.get(e)) return u == e; var c = -1, l = !0, h = 2 & n ? new v : Ss; for (o.set(t, e), o.set(e, t); ++c < a;) { var f, p = t[c], d = e[c]; if (r && (f = s ? r(d, p, c, e, t, o) : r(p, d, c, t, e, o)), f !== Ss) { if (f) continue; l = !1; break } if (h) { if (!es(e, function (t, e) { return !ds(h, e) && (p === t || i(p, t, n, r, o)) && h.push(e) })) { l = !1; break } } else if (p !== d && !i(p, d, n, r, o)) { l = !1; break } } return o.delete(t), o.delete(e), l } function le(t) { return vi(Ae(t, Ss, Fe), t + "") } function he(t) { return R(t, Sn, ci) } function fe(t) { return R(t, On, li) } function pe(t) { for (var e = t.name + "", n = qr[e], r = tr.call(qr, e) ? n.length : 0; r--;) { var i = n[r], o = i.func; if (null == o || o == t) return i.name } return e } function de(t) { return (tr.call(d, "placeholder") ? d : t).placeholder } function ge() { var t = (t = d.iteratee || Dn) === Dn ? V : t; return arguments.length ? t(arguments[0], arguments[1]) : t } function me(t, e) { var n, r = t.__data__; return ("string" == (t = typeof (n = e)) || "number" == t || "symbol" == t || "boolean" == t ? "__proto__" !== n : null === n) ? r["string" == typeof e ? "string" : "hash"] : r.map } function ve(t) { for (var e = Sn(t), n = e.length; n--;) { var r = e[n], i = t[r]; e[n] = [r, i, Ee(i)] } return e } function ye(t, e) { e = e, e = null == (t = t) ? Ss : t[e]; return G(e) ? e : Ss } function be(t, e, n) { for (var r = -1, i = (e = Tt(e, t)).length, o = !1; ++r < i;) { var s = De(e[r]); if (!(o = null != t && n(t, s))) break; t = t[s] } return o || ++r != i ? o : !!(i = null == t ? 0 : t.length) && cn(i) && xe(s, i) && (io(t) || ro(t)) } function we(t) { return "function" != typeof t.constructor || Oe(t) ? {} : Qr(hr(t)) } function _e(t) { return io(t) || ro(t) || !!(gr && t && t[gr]) } function xe(t, e) { return !!(e = null == e ? As : e) && ("number" == typeof t || Ma.test(t)) && -1 < t && t % 1 == 0 && t < e } function Ce(t, e, n) { if (ln(n)) { var r = typeof e; return ("number" == r ? rn(n) && xe(e, n.length) : "string" == r && e in n) && nn(n[e], t) } } function ke(t, e) { if (!io(t)) { var n = typeof t; return "number" == n || "symbol" == n || "boolean" == n || null == t || gn(t) || va.test(t) || !ma.test(t) || null != e && t in Gn(e) } } function Se(t) { var e = pe(t), n = d[e]; if ("function" == typeof n && e in m.prototype) { if (t === n) return 1; n = ui(n); return n && t === n[0] } } function Oe(t) { var e = t && t.constructor; return t === ("function" == typeof e && e.prototype || Qn) } function Ee(t) { return t == t && !ln(t) } function Te(e, n) { return function (t) { return null != t && t[e] === n && (n !== Ss || e in Gn(t)) } } function Ae(o, s, a) { return s = Ar(s === Ss ? o.length - 1 : s, 0), function () { for (var t = arguments, e = -1, n = Ar(t.length - s, 0), r = Hn(n); ++e < n;)r[e] = t[s + e]; e = -1; for (var i = Hn(s + 1); ++e < s;)i[e] = t[e]; return i[s] = a(r), zo(o, this, i) } } function Ie(t, e) { return e.length < 2 ? t : D(t, ft(e, 0, -1)) } function je(t, e, n) { var r, i, e = e + ""; return vi(t, function (t, e) { var n = e.length; if (!n) return t; var r = n - 1; return e[r] = (1 < n ? "& " : "") + e[r], e = e.join(2 < n ? ", " : " "), t.replace(Sa, "{\n/* [wrapped with " + e + "] */\n") }(e, (r = (e = (e = e).match(Oa)) ? e[1].split(Ea) : [], i = n, Go(Ps, function (t) { var e = "_." + t[0]; i & t[1] && !Yo(r, e) && r.push(e) }), r.sort()))) } function Pe(n) { var r = 0, i = 0; return function () { var t = jr(), e = 16 - (t - i); if (i = t, 0 < e) { if (800 <= ++r) return arguments[0] } else r = 0; return n.apply(Ss, arguments) } } function Ne(t, e) { var n = -1, r = t.length, i = r - 1; for (e = e === Ss ? r : e; ++n < e;) { var o = ot(n, i), s = t[o]; t[o] = t[n], t[n] = s } return t.length = e, t } function De(t) { if ("string" == typeof t || gn(t)) return t; var e = t + ""; return "0" == e && 1 / t == -1 / 0 ? "-0" : e } function Re(t) { if (null != t) { try { return Zn.call(t) } catch (t) { } try { return t + "" } catch (t) { } } return "" } function Me(t) { if (t instanceof m) return t.clone(); var e = new g(t.__wrapped__, t.__chain__); return e.__actions__ = Mt(t.__actions__), e.__index__ = t.__index__, e.__values__ = t.__values__, e } function We(t, e, n) { var r = null == t ? 0 : t.length; if (!r) return -1; n = null == n ? 0 : yn(n); return n < 0 && (n = Ar(r + n, 0)), rs(t, ge(e, 3), n) } function Le(t, e, n) { var r = null == t ? 0 : t.length; if (!r) return -1; var i = r - 1; return n !== Ss && (i = yn(n), i = n < 0 ? Ar(r + i, 0) : Ir(i, r - 1)), rs(t, ge(e, 3), i, !0) } function Fe(t) { return (null == t ? 0 : t.length) ? I(t, 1) : [] } function He(t) { return t && t.length ? t[0] : Ss } function Be(t) { var e = null == t ? 0 : t.length; return e ? t[e - 1] : Ss } function qe(t, e) { return t && t.length && e && e.length ? rt(t, e) : t } function ze(t) { return null == t ? t : Dr.call(t) } function Ue(e) { if (!e || !e.length) return []; var n = 0; return e = Xo(e, function (t) { return on(t) && (n = Ar(t.length, n), 1) }), hs(n, function (t) { return Qo(e, us(t)) }) } function Ge(t, e) { if (!t || !t.length) return []; t = Ue(t); return null == e ? t : Qo(t, function (t) { return zo(e, Ss, t) }) } function Ve(t) { t = d(t); return t.__chain__ = !0, t } function $e(t, e) { return e(t) } function Xe(t, e) { return (io(t) ? Go : Zr)(t, ge(e, 3)) } function Ye(t, e) { return (io(t) ? Vo : ti)(t, ge(e, 3)) } function Ke(t, e) { return (io(t) ? Qo : K)(t, ge(e, 3)) } function Qe(t, e, n) { return e = n ? Ss : e, e = t && null == e ? t.length : e, oe(t, 128, Ss, Ss, Ss, Ss, e) } function Je(t, e) { var n; if ("function" != typeof e) throw new Xn(Os); return t = yn(t), function () { return 0 < --t && (n = e.apply(this, arguments)), t <= 1 && (e = Ss), n } } function Ze(r, n, t) { function i(t) { var e = u, n = c; return u = c = Ss, d = t, h = r.apply(n, e) } function o(t) { var e = t - p; return p === Ss || n <= e || e < 0 || m && l <= t - d } function s() { var t, e = Gi(); return o(e) ? a(e) : void (f = mi(s, (e = n - ((t = e) - p), m ? Ir(e, l - (t - d)) : e))) } function a(t) { return f = Ss, v && u ? i(t) : (u = c = Ss, h) } function e() { var t = Gi(), e = o(t); if (u = arguments, c = this, p = t, e) { if (f === Ss) return d = e = p, f = mi(s, n), g ? i(e) : h; if (m) return f = mi(s, n), i(p) } return f === Ss && (f = mi(s, n)), h } var u, c, l, h, f, p, d = 0, g = !1, m = !1, v = !0; if ("function" != typeof r) throw new Xn(Os); return n = wn(n) || 0, ln(t) && (g = !!t.leading, m = "maxWait" in t, l = m ? Ar(wn(t.maxWait) || 0, n) : l, v = "trailing" in t ? !!t.trailing : v), e.cancel = function () { f !== Ss && si(f), d = 0, u = p = c = f = Ss }, e.flush = function () { return f === Ss ? h : a(Gi()) }, e } function tn(r, i) { if ("function" != typeof r || null != i && "function" != typeof i) throw new Xn(Os); var o = function () { var t = arguments, e = i ? i.apply(this, t) : t[0], n = o.cache; if (n.has(e)) return n.get(e); t = r.apply(this, t); return o.cache = n.set(e, t) || n, t }; return o.cache = new (tn.Cache || s), o } function en(e) { if ("function" != typeof e) throw new Xn(Os); return function () { var t = arguments; switch (t.length) { case 0: return !e.call(this); case 1: return !e.call(this, t[0]); case 2: return !e.call(this, t[0], t[1]); case 3: return !e.call(this, t[0], t[1], t[2]) }return !e.apply(this, t) } } function nn(t, e) { return t === e || t != t && e != e } function rn(t) { return null != t && cn(t.length) && !an(t) } function on(t) { return hn(t) && rn(t) } function sn(t) { if (!hn(t)) return !1; var e = M(t); return e == Ws || "[object DOMException]" == e || "string" == typeof t.message && "string" == typeof t.name && !pn(t) } function an(t) { if (!ln(t)) return !1; t = M(t); return t == Ls || t == Fs || "[object AsyncFunction]" == t || "[object Proxy]" == t } function un(t) { return "number" == typeof t && t == yn(t) } function cn(t) { return "number" == typeof t && -1 < t && t % 1 == 0 && t <= As } function ln(t) { var e = typeof t; return null != t && ("object" == e || "function" == e) } function hn(t) { return null != t && "object" == typeof t } function fn(t) { return "number" == typeof t || hn(t) && M(t) == Bs } function pn(t) { if (!hn(t) || M(t) != qs) return !1; t = hr(t); if (null === t) return !0; t = tr.call(t, "constructor") && t.constructor; return "function" == typeof t && t instanceof t && Zn.call(t) == ir } function dn(t) { return "string" == typeof t || !io(t) && hn(t) && M(t) == Vs } function gn(t) { return "symbol" == typeof t || hn(t) && M(t) == $s } function mn(t) { if (!t) return []; if (rn(t)) return (dn(t) ? ks : Mt)(t); if (mr && t[mr]) return function (t) { for (var e, n = []; !(e = t.next()).done;)n.push(e.value); return n }(t[mr]()); var e = hi(t); return (e == Hs ? bs : e == Gs ? xs : Tn)(t) } function vn(t) { return t ? (t = wn(t)) !== 1 / 0 && t !== -1 / 0 ? t == t ? t : 0 : 17976931348623157e292 * (t < 0 ? -1 : 1) : 0 === t ? t : 0 } function yn(t) { var e = vn(t), t = e % 1; return e == e ? t ? e - t : e : 0 } function bn(t) { return t ? x(yn(t), 0, js) : 0 } function wn(t) { if ("number" == typeof t) return t; if (gn(t)) return Is; if (ln(t) && (t = ln(e = "function" == typeof t.valueOf ? t.valueOf() : t) ? e + "" : e), "string" != typeof t) return 0 === t ? t : +t; t = t.replace(xa, ""); var e = Na.test(t); return e || Ra.test(t) ? Ya(t.slice(2), e ? 2 : 8) : Pa.test(t) ? Is : +t } function _n(t) { return Wt(t, On(t)) } function xn(t) { return null == t ? "" : yt(t) } function Cn(t, e, n) { e = null == t ? Ss : D(t, e); return e === Ss ? n : e } function kn(t, e) { return null != t && be(t, e, F) } function Sn(t) { return (rn(t) ? r : $)(t) } function On(t) { return rn(t) ? r(t, !0) : X(t) } function En(t, n) { if (null == t) return {}; var e = Qo(fe(t), function (t) { return [t] }); return n = ge(n), nt(t, e, function (t, e) { return n(t, e[0]) }) } function Tn(t) { return null == t ? [] : ps(t, Sn(t)) } function An(t) { return Lo(xn(t).toLowerCase()) } function In(t) { return (t = xn(t)) && t.replace(Wa, iu).replace(Ba, "") } function jn(t, e, n) { return t = xn(t), (e = n ? Ss : e) === Ss ? (n = t, za.test(n) ? t.match(qa) || [] : t.match(Ta) || []) : t.match(e) || [] } function Pn(t) { return function () { return t } } function Nn(t) { return t } function Dn(t) { return V("function" == typeof t ? t : C(t, 1)) } function Rn(r, e, t) { var n = Sn(e), i = N(e, n); null != t || ln(e) && (i.length || !n.length) || (t = e, e = r, r = this, i = N(e, Sn(e))); var o = !(ln(t) && "chain" in t && !t.chain), s = an(r); return Go(i, function (t) { var n = e[t]; r[t] = n, s && (r.prototype[t] = function () { var t = this.__chain__; if (o || t) { var e = r(this.__wrapped__); return (e.__actions__ = Mt(this.__actions__)).push({ func: n, args: arguments, thisArg: r }), e.__chain__ = t, e } return n.apply(r, Jo([this.value()], arguments)) }) }), r } function Mn() { } function Wn(t) { return ke(t) ? us(De(t)) : (e = t, function (t) { return D(t, e) }); var e } function Ln() { return [] } function Fn() { return !1 } var Hn = (e = null == e ? Ka : au.defaults(Ka.Object(), e, au.pick(Ka, Ua))).Array, Bn = e.Date, qn = e.Error, zn = e.Function, Un = e.Math, Gn = e.Object, Vn = e.RegExp, $n = e.String, Xn = e.TypeError, Yn = Hn.prototype, Kn = zn.prototype, Qn = Gn.prototype, Jn = e["__core-js_shared__"], Zn = Kn.toString, tr = Qn.hasOwnProperty, er = 0, nr = (Ho = /[^.]+$/.exec(Jn && Jn.keys && Jn.keys.IE_PROTO || "")) ? "Symbol(src)_1." + Ho : "", rr = Qn.toString, ir = Zn.call(Gn), or = Ka._, sr = Vn("^" + Zn.call(tr).replace(wa, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), ar = Qa ? e.Buffer : Ss, ur = e.Symbol, cr = e.Uint8Array, lr = ar ? ar.allocUnsafe : Ss, hr = ws(Gn.getPrototypeOf, Gn), fr = Gn.create, pr = Qn.propertyIsEnumerable, dr = Yn.splice, gr = ur ? ur.isConcatSpreadable : Ss, mr = ur ? ur.iterator : Ss, vr = ur ? ur.toStringTag : Ss, yr = function () { try { var t = ye(Gn, "defineProperty"); return t({}, "", {}), t } catch (t) { } }(), br = e.clearTimeout !== Ka.clearTimeout && e.clearTimeout, wr = Bn && Bn.now !== Ka.Date.now && Bn.now, _r = e.setTimeout !== Ka.setTimeout && e.setTimeout, xr = Un.ceil, Cr = Un.floor, kr = Gn.getOwnPropertySymbols, Sr = ar ? ar.isBuffer : Ss, Or = e.isFinite, Er = Yn.join, Tr = ws(Gn.keys, Gn), Ar = Un.max, Ir = Un.min, jr = Bn.now, Pr = e.parseInt, Nr = Un.random, Dr = Yn.reverse, Rr = ye(e, "DataView"), Mr = ye(e, "Map"), Wr = ye(e, "Promise"), Lr = ye(e, "Set"), Fr = ye(e, "WeakMap"), Hr = ye(Gn, "create"), Br = Fr && new Fr, qr = {}, zr = Re(Rr), Ur = Re(Mr), Gr = Re(Wr), Vr = Re(Lr), $r = Re(Fr), Xr = ur ? ur.prototype : Ss, Yr = Xr ? Xr.valueOf : Ss, Kr = Xr ? Xr.toString : Ss, Qr = function (t) { if (!ln(t)) return {}; if (fr) return fr(t); Jr.prototype = t; t = new Jr; return Jr.prototype = Ss, t }; function Jr() { } d.templateSettings = { escape: pa, evaluate: da, interpolate: ga, variable: "", imports: { _: d } }, (d.prototype = o.prototype).constructor = d, (g.prototype = Qr(o.prototype)).constructor = g, (m.prototype = Qr(o.prototype)).constructor = m, n.prototype.clear = function () { this.__data__ = Hr ? Hr(null) : {}, this.size = 0 }, n.prototype.delete = function (t) { return t = this.has(t) && delete this.__data__[t], this.size -= t ? 1 : 0, t }, n.prototype.get = function (t) { var e = this.__data__; if (Hr) { var n = e[t]; return n === Es ? Ss : n } return tr.call(e, t) ? e[t] : Ss }, n.prototype.has = function (t) { var e = this.__data__; return Hr ? e[t] !== Ss : tr.call(e, t) }, n.prototype.set = function (t, e) { var n = this.__data__; return this.size += this.has(t) ? 0 : 1, n[t] = Hr && e === Ss ? Es : e, this }, i.prototype.clear = function () { this.__data__ = [], this.size = 0 }, i.prototype.delete = function (t) { var e = this.__data__; return !((t = l(e, t)) < 0) && (t == e.length - 1 ? e.pop() : dr.call(e, t, 1), --this.size, !0) }, i.prototype.get = function (t) { var e = this.__data__; return (t = l(e, t)) < 0 ? Ss : e[t][1] }, i.prototype.has = function (t) { return -1 < l(this.__data__, t) }, i.prototype.set = function (t, e) { var n = this.__data__, r = l(n, t); return r < 0 ? (++this.size, n.push([t, e])) : n[r][1] = e, this }, s.prototype.clear = function () { this.size = 0, this.__data__ = { hash: new n, map: new (Mr || i), string: new n } }, s.prototype.delete = function (t) { return t = me(this, t).delete(t), this.size -= t ? 1 : 0, t }, s.prototype.get = function (t) { return me(this, t).get(t) }, s.prototype.has = function (t) { return me(this, t).has(t) }, s.prototype.set = function (t, e) { var n = me(this, t), r = n.size; return n.set(t, e), this.size += n.size == r ? 0 : 1, this }, v.prototype.add = v.prototype.push = function (t) { return this.__data__.set(t, Es), this }, v.prototype.has = function (t) { return this.__data__.has(t) }, y.prototype.clear = function () { this.__data__ = new i, this.size = 0 }, y.prototype.delete = function (t) { var e = this.__data__, t = e.delete(t); return this.size = e.size, t }, y.prototype.get = function (t) { return this.__data__.get(t) }, y.prototype.has = function (t) { return this.__data__.has(t) }, y.prototype.set = function (t, e) { var n = this.__data__; if (n instanceof i) { var r = n.__data__; if (!Mr || r.length < 199) return r.push([t, e]), this.size = ++n.size, this; n = this.__data__ = new s(r) } return n.set(t, e), this.size = n.size, this }; var Zr = Ht(j), ti = Ht(P, !0), ei = Bt(), ni = Bt(!0), ri = Br ? function (t, e) { return Br.set(t, e), t } : Nn, ii = yr ? function (t, e) { return yr(t, "toString", { configurable: !0, enumerable: !1, value: Pn(e), writable: !0 }) } : Nn, oi = at, si = br || function (t) { return Ka.clearTimeout(t) }, ai = Lr && 1 / xs(new Lr([, -0]))[1] == 1 / 0 ? function (t) { return new Lr(t) } : Mn, ui = Br ? function (t) { return Br.get(t) } : Mn, ci = kr ? function (e) { return null == e ? [] : (e = Gn(e), Xo(kr(e), function (t) { return pr.call(e, t) })) } : Ln, li = kr ? function (t) { for (var e = []; t;)Jo(e, ci(t)), t = hr(t); return e } : Ln, hi = M; (Rr && hi(new Rr(new ArrayBuffer(1))) != Ks || Mr && hi(new Mr) != Hs || Wr && hi(Wr.resolve()) != zs || Lr && hi(new Lr) != Gs || Fr && hi(new Fr) != Xs) && (hi = function (t) { var e = M(t), t = e == qs ? t.constructor : Ss, t = t ? Re(t) : ""; if (t) switch (t) { case zr: return Ks; case Ur: return Hs; case Gr: return zs; case Vr: return Gs; case $r: return Xs }return e }); var fi, pi, di = Jn ? an : Fn, gi = Pe(ri), mi = _r || function (t, e) { return Ka.setTimeout(t, e) }, vi = Pe(ii), yi = (pi = (fi = tn(fi = function (t) { var i = []; return ya.test(t) && i.push(""), t.replace(ba, function (t, e, n, r) { i.push(n ? r.replace(Aa, "$1") : e || t) }), i }, function (t) { return 500 === pi.size && pi.clear(), t })).cache, fi), bi = at(function (t, e) { return on(t) ? O(t, I(e, 1, on, !0)) : [] }), wi = at(function (t, e) { var n = Be(e); return on(n) && (n = Ss), on(t) ? O(t, I(e, 1, on, !0), ge(n, 2)) : [] }), _i = at(function (t, e) { var n = Be(e); return on(n) && (n = Ss), on(t) ? O(t, I(e, 1, on, !0), Ss, n) : [] }), xi = at(function (t) { var e = Qo(t, Ot); return e.length && e[0] === t[0] ? H(e) : [] }), Ci = at(function (t) { var e = Be(t), n = Qo(t, Ot); return e === Be(n) ? e = Ss : n.pop(), n.length && n[0] === t[0] ? H(n, ge(e, 2)) : [] }), ki = at(function (t) { var e = Be(t), n = Qo(t, Ot); return (e = "function" == typeof e ? e : Ss) && n.pop(), n.length && n[0] === t[0] ? H(n, Ss, e) : [] }), Si = at(qe), Oi = le(function (t, e) { var n = null == t ? 0 : t.length, r = _(t, e); return it(t, Qo(e, function (t) { return xe(t, n) ? +t : t }).sort(Nt)), r }), Ei = at(function (t) { return bt(I(t, 1, on, !0)) }), Ti = at(function (t) { var e = Be(t); return on(e) && (e = Ss), bt(I(t, 1, on, !0), ge(e, 2)) }), Ai = at(function (t) { var e = "function" == typeof (e = Be(t)) ? e : Ss; return bt(I(t, 1, on, !0), Ss, e) }), Ii = at(function (t, e) { return on(t) ? O(t, e) : [] }), ji = at(function (t) { return kt(Xo(t, on)) }), Pi = at(function (t) { var e = Be(t); return on(e) && (e = Ss), kt(Xo(t, on), ge(e, 2)) }), Ni = at(function (t) { var e = "function" == typeof (e = Be(t)) ? e : Ss; return kt(Xo(t, on), Ss, e) }), Di = at(Ue), Ri = at(function (t) { var e = t.length, e = "function" == typeof (e = 1 < e ? t[e - 1] : Ss) ? (t.pop(), e) : Ss; return Ge(t, e) }), Mi = le(function (e) { function t(t) { return _(t, e) } var n = e.length, r = n ? e[0] : 0, i = this.__wrapped__; return !(1 < n || this.__actions__.length) && i instanceof m && xe(r) ? ((i = i.slice(r, +r + (n ? 1 : 0))).__actions__.push({ func: $e, args: [t], thisArg: Ss }), new g(i, this.__chain__).thru(function (t) { return n && !t.length && t.push(Ss), t })) : this.thru(t) }), Wi = Lt(function (t, e, n) { tr.call(t, n) ? ++t[n] : f(t, n, 1) }), Li = Vt(We), Fi = Vt(Le), Hi = Lt(function (t, e, n) { tr.call(t, n) ? t[n].push(e) : f(t, n, [e]) }), Bi = at(function (t, e, n) { var r = -1, i = "function" == typeof e, o = rn(t) ? Hn(t.length) : []; return Zr(t, function (t) { o[++r] = i ? zo(e, t, n) : B(t, e, n) }), o }), qi = Lt(function (t, e, n) { f(t, n, e) }), zi = Lt(function (t, e, n) { t[n ? 0 : 1].push(e) }, function () { return [[], []] }), Ui = at(function (t, e) { if (null == t) return []; var n = e.length; return 1 < n && Ce(t, e[0], e[1]) ? e = [] : 2 < n && Ce(e[0], e[1], e[2]) && (e = [e[0]]), et(t, I(e, 1), []) }), Gi = wr || function () { return Ka.Date.now() }, Vi = at(function (t, e, n) { var r, i = 1; return n.length && (r = _s(n, de(Vi)), i |= 32), oe(t, i, e, n, r) }), $i = at(function (t, e, n) { var r, i = 3; return n.length && (r = _s(n, de($i)), i |= 32), oe(e, i, t, n, r) }), Xi = at(function (t, e) { return S(t, 1, e) }), Yi = at(function (t, e, n) { return S(t, wn(e) || 0, n) }); tn.Cache = s; var Ki, Qi = oi(function (r, i) { var o = (i = 1 == i.length && io(i[0]) ? Qo(i[0], fs(ge())) : Qo(I(i, 1), fs(ge()))).length; return at(function (t) { for (var e = -1, n = Ir(t.length, o); ++e < n;)t[e] = i[e].call(this, t[e]); return zo(r, this, t) }) }), Ji = at(function (t, e) { var n = _s(e, de(Ji)); return oe(t, 32, Ss, e, n) }), Zi = at(function (t, e) { var n = _s(e, de(Zi)); return oe(t, 64, Ss, e, n) }), to = le(function (t, e) { return oe(t, 256, Ss, Ss, Ss, e) }), eo = ee(W), no = ee(function (t, e) { return e <= t }), ro = q(function () { return arguments }()) ? q : function (t) { return hn(t) && tr.call(t, "callee") && !pr.call(t, "callee") }, io = Hn.isArray, oo = Ja ? fs(Ja) : function (t) { return hn(t) && M(t) == Ys }, so = Sr || Fn, ao = Za ? fs(Za) : function (t) { return hn(t) && M(t) == Ms }, uo = tu ? fs(tu) : function (t) { return hn(t) && hi(t) == Hs }, co = eu ? fs(eu) : function (t) { return hn(t) && M(t) == Us }, lo = nu ? fs(nu) : function (t) { return hn(t) && hi(t) == Gs }, ho = ru ? fs(ru) : function (t) { return hn(t) && cn(t.length) && !!Va[M(t)] }, fo = ee(Y), po = ee(function (t, e) { return t <= e }), go = Ft(function (t, e) { if (Oe(e) || rn(e)) Wt(e, Sn(e), t); else for (var n in e) tr.call(e, n) && b(t, n, e[n]) }), mo = Ft(function (t, e) { Wt(e, On(e), t) }), vo = Ft(function (t, e, n, r) { Wt(e, On(e), t, r) }), yo = Ft(function (t, e, n, r) { Wt(e, Sn(e), t, r) }), bo = le(_), wo = at(function (t) { return t.push(Ss, se), zo(vo, Ss, t) }), _o = at(function (t) { return t.push(Ss, ae), zo(Oo, Ss, t) }), xo = Yt(function (t, e, n) { t[e] = n }, Pn(Nn)), Co = Yt(function (t, e, n) { tr.call(t, e) ? t[e].push(n) : t[e] = [n] }, ge), ko = at(B), So = Ft(function (t, e, n) { Z(t, e, n) }), Oo = Ft(function (t, e, n, r) { Z(t, e, n, r) }), Eo = le(function (e, t) { var n = {}; if (null == e) return n; var r = !1; t = Qo(t, function (t) { return t = Tt(t, e), r = r || 1 < t.length, t }), Wt(e, fe(e), n), r && (n = C(n, 7, ue)); for (var i = t.length; i--;)wt(n, t[i]); return n }), To = le(function (t, e) { return null == t ? {} : nt(n = t, e, function (t, e) { return kn(n, e) }); var n }), Ao = ie(Sn), Io = ie(On), jo = zt(function (t, e, n) { return e = e.toLowerCase(), t + (n ? An(e) : e) }), Po = zt(function (t, e, n) { return t + (n ? "-" : "") + e.toLowerCase() }), No = zt(function (t, e, n) { return t + (n ? " " : "") + e.toLowerCase() }), Do = qt("toLowerCase"), Ro = zt(function (t, e, n) { return t + (n ? "_" : "") + e.toLowerCase() }), Mo = zt(function (t, e, n) { return t + (n ? " " : "") + Lo(e) }), Wo = zt(function (t, e, n) { return t + (n ? " " : "") + e.toUpperCase() }), Lo = qt("toUpperCase"), Fo = at(function (t, e) { try { return zo(t, Ss, e) } catch (t) { return sn(t) ? t : new qn(t) } }), Kn = le(function (e, t) { return Go(t, function (t) { t = De(t), f(e, t, Vi(e[t], e)) }), e }), Ho = $t(), ar = $t(!0), Bn = at(function (e, n) { return function (t) { return B(t, e, n) } }), e = at(function (e, n) { return function (t) { return B(e, t, n) } }), ur = Qt(Qo), Xr = Qt($o), br = Qt(es), Rr = te(), Wr = te(!0), Fr = Kt(function (t, e) { return t + e }, 0), Jn = re("ceil"), _r = Kt(function (t, e) { return t / e }, 1), ii = re("floor"), wr = Kt(function (t, e) { return t * e }, 1), oi = re("round"), Sr = Kt(function (t, e) { return t - e }, 0); return d.after = function (t, e) { if ("function" != typeof e) throw new Xn(Os); return t = yn(t), function () { if (--t < 1) return e.apply(this, arguments) } }, d.ary = Qe, d.assign = go, d.assignIn = mo, d.assignInWith = vo, d.assignWith = yo, d.at = bo, d.before = Je, d.bind = Vi, d.bindAll = Kn, d.bindKey = $i, d.castArray = function () { if (!arguments.length) return []; var t = arguments[0]; return io(t) ? t : [t] }, d.chain = Ve, d.chunk = function (t, e, n) { e = (n ? Ce(t, e, n) : e === Ss) ? 1 : Ar(yn(e), 0); var r = null == t ? 0 : t.length; if (!r || e < 1) return []; for (var i = 0, o = 0, s = Hn(xr(r / e)); i < r;)s[o++] = ft(t, i, i += e); return s }, d.compact = function (t) { for (var e = -1, n = null == t ? 0 : t.length, r = 0, i = []; ++e < n;) { var o = t[e]; o && (i[r++] = o) } return i }, d.concat = function () { var t = arguments.length; if (!t) return []; for (var e = Hn(t - 1), n = arguments[0], r = t; r--;)e[r - 1] = arguments[r]; return Jo(io(n) ? Mt(n) : [n], I(e, 1)) }, d.cond = function (r) { var i = null == r ? 0 : r.length, e = ge(); return r = i ? Qo(r, function (t) { if ("function" != typeof t[1]) throw new Xn(Os); return [e(t[0]), t[1]] }) : [], at(function (t) { for (var e = -1; ++e < i;) { var n = r[e]; if (zo(n[0], this, t)) return zo(n[1], this, t) } }) }, d.conforms = function (t) { return e = C(t, 1), n = Sn(e), function (t) { return k(t, e, n) }; var e, n }, d.constant = Pn, d.countBy = Wi, d.create = function (t, e) { return t = Qr(t), null == e ? t : w(t, e) }, d.curry = function t(e, n, r) { n = oe(e, 8, Ss, Ss, Ss, Ss, Ss, n = r ? Ss : n); return n.placeholder = t.placeholder, n }, d.curryRight = function t(e, n, r) { n = oe(e, 16, Ss, Ss, Ss, Ss, Ss, n = r ? Ss : n); return n.placeholder = t.placeholder, n }, d.debounce = Ze, d.defaults = wo, d.defaultsDeep = _o, d.defer = Xi, d.delay = Yi, d.difference = bi, d.differenceBy = wi, d.differenceWith = _i, d.drop = function (t, e, n) { var r = null == t ? 0 : t.length; return r ? ft(t, (e = n || e === Ss ? 1 : yn(e)) < 0 ? 0 : e, r) : [] }, d.dropRight = function (t, e, n) { var r = null == t ? 0 : t.length; return r ? ft(t, 0, (e = r - (e = n || e === Ss ? 1 : yn(e))) < 0 ? 0 : e) : [] }, d.dropRightWhile = function (t, e) { return t && t.length ? xt(t, ge(e, 3), !0, !0) : [] }, d.dropWhile = function (t, e) { return t && t.length ? xt(t, ge(e, 3), !0) : [] }, d.fill = function (t, e, n, r) { var i = null == t ? 0 : t.length; return i ? (n && "number" != typeof n && Ce(t, e, n) && (n = 0, r = i), function (t, e, n, r) { var i = t.length; for ((n = yn(n)) < 0 && (n = i < -n ? 0 : i + n), (r = r === Ss || i < r ? i : yn(r)) < 0 && (r += i), r = r < n ? 0 : bn(r); n < r;)t[n++] = e; return t }(t, e, n, r)) : [] }, d.filter = function (t, e) { return (io(t) ? Xo : A)(t, ge(e, 3)) }, d.flatMap = function (t, e) { return I(Ke(t, e), 1) }, d.flatMapDeep = function (t, e) { return I(Ke(t, e), 1 / 0) }, d.flatMapDepth = function (t, e, n) { return n = n === Ss ? 1 : yn(n), I(Ke(t, e), n) }, d.flatten = Fe, d.flattenDeep = function (t) { return (null == t ? 0 : t.length) ? I(t, 1 / 0) : [] }, d.flattenDepth = function (t, e) { return (null == t ? 0 : t.length) ? I(t, e = e === Ss ? 1 : yn(e)) : [] }, d.flip = function (t) { return oe(t, 512) }, d.flow = Ho, d.flowRight = ar, d.fromPairs = function (t) { for (var e = -1, n = null == t ? 0 : t.length, r = {}; ++e < n;) { var i = t[e]; r[i[0]] = i[1] } return r }, d.functions = function (t) { return null == t ? [] : N(t, Sn(t)) }, d.functionsIn = function (t) { return null == t ? [] : N(t, On(t)) }, d.groupBy = Hi, d.initial = function (t) { return (null == t ? 0 : t.length) ? ft(t, 0, -1) : [] }, d.intersection = xi, d.intersectionBy = Ci, d.intersectionWith = ki, d.invert = xo, d.invertBy = Co, d.invokeMap = Bi, d.iteratee = Dn, d.keyBy = qi, d.keys = Sn, d.keysIn = On, d.map = Ke, d.mapKeys = function (t, r) { var i = {}; return r = ge(r, 3), j(t, function (t, e, n) { f(i, r(t, e, n), t) }), i }, d.mapValues = function (t, r) { var i = {}; return r = ge(r, 3), j(t, function (t, e, n) { f(i, e, r(t, e, n)) }), i }, d.matches = function (t) { return Q(C(t, 1)) }, d.matchesProperty = function (t, e) { return J(t, C(e, 1)) }, d.memoize = tn, d.merge = So, d.mergeWith = Oo, d.method = Bn, d.methodOf = e, d.mixin = Rn, d.negate = en, d.nthArg = function (e) { return e = yn(e), at(function (t) { return tt(t, e) }) }, d.omit = Eo, d.omitBy = function (t, e) { return En(t, en(ge(e))) }, d.once = function (t) { return Je(2, t) }, d.orderBy = function (t, e, n, r) { return null == t ? [] : (io(e) || (e = null == e ? [] : [e]), io(n = r ? Ss : n) || (n = null == n ? [] : [n]), et(t, e, n)) }, d.over = ur, d.overArgs = Qi, d.overEvery = Xr, d.overSome = br, d.partial = Ji, d.partialRight = Zi, d.partition = zi, d.pick = To, d.pickBy = En, d.property = Wn, d.propertyOf = function (e) { return function (t) { return null == e ? Ss : D(e, t) } }, d.pull = Si, d.pullAll = qe, d.pullAllBy = function (t, e, n) { return t && t.length && e && e.length ? rt(t, e, ge(n, 2)) : t }, d.pullAllWith = function (t, e, n) { return t && t.length && e && e.length ? rt(t, e, Ss, n) : t }, d.pullAt = Oi, d.range = Rr, d.rangeRight = Wr, d.rearg = to, d.reject = function (t, e) { return (io(t) ? Xo : A)(t, en(ge(e, 3))) }, d.remove = function (t, e) { var n = []; if (!t || !t.length) return n; var r = -1, i = [], o = t.length; for (e = ge(e, 3); ++r < o;) { var s = t[r]; e(s, r, t) && (n.push(s), i.push(r)) } return it(t, i), n }, d.rest = function (t, e) { if ("function" != typeof t) throw new Xn(Os); return at(t, e = e === Ss ? e : yn(e)) }, d.reverse = ze, d.sampleSize = function (t, e, n) { return e = (n ? Ce(t, e, n) : e === Ss) ? 1 : yn(e), (io(t) ? u : ct)(t, e) }, d.set = function (t, e, n) { return null == t ? t : lt(t, e, n) }, d.setWith = function (t, e, n, r) { return r = "function" == typeof r ? r : Ss, null == t ? t : lt(t, e, n, r) }, d.shuffle = function (t) { return (io(t) ? c : ht)(t) }, d.slice = function (t, e, n) { var r = null == t ? 0 : t.length; return r ? (n = n && "number" != typeof n && Ce(t, e, n) ? (e = 0, r) : (e = null == e ? 0 : yn(e), n === Ss ? r : yn(n)), ft(t, e, n)) : [] }, d.sortBy = Ui, d.sortedUniq = function (t) { return t && t.length ? mt(t) : [] }, d.sortedUniqBy = function (t, e) { return t && t.length ? mt(t, ge(e, 2)) : [] }, d.split = function (t, e, n) { return n && "number" != typeof n && Ce(t, e, n) && (e = n = Ss), (n = n === Ss ? js : n >>> 0) ? (t = xn(t)) && ("string" == typeof e || null != e && !co(e)) && (!(e = yt(e)) && ys(t)) ? At(ks(t), 0, n) : t.split(e, n) : [] }, d.spread = function (n, r) { if ("function" != typeof n) throw new Xn(Os); return r = null == r ? 0 : Ar(yn(r), 0), at(function (t) { var e = t[r], t = At(t, 0, r); return e && Jo(t, e), zo(n, this, t) }) }, d.tail = function (t) { var e = null == t ? 0 : t.length; return e ? ft(t, 1, e) : [] }, d.take = function (t, e, n) { return t && t.length ? ft(t, 0, (e = n || e === Ss ? 1 : yn(e)) < 0 ? 0 : e) : [] }, d.takeRight = function (t, e, n) { var r = null == t ? 0 : t.length; return r ? ft(t, (e = r - (e = n || e === Ss ? 1 : yn(e))) < 0 ? 0 : e, r) : [] }, d.takeRightWhile = function (t, e) { return t && t.length ? xt(t, ge(e, 3), !1, !0) : [] }, d.takeWhile = function (t, e) { return t && t.length ? xt(t, ge(e, 3)) : [] }, d.tap = function (t, e) { return e(t), t }, d.throttle = function (t, e, n) { var r = !0, i = !0; if ("function" != typeof t) throw new Xn(Os); return ln(n) && (r = "leading" in n ? !!n.leading : r, i = "trailing" in n ? !!n.trailing : i), Ze(t, e, { leading: r, maxWait: e, trailing: i }) }, d.thru = $e, d.toArray = mn, d.toPairs = Ao, d.toPairsIn = Io, d.toPath = function (t) { return io(t) ? Qo(t, De) : gn(t) ? [t] : Mt(yi(xn(t))) }, d.toPlainObject = _n, d.transform = function (t, r, i) { var e, n = io(t), o = n || so(t) || ho(t); return r = ge(r, 4), null == i && (e = t && t.constructor, i = o ? n ? new e : [] : ln(t) && an(e) ? Qr(hr(t)) : {}), (o ? Go : j)(t, function (t, e, n) { return r(i, t, e, n) }), i }, d.unary = function (t) { return Qe(t, 1) }, d.union = Ei, d.unionBy = Ti, d.unionWith = Ai, d.uniq = function (t) { return t && t.length ? bt(t) : [] }, d.uniqBy = function (t, e) { return t && t.length ? bt(t, ge(e, 2)) : [] }, d.uniqWith = function (t, e) { return e = "function" == typeof e ? e : Ss, t && t.length ? bt(t, Ss, e) : [] }, d.unset = function (t, e) { return null == t || wt(t, e) }, d.unzip = Ue, d.unzipWith = Ge, d.update = function (t, e, n) { return null == t ? t : _t(t, e, Et(n)) }, d.updateWith = function (t, e, n, r) { return r = "function" == typeof r ? r : Ss, null == t ? t : _t(t, e, Et(n), r) }, d.values = Tn, d.valuesIn = function (t) { return null == t ? [] : ps(t, On(t)) }, d.without = Ii, d.words = jn, d.wrap = function (t, e) { return Ji(Et(e), t) }, d.xor = ji, d.xorBy = Pi, d.xorWith = Ni, d.zip = Di, d.zipObject = function (t, e) { return St(t || [], e || [], b) }, d.zipObjectDeep = function (t, e) { return St(t || [], e || [], lt) }, d.zipWith = Ri, d.entries = Ao, d.entriesIn = Io, d.extend = mo, d.extendWith = vo, Rn(d, d), d.add = Fr, d.attempt = Fo, d.camelCase = jo, d.capitalize = An, d.ceil = Jn, d.clamp = function (t, e, n) { return n === Ss && (n = e, e = Ss), n !== Ss && (n = (n = wn(n)) == n ? n : 0), e !== Ss && (e = (e = wn(e)) == e ? e : 0), x(wn(t), e, n) }, d.clone = function (t) { return C(t, 4) }, d.cloneDeep = function (t) { return C(t, 5) }, d.cloneDeepWith = function (t, e) { return C(t, 5, e = "function" == typeof e ? e : Ss) }, d.cloneWith = function (t, e) { return C(t, 4, e = "function" == typeof e ? e : Ss) }, d.conformsTo = function (t, e) { return null == e || k(t, e, Sn(e)) }, d.deburr = In, d.defaultTo = function (t, e) { return null == t || t != t ? e : t }, d.divide = _r, d.endsWith = function (t, e, n) { t = xn(t), e = yt(e); var r = t.length, r = n = n === Ss ? r : x(yn(n), 0, r); return 0 <= (n -= e.length) && t.slice(n, r) == e }, d.eq = nn, d.escape = function (t) { return (t = xn(t)) && fa.test(t) ? t.replace(la, ou) : t }, d.escapeRegExp = function (t) { return (t = xn(t)) && _a.test(t) ? t.replace(wa, "\\$&") : t }, d.every = function (t, e, n) { var r = io(t) ? $o : E; return n && Ce(t, e, n) && (e = Ss), r(t, ge(e, 3)) }, d.find = Li, d.findIndex = We, d.findKey = function (t, e) { return ns(t, ge(e, 3), j) }, d.findLast = Fi, d.findLastIndex = Le, d.findLastKey = function (t, e) { return ns(t, ge(e, 3), P) }, d.floor = ii, d.forEach = Xe, d.forEachRight = Ye, d.forIn = function (t, e) { return null == t ? t : ei(t, ge(e, 3), On) }, d.forInRight = function (t, e) { return null == t ? t : ni(t, ge(e, 3), On) }, d.forOwn = function (t, e) { return t && j(t, ge(e, 3)) }, d.forOwnRight = function (t, e) { return t && P(t, ge(e, 3)) }, d.get = Cn, d.gt = eo, d.gte = no, d.has = function (t, e) { return null != t && be(t, e, L) }, d.hasIn = kn, d.head = He, d.identity = Nn, d.includes = function (t, e, n, r) { return t = rn(t) ? t : Tn(t), n = n && !r ? yn(n) : 0, r = t.length, n < 0 && (n = Ar(r + n, 0)), dn(t) ? n <= r && -1 < t.indexOf(e, n) : !!r && -1 < is(t, e, n) }, d.indexOf = function (t, e, n) { var r = null == t ? 0 : t.length; return r ? ((n = null == n ? 0 : yn(n)) < 0 && (n = Ar(r + n, 0)), is(t, e, n)) : -1 }, d.inRange = function (t, e, n) { return e = vn(e), n === Ss ? (n = e, e = 0) : n = vn(n), (t = t = wn(t)) >= Ir(e = e, n = n) && t < Ar(e, n) }, d.invoke = ko, d.isArguments = ro, d.isArray = io, d.isArrayBuffer = oo, d.isArrayLike = rn, d.isArrayLikeObject = on, d.isBoolean = function (t) { return !0 === t || !1 === t || hn(t) && M(t) == Rs }, d.isBuffer = so, d.isDate = ao, d.isElement = function (t) { return hn(t) && 1 === t.nodeType && !pn(t) }, d.isEmpty = function (t) { if (null == t) return !0; if (rn(t) && (io(t) || "string" == typeof t || "function" == typeof t.splice || so(t) || ho(t) || ro(t))) return !t.length; var e, n = hi(t); if (n == Hs || n == Gs) return !t.size; if (Oe(t)) return !$(t).length; for (e in t) if (tr.call(t, e)) return !1; return !0 }, d.isEqual = function (t, e) { return z(t, e) }, d.isEqualWith = function (t, e, n) { var r = (n = "function" == typeof n ? n : Ss) ? n(t, e) : Ss; return r === Ss ? z(t, e, Ss, n) : !!r }, d.isError = sn, d.isFinite = function (t) { return "number" == typeof t && Or(t) }, d.isFunction = an, d.isInteger = un, d.isLength = cn, d.isMap = uo, d.isMatch = function (t, e) { return t === e || U(t, e, ve(e)) }, d.isMatchWith = function (t, e, n) { return n = "function" == typeof n ? n : Ss, U(t, e, ve(e), n) }, d.isNaN = function (t) { return fn(t) && t != +t }, d.isNative = function (t) { if (di(t)) throw new qn("Unsupported core-js use. Try https://npms.io/search?q=ponyfill."); return G(t) }, d.isNil = function (t) { return null == t }, d.isNull = function (t) { return null === t }, d.isNumber = fn, d.isObject = ln, d.isObjectLike = hn, d.isPlainObject = pn, d.isRegExp = co, d.isSafeInteger = function (t) { return un(t) && -As <= t && t <= As }, d.isSet = lo, d.isString = dn, d.isSymbol = gn, d.isTypedArray = ho, d.isUndefined = function (t) { return t === Ss }, d.isWeakMap = function (t) { return hn(t) && hi(t) == Xs }, d.isWeakSet = function (t) { return hn(t) && "[object WeakSet]" == M(t) }, d.join = function (t, e) { return null == t ? "" : Er.call(t, e) }, d.kebabCase = Po, d.last = Be, d.lastIndexOf = function (t, e, n) { var r = null == t ? 0 : t.length; if (!r) return -1; var i = r; return n !== Ss && (i = (i = yn(n)) < 0 ? Ar(r + i, 0) : Ir(i, r - 1)), e == e ? function (t, e, n) { for (var r = n + 1; r--;)if (t[r] === e) return r; return r }(t, e, i) : rs(t, ss, i, !0) }, d.lowerCase = No, d.lowerFirst = Do, d.lt = fo, d.lte = po, d.max = function (t) { return t && t.length ? T(t, Nn, W) : Ss }, d.maxBy = function (t, e) { return t && t.length ? T(t, ge(e, 2), W) : Ss }, d.mean = function (t) { return as(t, Nn) }, d.meanBy = function (t, e) { return as(t, ge(e, 2)) }, d.min = function (t) { return t && t.length ? T(t, Nn, Y) : Ss }, d.minBy = function (t, e) { return t && t.length ? T(t, ge(e, 2), Y) : Ss }, d.stubArray = Ln, d.stubFalse = Fn, d.stubObject = function () { return {} }, d.stubString = function () { return "" }, d.stubTrue = function () { return !0 }, d.multiply = wr, d.nth = function (t, e) { return t && t.length ? tt(t, yn(e)) : Ss }, d.noConflict = function () { return Ka._ === this && (Ka._ = or), this }, d.noop = Mn, d.now = Gi, d.pad = function (t, e, n) { t = xn(t); var r = (e = yn(e)) ? Cs(t) : 0; return !e || e <= r ? t : Jt(Cr(r = (e - r) / 2), n) + t + Jt(xr(r), n) }, d.padEnd = function (t, e, n) { t = xn(t); var r = (e = yn(e)) ? Cs(t) : 0; return e && r < e ? t + Jt(e - r, n) : t }, d.padStart = function (t, e, n) { t = xn(t); var r = (e = yn(e)) ? Cs(t) : 0; return e && r < e ? Jt(e - r, n) + t : t }, d.parseInt = function (t, e, n) { return e = n || null == e ? 0 : e && +e, Pr(xn(t).replace(Ca, ""), e || 0) }, d.random = function (t, e, n) { var r; if (n && "boolean" != typeof n && Ce(t, e, n) && (e = n = Ss), n === Ss && ("boolean" == typeof e ? (n = e, e = Ss) : "boolean" == typeof t && (n = t, t = Ss)), t === Ss && e === Ss ? (t = 0, e = 1) : (t = vn(t), e === Ss ? (e = t, t = 0) : e = vn(e)), e < t && (r = t, t = e, e = r), n || t % 1 || e % 1) { n = Nr(); return Ir(t + n * (e - t + Xa("1e-" + ((n + "").length - 1))), e) } return ot(t, e) }, d.reduce = function (t, e, n) { var r = io(t) ? Zo : cs, i = arguments.length < 3; return r(t, ge(e, 4), n, i, Zr) }, d.reduceRight = function (t, e, n) { var r = io(t) ? ts : cs, i = arguments.length < 3; return r(t, ge(e, 4), n, i, ti) }, d.repeat = function (t, e, n) { return e = (n ? Ce(t, e, n) : e === Ss) ? 1 : yn(e), st(xn(t), e) }, d.replace = function () { var t = arguments, e = xn(t[0]); return t.length < 3 ? e : e.replace(t[1], t[2]) }, d.result = function (t, e, n) { var r = -1, i = (e = Tt(e, t)).length; for (i || (i = 1, t = Ss); ++r < i;) { var o = null == t ? Ss : t[De(e[r])]; o === Ss && (r = i, o = n), t = an(o) ? o.call(t) : o } return t }, d.round = oi, d.runInContext = t, d.sample = function (t) { return (io(t) ? a : ut)(t) }, d.size = function (t) { if (null == t) return 0; if (rn(t)) return dn(t) ? Cs(t) : t.length; var e = hi(t); return e == Hs || e == Gs ? t.size : $(t).length }, d.snakeCase = Ro, d.some = function (t, e, n) { var r = io(t) ? es : pt; return n && Ce(t, e, n) && (e = Ss), r(t, ge(e, 3)) }, d.sortedIndex = function (t, e) { return dt(t, e) }, d.sortedIndexBy = function (t, e, n) { return gt(t, e, ge(n, 2)) }, d.sortedIndexOf = function (t, e) { var n = null == t ? 0 : t.length; if (n) { var r = dt(t, e); if (r < n && nn(t[r], e)) return r } return -1 }, d.sortedLastIndex = function (t, e) { return dt(t, e, !0) }, d.sortedLastIndexBy = function (t, e, n) { return gt(t, e, ge(n, 2), !0) }, d.sortedLastIndexOf = function (t, e) { if (null == t ? 0 : t.length) { var n = dt(t, e, !0) - 1; if (nn(t[n], e)) return n } return -1 }, d.startCase = Mo, d.startsWith = function (t, e, n) { return t = xn(t), n = null == n ? 0 : x(yn(n), 0, t.length), e = yt(e), t.slice(n, n + e.length) == e }, d.subtract = Sr, d.sum = function (t) { return t && t.length ? ls(t, Nn) : 0 }, d.sumBy = function (t, e) { return t && t.length ? ls(t, ge(e, 2)) : 0 }, d.template = function (s, t, e) { var n = d.templateSettings; e && Ce(s, t, e) && (t = Ss), s = xn(s), t = vo({}, t, n, se); var a, u, r = Sn(n = vo({}, t.imports, n.imports, se)), i = ps(n, r), c = 0, n = t.interpolate || La, l = "__p += '", n = Vn((t.escape || La).source + "|" + n.source + "|" + (n === ga ? Ia : La).source + "|" + (t.evaluate || La).source + "|$", "g"), o = "//# sourceURL=" + ("sourceURL" in t ? t.sourceURL : "lodash.templateSources[" + ++Ga + "]") + "\n"; if (s.replace(n, function (t, e, n, r, i, o) { return n = n || r, l += s.slice(c, o).replace(Fa, vs), e && (a = !0, l += "' +\n__e(" + e + ") +\n'"), i && (u = !0, l += "';\n" + i + ";\n__p += '"), n && (l += "' +\n((__t = (" + n + ")) == null ? '' : __t) +\n'"), c = o + t.length, t }), l += "';\n", (t = t.variable) || (l = "with (obj) {\n" + l + "\n}\n"), l = (u ? l.replace(sa, "") : l).replace(aa, "$1").replace(ua, "$1;"), l = "function(" + (t || "obj") + ") {\n" + (t ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (a ? ", __e = _.escape" : "") + (u ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + l + "return __p\n}", (t = Fo(function () { return zn(r, o + "return " + l).apply(Ss, i) })).source = l, sn(t)) throw t; return t }, d.times = function (t, e) { if ((t = yn(t)) < 1 || As < t) return []; var n = js, r = Ir(t, js); for (e = ge(e), t -= js, r = hs(r, e); ++n < t;)e(n); return r }, d.toFinite = vn, d.toInteger = yn, d.toLength = bn, d.toLower = function (t) { return xn(t).toLowerCase() }, d.toNumber = wn, d.toSafeInteger = function (t) { return t ? x(yn(t), -As, As) : 0 === t ? t : 0 }, d.toString = xn, d.toUpper = function (t) { return xn(t).toUpperCase() }, d.trim = function (t, e, n) { return (t = xn(t)) && (n || e === Ss) ? t.replace(xa, "") : t && (e = yt(e)) ? (t = ks(t), e = ks(e), At(t, gs(t, e), ms(t, e) + 1).join("")) : t }, d.trimEnd = function (t, e, n) { return (t = xn(t)) && (n || e === Ss) ? t.replace(ka, "") : t && (e = yt(e)) ? At(t = ks(t), 0, ms(t, ks(e)) + 1).join("") : t }, d.trimStart = function (t, e, n) { return (t = xn(t)) && (n || e === Ss) ? t.replace(Ca, "") : t && (e = yt(e)) ? At(t = ks(t), gs(t, ks(e))).join("") : t }, d.truncate = function (t, e) { var n, r = 30, i = "..."; ln(e) && (n = "separator" in e ? e.separator : n, r = "length" in e ? yn(e.length) : r, i = "omission" in e ? yt(e.omission) : i); var o, e = (t = xn(t)).length; if (ys(t) && (e = (o = ks(t)).length), e <= r) return t; if ((e = r - Cs(i)) < 1) return i; if (r = o ? At(o, 0, e).join("") : t.slice(0, e), n === Ss) return r + i; if (o && (e += r.length - e), co(n)) { if (t.slice(e).search(n)) { var s, a = r; for (n.global || (n = Vn(n.source, xn(ja.exec(n)) + "g")), n.lastIndex = 0; s = n.exec(a);)var u = s.index; r = r.slice(0, u === Ss ? e : u) } } else t.indexOf(yt(n), e) == e || -1 < (e = r.lastIndexOf(n)) && (r = r.slice(0, e)); return r + i }, d.unescape = function (t) { return (t = xn(t)) && ha.test(t) ? t.replace(ca, su) : t }, d.uniqueId = function (t) { var e = ++er; return xn(t) + e }, d.upperCase = Wo, d.upperFirst = Lo, d.each = Xe, d.eachRight = Ye, d.first = He, Rn(d, (Ki = {}, j(d, function (t, e) { tr.call(d.prototype, e) || (Ki[e] = t) }), Ki), { chain: !1 }), d.VERSION = "4.17.4", Go(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function (t) { d[t].placeholder = d }), Go(["drop", "take"], function (n, r) { m.prototype[n] = function (t) { t = t === Ss ? 1 : Ar(yn(t), 0); var e = this.__filtered__ && !r ? new m(this) : this.clone(); return e.__filtered__ ? e.__takeCount__ = Ir(t, e.__takeCount__) : e.__views__.push({ size: Ir(t, js), type: n + (e.__dir__ < 0 ? "Right" : "") }), e }, m.prototype[n + "Right"] = function (t) { return this.reverse()[n](t).reverse() } }), Go(["filter", "map", "takeWhile"], function (t, e) { var n = e + 1, r = 1 == n || 3 == n; m.prototype[t] = function (t) { var e = this.clone(); return e.__iteratees__.push({ iteratee: ge(t, 3), type: n }), e.__filtered__ = e.__filtered__ || r, e } }), Go(["head", "last"], function (t, e) { var n = "take" + (e ? "Right" : ""); m.prototype[t] = function () { return this[n](1).value()[0] } }), Go(["initial", "tail"], function (t, e) { var n = "drop" + (e ? "" : "Right"); m.prototype[t] = function () { return this.__filtered__ ? new m(this) : this[n](1) } }), m.prototype.compact = function () { return this.filter(Nn) }, m.prototype.find = function (t) { return this.filter(t).head() }, m.prototype.findLast = function (t) { return this.reverse().find(t) }, m.prototype.invokeMap = at(function (e, n) { return "function" == typeof e ? new m(this) : this.map(function (t) { return B(t, e, n) }) }), m.prototype.reject = function (t) { return this.filter(en(ge(t))) }, m.prototype.slice = function (t, e) { t = yn(t); var n = this; return n.__filtered__ && (0 < t || e < 0) ? new m(n) : (t < 0 ? n = n.takeRight(-t) : t && (n = n.drop(t)), e !== Ss && (n = (e = yn(e)) < 0 ? n.dropRight(-e) : n.take(e - t)), n) }, m.prototype.takeRightWhile = function (t) { return this.reverse().takeWhile(t).reverse() }, m.prototype.toArray = function () { return this.take(js) }, j(m.prototype, function (c, t) { var l = /^(?:filter|find|map|reject)|While$/.test(t), h = /^(?:head|last)$/.test(t), f = d[h ? "take" + ("last" == t ? "Right" : "") : t], p = h || /^find/.test(t); f && (d.prototype[t] = function () { function t(t) { return t = f.apply(d, Jo([t], n)), h && s ? t[0] : t } var e = this.__wrapped__, n = h ? [1] : arguments, r = e instanceof m, i = n[0], o = r || io(e); o && l && "function" == typeof i && 1 != i.length && (r = o = !1); var s = this.__chain__, a = !!this.__actions__.length, i = p && !s, a = r && !a; if (p || !o) return i && a ? c.apply(this, n) : (u = this.thru(t), i ? h ? u.value()[0] : u.value() : u); e = a ? e : new m(this); var u = c.apply(e, n); return u.__actions__.push({ func: $e, args: [t], thisArg: Ss }), new g(u, s) }) }), Go(["pop", "push", "shift", "sort", "splice", "unshift"], function (t) { var n = Yn[t], r = /^(?:push|sort|unshift)$/.test(t) ? "tap" : "thru", i = /^(?:pop|shift)$/.test(t); d.prototype[t] = function () { var e = arguments; if (!i || this.__chain__) return this[r](function (t) { return n.apply(io(t) ? t : [], e) }); var t = this.value(); return n.apply(io(t) ? t : [], e) } }), j(m.prototype, function (t, e) { var n, r = d[e]; r && (n = r.name + "", (qr[n] || (qr[n] = [])).push({ name: e, func: r })) }), qr[Xt(Ss, 2).name] = [{ name: "wrapper", func: Ss }], m.prototype.clone = function () { var t = new m(this.__wrapped__); return t.__actions__ = Mt(this.__actions__), t.__dir__ = this.__dir__, t.__filtered__ = this.__filtered__, t.__iteratees__ = Mt(this.__iteratees__), t.__takeCount__ = this.__takeCount__, t.__views__ = Mt(this.__views__), t }, m.prototype.reverse = function () { var t; return this.__filtered__ ? ((t = new m(this)).__dir__ = -1, t.__filtered__ = !0) : (t = this.clone()).__dir__ *= -1, t }, m.prototype.value = function () { var t = this.__wrapped__.value(), e = this.__dir__, n = io(t), r = e < 0, i = n ? t.length : 0, o = function (t, e, n) { for (var r = -1, i = n.length; ++r < i;) { var o = n[r], s = o.size; switch (o.type) { case "drop": t += s; break; case "dropRight": e -= s; break; case "take": e = Ir(e, t + s); break; case "takeRight": t = Ar(t, e - s) } } return { start: t, end: e } }(0, i, this.__views__), s = o.start, a = (o = o.end) - s, u = r ? o : s - 1, c = this.__iteratees__, l = c.length, h = 0, f = Ir(a, this.__takeCount__); if (!n || !r && i == a && f == a) return Ct(t, this.__actions__); var p = []; t: for (; a-- && h < f;) { for (var d = -1, g = t[u += e]; ++d < l;) { var m = c[d], v = m.iteratee, m = m.type, v = v(g); if (2 == m) g = v; else if (!v) { if (1 == m) continue t; break t } } p[h++] = g } return p }, d.prototype.at = Mi, d.prototype.chain = function () { return Ve(this) }, d.prototype.commit = function () { return new g(this.value(), this.__chain__) }, d.prototype.next = function () { this.__values__ === Ss && (this.__values__ = mn(this.value())); var t = this.__index__ >= this.__values__.length; return { done: t, value: t ? Ss : this.__values__[this.__index__++] } }, d.prototype.plant = function (t) { for (var e, n = this; n instanceof o;) { var r = Me(n); r.__index__ = 0, r.__values__ = Ss, e ? i.__wrapped__ = r : e = r; var i = r, n = n.__wrapped__ } return i.__wrapped__ = t, e }, d.prototype.reverse = function () { var t = this.__wrapped__; if (t instanceof m) { t = t; return this.__actions__.length && (t = new m(this)), (t = t.reverse()).__actions__.push({ func: $e, args: [ze], thisArg: Ss }), new g(t, this.__chain__) } return this.thru(ze) }, d.prototype.toJSON = d.prototype.valueOf = d.prototype.value = function () { return Ct(this.__wrapped__, this.__actions__) }, d.prototype.first = d.prototype.head, mr && (d.prototype[mr] = function () { return this }), d }(); "function" == typeof define && "object" == typeof define.amd && define.amd ? (Ka._ = au, define(function () { return au })) : n ? ((n.exports = au)._ = au, s._ = au) : Ka._ = au }.call(this), function (t, e) { "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : t.jStat = e() }(this, function () { var p, d, _, x, m, g, a, u, i, e, c, l, h, s, n, f = function (a, u) { var e = Array.prototype.concat, t = Array.prototype.slice, n = Object.prototype.toString; function c(t, e) { e = e < t ? t : e; return a.pow(10, 17 - ~~(a.log(0 < e ? e : -e) * a.LOG10E)) } var l = Array.isArray || function (t) { return "[object Array]" === n.call(t) }; function h(t) { return "[object Function]" === n.call(t) } function f(t) { return "number" == typeof t && t - t == 0 } function p() { return new p._init(arguments) } function r() { return 0 } function i() { return 1 } function o(t, e) { return t === e ? 1 : 0 } function s(t, e, n, r) { var i, o = [], s = t.length; if (e === u && n === u && r === u) return p.copy(t); if (r = r || 1, (e = 0 <= (e = e || 0) ? e : s + e) === (n = 0 <= (n = n || t.length) ? n : s + n) || 0 === r) return []; if (e < n && r < 0) return []; if (n < e && 0 < r) return []; if (0 < r) for (i = e; i < n; i += r)o.push(t[i]); else for (i = e; n < i; i += r)o.push(t[i]); return o } p.fn = p.prototype, p._init = function (t) { if (l(t[0])) if (l(t[0][0])) { h(t[1]) && (t[0] = p.map(t[0], t[1])); for (var e = 0; e < t[0].length; e++)this[e] = t[0][e]; this.length = t[0].length } else this[0] = h(t[1]) ? p.map(t[0], t[1]) : t[0], this.length = 1; else if (f(t[0])) this[0] = p.seq.apply(null, t), this.length = 1; else { if (t[0] instanceof p) return p(t[0].toArray()); this[0] = [], this.length = 1 } return this }, p._init.prototype = p.prototype, (p._init.constructor = p).utils = { calcRdx: c, isArray: l, isFunction: h, isNumber: f, toVector: function (t) { return e.apply([], t) } }, p._random_fn = a.random, p.setRandom = function (t) { if ("function" != typeof t) throw new TypeError("fn is not a function"); p._random_fn = t }, p.extend = function (t) { var e, n; if (1 === arguments.length) { for (n in t) p[n] = t[n]; return this } for (e = 1; e < arguments.length; e++)for (n in arguments[e]) t[n] = arguments[e][n]; return t }, p.rows = function (t) { return t.length || 1 }, p.cols = function (t) { return t[0].length || 1 }, p.dimensions = function (t) { return { rows: p.rows(t), cols: p.cols(t) } }, p.row = function (e, t) { return l(t) ? t.map(function (t) { return p.row(e, t) }) : e[t] }, p.rowa = function (t, e) { return p.row(t, e) }, p.col = function (r, t) { if (l(t)) { var i = p.arange(r.length).map(function () { return new Array(t.length) }); return t.forEach(function (e, n) { p.arange(r.length).forEach(function (t) { i[t][n] = r[t][e] }) }), i } for (var e = new Array(r.length), n = 0; n < r.length; n++)e[n] = [r[n][t]]; return e }, p.cola = function (t, e) { return p.col(t, e).map(function (t) { return t[0] }) }, p.diag = function (t) { for (var e = p.rows(t), n = new Array(e), r = 0; r < e; r++)n[r] = [t[r][r]]; return n }, p.antidiag = function (t) { for (var e = p.rows(t) - 1, n = new Array(e), r = 0; 0 <= e; e--, r++)n[r] = [t[r][e]]; return n }, p.transpose = function (t) { var e, n, r, i, o, s = []; for (l(t[0]) || (t = [t]), n = t.length, r = t[0].length, o = 0; o < r; o++) { for (e = new Array(n), i = 0; i < n; i++)e[i] = t[i][o]; s.push(e) } return 1 === s.length ? s[0] : s }, p.map = function (t, e, n) { var r, i, o, s, a; for (l(t[0]) || (t = [t]), i = t.length, o = t[0].length, s = n ? t : new Array(i), r = 0; r < i; r++)for (s[r] || (s[r] = new Array(o)), a = 0; a < o; a++)s[r][a] = e(t[r][a], r, a); return 1 === s.length ? s[0] : s }, p.cumreduce = function (t, e, n) { var r, i, o, s, a; for (l(t[0]) || (t = [t]), i = t.length, o = t[0].length, s = n ? t : new Array(i), r = 0; r < i; r++)for (s[r] || (s[r] = new Array(o)), 0 < o && (s[r][0] = t[r][0]), a = 1; a < o; a++)s[r][a] = e(s[r][a - 1], t[r][a]); return 1 === s.length ? s[0] : s }, p.alter = function (t, e) { return p.map(t, e, !0) }, p.create = function (t, e, n) { var r, i, o = new Array(t); for (h(e) && (n = e, e = t), r = 0; r < t; r++)for (o[r] = new Array(e), i = 0; i < e; i++)o[r][i] = n(r, i); return o }, p.zeros = function (t, e) { return f(e) || (e = t), p.create(t, e, r) }, p.ones = function (t, e) { return f(e) || (e = t), p.create(t, e, i) }, p.rand = function (t, e) { return f(e) || (e = t), p.create(t, e, p._random_fn) }, p.identity = function (t, e) { return f(e) || (e = t), p.create(t, e, o) }, p.symmetric = function (t) { var e, n, r = t.length; if (t.length !== t[0].length) return !1; for (e = 0; e < r; e++)for (n = 0; n < r; n++)if (t[n][e] !== t[e][n]) return !1; return !0 }, p.clear = function (t) { return p.alter(t, r) }, p.seq = function (t, e, n, r) { h(r) || (r = !1); for (var i = [], o = c(t, e), s = (e * o - t * o) / ((n - 1) * o), a = t, u = 0; a <= e && u < n; a = (t * o + s * o * ++u) / o)i.push(r ? r(a, u) : a); return i }, p.arange = function (t, e, n) { var r, i = []; if (n = n || 1, e === u && (e = t, t = 0), t === e || 0 === n) return []; if (t < e && n < 0) return []; if (e < t && 0 < n) return []; if (0 < n) for (r = t; r < e; r += n)i.push(r); else for (r = t; e < r; r += n)i.push(r); return i }, p.slice = function (t, e) { var n, r; return f((e = e || {}).row) ? f(e.col) ? t[e.row][e.col] : s(p.rowa(t, e.row), (n = e.col || {}).start, n.end, n.step) : f(e.col) ? s(p.cola(t, e.col), (r = e.row || {}).start, r.end, r.step) : (r = e.row || {}, n = e.col || {}, s(t, r.start, r.end, r.step).map(function (t) { return s(t, n.start, n.end, n.step) })) }, p.sliceAssign = function (i, t, o) { var e, n; if (f(t.row)) { if (f(t.col)) return i[t.row][t.col] = o; t.col = t.col || {}, t.col.start = t.col.start || 0, t.col.end = t.col.end || i[0].length, t.col.step = t.col.step || 1, e = p.arange(t.col.start, a.min(i.length, t.col.end), t.col.step); var r = t.row; return e.forEach(function (t, e) { i[r][t] = o[e] }), i } if (f(t.col)) { t.row = t.row || {}, t.row.start = t.row.start || 0, t.row.end = t.row.end || i.length, t.row.step = t.row.step || 1, n = p.arange(t.row.start, a.min(i[0].length, t.row.end), t.row.step); var s = t.col; return n.forEach(function (t, e) { i[t][s] = o[e] }), i } return o[0].length === u && (o = [o]), t.row.start = t.row.start || 0, t.row.end = t.row.end || i.length, t.row.step = t.row.step || 1, t.col.start = t.col.start || 0, t.col.end = t.col.end || i[0].length, t.col.step = t.col.step || 1, n = p.arange(t.row.start, a.min(i.length, t.row.end), t.row.step), e = p.arange(t.col.start, a.min(i[0].length, t.col.end), t.col.step), n.forEach(function (n, r) { e.forEach(function (t, e) { i[n][t] = o[r][e] }) }), i }, p.diagonal = function (t) { var n = p.zeros(t.length, t.length); return t.forEach(function (t, e) { n[e][e] = t }), n }, p.copy = function (t) { return t.map(function (t) { return f(t) ? t : t.map(function (t) { return t }) }) }; var d = p.prototype; return d.length = 0, d.push = Array.prototype.push, d.sort = Array.prototype.sort, d.splice = Array.prototype.splice, d.slice = Array.prototype.slice, d.toArray = function () { return 1 < this.length ? t.call(this) : t.call(this)[0] }, d.map = function (t, e) { return p(p.map(this, t, e)) }, d.cumreduce = function (t, e) { return p(p.cumreduce(this, t, e)) }, d.alter = function (t) { return p.alter(this, t), this }, function (t) { for (var e = 0; e < t.length; e++)!function (r) { d[r] = function (t) { var e, n = this; return t ? (setTimeout(function () { t.call(n, d[r].call(n)) }), this) : (e = p[r](this), l(e) ? p(e) : e) } }(t[e]) }("transpose clear symmetric rows cols dimensions diag antidiag".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (r) { d[r] = function (t, e) { var n = this; return e ? (setTimeout(function () { e.call(n, d[r].call(n, t)) }), this) : p(p[r](this, t)) } }(t[e]) }("row col".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (t) { d[t] = function () { return p(p[t].apply(null, arguments)) } }(t[e]) }("create zeros ones rand identity".split(" ")), p }(Math); function o(t, e, n, r) { for (var i, o = 0, s = 1, a = 1, u = 1, c = 0, l = 0; x.abs((a - l) / a) > r;)s = u + (i = -(e + c) * (e + n + c) * t / (e + 2 * c) / (e + 2 * c + 1)) * s, a = (o = (l = a) + i * o) + (i = (c += 1) * (n - c) * t / (e + 2 * c - 1) / (e + 2 * c)) * a, o /= u = s + i * u, s /= u, a /= u, u = 1; return a / e } function v(t, e, n) { var r = [.9815606342467192, .9041172563704749, .7699026741943047, .5873179542866175, .3678314989981802, .1252334085114689], i = [.04717533638651183, .10693932599531843, .16007832854334622, .20316742672306592, .2334925365383548, .24914704581340277], o = .5 * t; if (8 <= o) return 1; for (var s = (s = 2 * _.normal.cdf(o, 0, 1, 1, 0) - 1) >= x.exp(-50 / n) ? x.pow(s, n) : 0, a = 3 < t ? 2 : 3, u = o, c = (8 - o) / a, l = u + c, h = 0, f = n - 1, p = 1; p <= a; p++) { for (var d = 0, g = .5 * (l + u), m = .5 * (l - u), v = 1; v <= 12; v++) { var y, b = 6 < v ? r[(y = 12 - v + 1) - 1] : -r[(y = v) - 1], w = g + m * b, b = w * w; if (60 < b) break; w = .5 * (2 * _.normal.cdf(w, 0, 1, 1, 0)) - .5 * (2 * _.normal.cdf(w, t, 1, 1, 0)); w >= x.exp(-30 / f) && (d += i[y - 1] * x.exp(-.5 * b) * x.pow(w, f)) } h += d *= 2 * m * n / x.sqrt(2 * x.PI), u = l, l += c } return (s += h) <= x.exp(-30 / e) ? 0 : 1 <= (s = x.pow(s, e)) ? 1 : s } function y(t) { return e(t) || t instanceof m } function b(t, e, n, r) { if (1 < t || 1 < n || t <= 0 || n <= 0) throw new Error("Proportions should be greater than 0 and less than 1"); var i = (t * e + n * r) / (e + r); return (t - n) / l.sqrt(i * (1 - i) * (1 / e + 1 / r)) } function w(t, e) { var n = t.length, r = e[0].length - 1, i = n - r - 1, o = f.lstsq(e, t), s = f.multiply(e, o.map(function (t) { return [t] })).map(function (t) { return t[0] }), a = f.subtract(t, s), u = f.mean(t), c = f.sum(s.map(function (t) { return Math.pow(t - u, 2) })), l = f.sum(t.map(function (t, e) { return Math.pow(t - s[e], 2) })), h = c + l; return { exog: e, endog: t, nobs: n, df_model: r, df_resid: i, coef: o, predict: s, resid: a, ybar: u, SST: h, SSE: c, SSR: l, R2: c / h } } function C(e) { var n, r, t = (n = e.exog, r = n[0].length, f.arange(r).map(function (e) { var t = f.arange(r).filter(function (t) { return t !== e }); return w(f.col(n, e).map(function (t) { return t[0] }), f.col(n, t)) })), i = Math.sqrt(e.SSR / e.df_resid), o = t.map(function (t) { var e = t.SST, t = t.R2; return i / Math.sqrt(e * (1 - t)) }), s = e.coef.map(function (t, e) { return +t / o[e] }), a = s.map(function (t) { t = f.studentt.cdf(t, e.df_resid); return 2 * (.5 < t ? 1 - t : t) }), u = f.studentt.inv(.975, e.df_resid), t = e.coef.map(function (t, e) { e = u * o[e]; return [t - e, t + e] }); return { se: o, t: s, p: a, sigmaHat: i, interval95: t } } return function (u, l) { var c = u.utils.isFunction; function h(t, e) { return t - e } function f(t, e, n) { return l.max(e, l.min(t, n)) } u.sum = function (t) { for (var e = 0, n = t.length; 0 <= --n;)e += t[n]; return e }, u.sumsqrd = function (t) { for (var e = 0, n = t.length; 0 <= --n;)e += t[n] * t[n]; return e }, u.sumsqerr = function (t) { for (var e, n = u.mean(t), r = 0, i = t.length; 0 <= --i;)r += (e = t[i] - n) * e; return r }, u.sumrow = function (t) { for (var e = 0, n = t.length; 0 <= --n;)e += t[n]; return e }, u.product = function (t) { for (var e = 1, n = t.length; 0 <= --n;)e *= t[n]; return e }, u.min = function (t) { for (var e = t[0], n = 0; ++n < t.length;)t[n] < e && (e = t[n]); return e }, u.max = function (t) { for (var e = t[0], n = 0; ++n < t.length;)t[n] > e && (e = t[n]); return e }, u.unique = function (t) { for (var e = {}, n = [], r = 0; r < t.length; r++)e[t[r]] || (e[t[r]] = !0, n.push(t[r])); return n }, u.mean = function (t) { return u.sum(t) / t.length }, u.meansqerr = function (t) { return u.sumsqerr(t) / t.length }, u.geomean = function (t) { return l.pow(u.product(t), 1 / t.length) }, u.median = function (t) { var e = t.length, t = t.slice().sort(h); return 1 & e ? t[e / 2 | 0] : (t[e / 2 - 1] + t[e / 2]) / 2 }, u.cumsum = function (t) { return u.cumreduce(t, function (t, e) { return t + e }) }, u.cumprod = function (t) { return u.cumreduce(t, function (t, e) { return t * e }) }, u.diff = function (t) { for (var e = [], n = t.length, r = 1; r < n; r++)e.push(t[r] - t[r - 1]); return e }, u.rank = function (t) { for (var e = [], n = {}, r = 0; r < t.length; r++)n[a = t[r]] ? n[a]++ : (n[a] = 1, e.push(a)); var i = e.sort(h), o = {}, s = 1; for (r = 0; r < i.length; r++) { var a, u = n[a = i[r]], c = (s + (s + u - 1)) / 2; o[a] = c, s += u } return t.map(function (t) { return o[t] }) }, u.mode = function (t) { for (var e = t.length, n = t.slice().sort(h), r = 1, i = 0, o = 0, s = [], a = 0; a < e; a++)n[a] === n[a + 1] ? r++ : (i < r ? (s = [n[a]], i = r, o = 0) : r === i && (s.push(n[a]), o++), r = 1); return 0 === o ? s[0] : s }, u.range = function (t) { return u.max(t) - u.min(t) }, u.variance = function (t, e) { return u.sumsqerr(t) / (t.length - (e ? 1 : 0)) }, u.pooledvariance = function (t) { return t.reduce(function (t, e) { return t + u.sumsqerr(e) }, 0) / (t.reduce(function (t, e) { return t + e.length }, 0) - t.length) }, u.deviation = function (t) { for (var e = u.mean(t), n = t.length, r = new Array(n), i = 0; i < n; i++)r[i] = t[i] - e; return r }, u.stdev = function (t, e) { return l.sqrt(u.variance(t, e)) }, u.pooledstdev = function (t) { return l.sqrt(u.pooledvariance(t)) }, u.meandev = function (t) { for (var e = u.mean(t), n = [], r = t.length - 1; 0 <= r; r--)n.push(l.abs(t[r] - e)); return u.mean(n) }, u.meddev = function (t) { for (var e = u.median(t), n = [], r = t.length - 1; 0 <= r; r--)n.push(l.abs(t[r] - e)); return u.median(n) }, u.coeffvar = function (t) { return u.stdev(t) / u.mean(t) }, u.quartiles = function (t) { var e = t.length, t = t.slice().sort(h); return [t[l.round(e / 4) - 1], t[l.round(e / 2) - 1], t[l.round(3 * e / 4) - 1]] }, u.quantiles = function (t, e, n, r) { var i, o, s, a = t.slice().sort(h), u = [e.length], c = t.length; for (void 0 === n && (n = 3 / 8), void 0 === r && (r = 3 / 8), i = 0; i < e.length; i++)s = c * (o = e[i]) + (n + o * (1 - n - r)), o = l.floor(f(s, 1, c - 1)), s = f(s - o, 0, 1), u[i] = (1 - s) * a[o - 1] + s * a[o]; return u }, u.percentile = function (t, e, n) { t = t.slice().sort(h), e = e * (t.length + (n ? 1 : -1)) + (n ? 0 : 1), n = parseInt(e), e -= n; return n + 1 < t.length ? t[n - 1] + e * (t[n] - t[n - 1]) : t[n - 1] }, u.percentileOfScore = function (t, e, n) { for (var r, i = 0, o = t.length, s = "strict" === n ? !0 : !1, a = 0; a < o; a++)r = t[a], (s && r < e || !s && r <= e) && i++; return i / o }, u.histogram = function (t, e) { e = e || 4; for (var n = u.min(t), r = (u.max(t) - n) / e, i = t.length, o = [], s = 0; s < e; s++)o[s] = 0; for (s = 0; s < i; s++)o[l.min(l.floor((t[s] - n) / r), e - 1)] += 1; return o }, u.covariance = function (t, e) { for (var n = u.mean(t), r = u.mean(e), i = t.length, o = new Array(i), s = 0; s < i; s++)o[s] = (t[s] - n) * (e[s] - r); return u.sum(o) / (i - 1) }, u.corrcoeff = function (t, e) { return u.covariance(t, e) / u.stdev(t, 1) / u.stdev(e, 1) }, u.spearmancoeff = function (t, e) { return t = u.rank(t), e = u.rank(e), u.corrcoeff(t, e) }, u.stanMoment = function (t, e) { for (var n = u.mean(t), r = u.stdev(t), i = t.length, o = 0, s = 0; s < i; s++)o += l.pow((t[s] - n) / r, e); return o / t.length }, u.skewness = function (t) { return u.stanMoment(t, 3) }, u.kurtosis = function (t) { return u.stanMoment(t, 4) - 3 }; var p = u.prototype; !function (t) { for (var e = 0; e < t.length; e++)!function (o) { p[o] = function (t, e) { var n = [], r = 0, i = this; if (c(t) && (e = t, t = !1), e) return setTimeout(function () { e.call(i, p[o].call(i, t)) }), this; if (1 < this.length) { for (i = !0 === t ? this : this.transpose(); r < i.length; r++)n[r] = u[o](i[r]); return n } return u[o](this[0], t) } }(t[e]) }("cumsum cumprod".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (o) { p[o] = function (t, e) { var n = [], r = 0, i = this; if (c(t) && (e = t, t = !1), e) return setTimeout(function () { e.call(i, p[o].call(i, t)) }), this; if (1 < this.length) { for ("sumrow" !== o && (i = !0 === t ? this : this.transpose()); r < i.length; r++)n[r] = u[o](i[r]); return !0 === t ? u[o](u.utils.toVector(n)) : n } return u[o](this[0], t) } }(t[e]) }("sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr geomean median diff rank mode range variance deviation stdev meandev meddev coeffvar quartiles histogram skewness kurtosis".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (a) { p[a] = function () { var t, e = [], n = 0, r = this, i = Array.prototype.slice.call(arguments); if (c(i[i.length - 1])) { t = i[i.length - 1]; var o = i.slice(0, i.length - 1); return setTimeout(function () { t.call(r, p[a].apply(r, o)) }), this } t = void 0; var s = function (t) { return u[a].apply(r, [t].concat(i)) }; if (1 < this.length) { for (r = r.transpose(); n < r.length; n++)e[n] = s(r[n]); return e } return s(this[0]) } }(t[e]) }("quantiles percentileOfScore".split(" ")) }(f, Math), p = f, d = Math, p.gammaln = function (t) { var e, n, r = 0, i = [76.18009172947146, -86.50532032941678, 24.01409824083091, -1.231739572450155, .001208650973866179, -5395239384953e-18], o = 1.000000000190015, t = (n = e = t) + 5.5; for (t -= (e + .5) * d.log(t); r < 6; r++)o += i[r] / ++n; return d.log(2.5066282746310007 * o / e) - t }, p.loggam = function (t) { var e, n, r, i, o, s = [.08333333333333333, -.002777777777777778, .0007936507936507937, -.0005952380952380952, .0008417508417508418, -.001917526917526918, .00641025641025641, -.02955065359477124, .1796443723688307, -1.3924322169059], a = t, u = 0; if (1 == t || 2 == t) return 0; for (t <= 7 && (a = t + (u = d.floor(7 - t))), e = 1 / (a * a), n = 2 * d.PI, i = s[9], o = 8; 0 <= o; o--)i *= e, i += s[o]; if (r = i / a + .5 * d.log(n) + (a - .5) * d.log(a) - a, t <= 7) for (o = 1; o <= u; o++)r -= d.log(a - 1), --a; return r }, p.gammafn = function (t) { var e, n, r, i = [-1.716185138865495, 24.76565080557592, -379.80425647094563, 629.3311553128184, 866.9662027904133, -31451.272968848367, -36144.413418691176, 66456.14382024054], o = [-30.8402300119739, 315.35062697960416, -1015.1563674902192, -3107.771671572311, 22538.11842098015, 4755.846277527881, -134659.9598649693, -115132.2596755535], s = !1, a = 0, u = 0, c = 0, l = t; if (171.6243769536076 < t) return 1 / 0; if (l <= 0) { if (!(r = l % 1 + 36e-17)) return 1 / 0; s = (1 & l ? -1 : 1) * d.PI / d.sin(d.PI * r), l = 1 - l } for (n = (t = l) < 1 ? l++ : (l -= a = (0 | l) - 1) - 1, e = 0; e < 8; ++e)c = (c + i[e]) * n, u = u * n + o[e]; if (r = c / u + 1, t < l) r /= t; else if (l < t) for (e = 0; e < a; ++e)r *= l, l++; return s && (r = s / r), r }, p.gammap = function (t, e) { return p.lowRegGamma(t, e) * p.gammafn(t) }, p.lowRegGamma = function (t, e) { var n, r = p.gammaln(t), i = t, o = 1 / t, s = o, a = e + 1 - t, u = 1 / 1e-30, c = 1 / a, l = c, h = 1, f = -~(8.5 * d.log(1 <= t ? t : 1 / t) + .4 * t + 17); if (e < 0 || t <= 0) return NaN; if (e < t + 1) { for (; h <= f; h++)o += s *= e / ++i; return o * d.exp(-e + t * d.log(e) - r) } for (; h <= f; h++)l *= (c = 1 / (c = (n = -h * (h - t)) * c + (a += 2))) * (u = a + n / u); return 1 - l * d.exp(-e + t * d.log(e) - r) }, p.factorialln = function (t) { return t < 0 ? NaN : p.gammaln(t + 1) }, p.factorial = function (t) { return t < 0 ? NaN : p.gammafn(t + 1) }, p.combination = function (t, e) { return 170 < t || 170 < e ? d.exp(p.combinationln(t, e)) : p.factorial(t) / p.factorial(e) / p.factorial(t - e) }, p.combinationln = function (t, e) { return p.factorialln(t) - p.factorialln(e) - p.factorialln(t - e) }, p.permutation = function (t, e) { return p.factorial(t) / p.factorial(t - e) }, p.betafn = function (t, e) { if (!(t <= 0 || e <= 0)) return 170 < t + e ? d.exp(p.betaln(t, e)) : p.gammafn(t) * p.gammafn(e) / p.gammafn(t + e) }, p.betaln = function (t, e) { return p.gammaln(t) + p.gammaln(e) - p.gammaln(t + e) }, p.betacf = function (t, e, n) { var r, i, o, s = 1e-30, a = 1, u = e + n, c = e + 1, l = e - 1, h = 1, f = 1 - u * t / c; for (d.abs(f) < s && (f = s), o = f = 1 / f; a <= 100 && (f = 1 + (i = a * (n - a) * t / ((l + (r = 2 * a)) * (e + r))) * f, d.abs(f) < s && (f = s), h = 1 + i / h, d.abs(h) < s && (h = s), o *= (f = 1 / f) * h, f = 1 + (i = -(e + a) * (u + a) * t / ((e + r) * (c + r))) * f, d.abs(f) < s && (f = s), h = 1 + i / h, d.abs(h) < s && (h = s), o *= i = (f = 1 / f) * h, !(d.abs(i - 1) < 3e-7)); a++); return o }, p.gammapinv = function (t, e) { var n, r, i, o, s, a, u = 0, c = e - 1, l = p.gammaln(e); if (1 <= t) return d.max(100, e + 100 * d.sqrt(e)); if (t <= 0) return 0; for (n = 1 < e ? (s = d.log(c), a = d.exp(c * (s - 1) - l), o = t < .5 ? t : 1 - t, n = (2.30753 + .27061 * (r = d.sqrt(-2 * d.log(o)))) / (1 + r * (.99229 + .04481 * r)) - r, t < .5 && (n = -n), d.max(.001, e * d.pow(1 - 1 / (9 * e) - n / (3 * d.sqrt(e)), 3))) : t < (r = 1 - e * (.253 + .12 * e)) ? d.pow(t / r, 1 / e) : 1 - d.log(1 - (t - r) / (1 - r)); u < 12; u++) { if (n <= 0) return 0; if ((n -= r = (i = (p.lowRegGamma(e, n) - t) / (r = 1 < e ? a * d.exp(-(n - c) + c * (d.log(n) - s)) : d.exp(-n + c * d.log(n) - l))) / (1 - .5 * d.min(1, i * ((e - 1) / n - 1)))) <= 0 && (n = .5 * (n + r)), d.abs(r) < 1e-8 * n) break } return n }, p.erf = function (t) { var e, n, r, i = [-1.3026537197817094, .6419697923564902, .019476473204185836, -.00956151478680863, -.000946595344482036, .000366839497852761, 42523324806907e-18, -20278578112534e-18, -1624290004647e-18, 130365583558e-17, 1.5626441722e-8, -8.5238095915e-8, 6.529054439e-9, 5.059343495e-9, -9.91364156e-10, -2.27365122e-10, 96467911e-18, 2394038e-18, -6886027e-18, 894487e-18, 313092e-18, -112708e-18, 381e-18, 7106e-18, -1523e-18, -94e-18, 121e-18, -28e-18], o = i.length - 1, s = !1, a = 0, u = 0; for (t < 0 && (t = -t, s = !0), n = 4 * (e = 2 / (2 + t)) - 2; 0 < o; o--)a = n * (r = a) - u + i[o], u = r; return t = e * d.exp(-t * t + .5 * (i[0] + n * a) - u), s ? t - 1 : 1 - t }, p.erfc = function (t) { return 1 - p.erf(t) }, p.erfcinv = function (t) { var e, n, r, i, o = 0; if (2 <= t) return -100; if (t <= 0) return 100; for (i = t < 1 ? t : 2 - t, e = -.70711 * ((2.30753 + .27061 * (r = d.sqrt(-2 * d.log(i / 2)))) / (1 + r * (.99229 + .04481 * r)) - r); o < 2; o++)e += (n = p.erfc(e) - i) / (1.1283791670955126 * d.exp(-e * e) - e * n); return t < 1 ? e : -e }, p.ibetainv = function (t, e, n) { var r, i, o, s, a, u, c, l = e - 1, h = n - 1, f = 0; if (t <= 0) return 0; if (1 <= t) return 1; for (o = 1 <= e && 1 <= n ? (u = t < .5 ? t : 1 - t, o = (2.30753 + .27061 * (r = d.sqrt(-2 * d.log(u)))) / (1 + r * (.99229 + .04481 * r)) - r, t < .5 && (o = -o), s = (o * o - 3) / 6, a = 2 / (1 / (2 * e - 1) + 1 / (2 * n - 1)), u = o * d.sqrt(s + a) / a - (1 / (2 * n - 1) - 1 / (2 * e - 1)) * (s + 5 / 6 - 2 / (3 * a)), e / (e + n * d.exp(2 * u))) : (s = d.log(e / (e + n)), a = d.log(n / (e + n)), t < (r = d.exp(e * s) / e) / (u = r + (i = d.exp(n * a) / n)) ? d.pow(e * u * t, 1 / e) : 1 - d.pow(n * u * (1 - t), 1 / n)), c = -p.gammaln(e) - p.gammaln(n) + p.gammaln(e + n); f < 10; f++) { if (0 === o || 1 === o) return o; if ((o -= r = (i = (p.ibeta(o, e, n) - t) / (r = d.exp(l * d.log(o) + h * d.log(1 - o) + c))) / (1 - .5 * d.min(1, i * (l / o - h / (1 - o))))) <= 0 && (o = .5 * (o + r)), 1 <= o && (o = .5 * (o + r + 1)), d.abs(r) < 1e-8 * o && 0 < f) break } return o }, p.ibeta = function (t, e, n) { var r = 0 === t || 1 === t ? 0 : d.exp(p.gammaln(e + n) - p.gammaln(e) - p.gammaln(n) + e * d.log(t) + n * d.log(1 - t)); return !(t < 0 || 1 < t) && (t < (e + 1) / (e + n + 2) ? r * p.betacf(t, e, n) / e : 1 - r * p.betacf(1 - t, n, e) / n) }, p.randn = function (t, e) { var n, r, i, o; if (e = e || t, t) return p.create(t, e, function () { return p.randn() }); for (; n = p._random_fn(), r = 1.7156 * (p._random_fn() - .5), o = (o = n - .449871) * o + (i = d.abs(r) + .386595) * (.196 * i - .25472 * o), .27597 < o && (.27846 < o || r * r > -4 * d.log(n) * n * n);); return r / n }, p.randg = function (t, e, n) { var r, i, o, s, a, u = t; if (n = n || e, t = t || 1, e) return (n = p.zeros(e, n)).alter(function () { return p.randg(t) }), n; t < 1 && (t += 1), r = t - 1 / 3, i = 1 / d.sqrt(9 * r); do { for (; s = 1 + i * (a = p.randn()), s <= 0;); } while (s *= s * s, (o = p._random_fn()) > 1 - .331 * d.pow(a, 4) && d.log(o) > .5 * a * a + r * (1 - s + d.log(s))); if (t == u) return r * s; for (; o = p._random_fn(), 0 === o;); return d.pow(o, 1 / u) * r * s }, function (t) { for (var e = 0; e < t.length; e++)!function (e) { p.fn[e] = function () { return p(p.map(this, function (t) { return p[e](t) })) } }(t[e]) }("gammaln gammafn factorial factorialln".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (t) { p.fn[t] = function () { return p(p[t].apply(null, arguments)) } }(t[e]) }("randn".split(" ")), _ = f, x = Math, function (t) { for (var e = 0; e < t.length; e++)!function (o) { _[o] = function (t, e, n) { return this instanceof arguments.callee ? (this._a = t, this._b = e, this._c = n, this) : new arguments.callee(t, e, n) }, _.fn[o] = function (t, e, n) { n = _[o](t, e, n); return n.data = this, n }, _[o].prototype.sample = function (t) { var e = this._a, n = this._b, r = this._c; return t ? _.alter(t, function () { return _[o].sample(e, n, r) }) : _[o].sample(e, n, r) }, function (t) { for (var e = 0; e < t.length; e++)!function (i) { _[o].prototype[i] = function (t) { var e = this._a, n = this._b, r = this._c; return t || 0 === t || (t = this.data), "number" != typeof t ? _.fn.map.call(t, function (t) { return _[o][i](t, e, n, r) }) : _[o][i](t, e, n, r) } }(t[e]) }("pdf cdf inv".split(" ")), function (t) { for (var e = 0; e < t.length; e++)!function (t) { _[o].prototype[t] = function () { return _[o][t](this._a, this._b, this._c) } }(t[e]) }("mean median mode variance".split(" ")) }(t[e]) }("beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy laplace lognormal noncentralt normal pareto studentt weibull uniform binomial negbin hypgeom poisson triangular tukey arcsine".split(" ")), _.extend(_.beta, { pdf: function (t, e, n) { return 1 < t || t < 0 ? 0 : 1 == e && 1 == n ? 1 : e < 512 && n < 512 ? x.pow(t, e - 1) * x.pow(1 - t, n - 1) / _.betafn(e, n) : x.exp((e - 1) * x.log(t) + (n - 1) * x.log(1 - t) - _.betaln(e, n)) }, cdf: function (t, e, n) { return 1 < t || t < 0 ? +(1 < t) : _.ibeta(t, e, n) }, inv: function (t, e, n) { return _.ibetainv(t, e, n) }, mean: function (t, e) { return t / (t + e) }, median: function (t, e) { return _.ibetainv(.5, t, e) }, mode: function (t, e) { return (t - 1) / (t + e - 2) }, sample: function (t, e) { t = _.randg(t); return t / (t + _.randg(e)) }, variance: function (t, e) { return t * e / (x.pow(t + e, 2) * (t + e + 1)) } }), _.extend(_.centralF, { pdf: function (t, e, n) { var r; return t < 0 ? 0 : e <= 2 ? 0 === t && e < 2 ? 1 / 0 : 0 === t && 2 === e ? 1 : 1 / _.betafn(e / 2, n / 2) * x.pow(e / n, e / 2) * x.pow(t, e / 2 - 1) * x.pow(1 + e / n * t, -(e + n) / 2) : (r = e * t / (n + t * e), e * (n / (n + t * e)) / 2 * _.binomial.pdf((e - 2) / 2, (e + n - 2) / 2, r)) }, cdf: function (t, e, n) { return t < 0 ? 0 : _.ibeta(e * t / (e * t + n), e / 2, n / 2) }, inv: function (t, e, n) { return n / (e * (1 / _.ibetainv(t, e / 2, n / 2) - 1)) }, mean: function (t, e) { return 2 < e ? e / (e - 2) : void 0 }, mode: function (t, e) { return 2 < t ? e * (t - 2) / (t * (e + 2)) : void 0 }, sample: function (t, e) { return 2 * _.randg(t / 2) / t / (2 * _.randg(e / 2) / e) }, variance: function (t, e) { if (!(e <= 4)) return 2 * e * e * (t + e - 2) / (t * (e - 2) * (e - 2) * (e - 4)) } }), _.extend(_.cauchy, { pdf: function (t, e, n) { return n < 0 ? 0 : n / (x.pow(t - e, 2) + x.pow(n, 2)) / x.PI }, cdf: function (t, e, n) { return x.atan((t - e) / n) / x.PI + .5 }, inv: function (t, e, n) { return e + n * x.tan(x.PI * (t - .5)) }, median: function (t) { return t }, mode: function (t) { return t }, sample: function (t, e) { return _.randn() * x.sqrt(1 / (2 * _.randg(.5))) * e + t } }), _.extend(_.chisquare, { pdf: function (t, e) { return t < 0 ? 0 : 0 === t && 2 === e ? .5 : x.exp((e / 2 - 1) * x.log(t) - t / 2 - e / 2 * x.log(2) - _.gammaln(e / 2)) }, cdf: function (t, e) { return t < 0 ? 0 : _.lowRegGamma(e / 2, t / 2) }, inv: function (t, e) { return 2 * _.gammapinv(t, .5 * e) }, mean: function (t) { return t }, median: function (t) { return t * x.pow(1 - 2 / (9 * t), 3) }, mode: function (t) { return 0 < t - 2 ? t - 2 : 0 }, sample: function (t) { return 2 * _.randg(t / 2) }, variance: function (t) { return 2 * t } }), _.extend(_.exponential, { pdf: function (t, e) { return t < 0 ? 0 : e * x.exp(-e * t) }, cdf: function (t, e) { return t < 0 ? 0 : 1 - x.exp(-e * t) }, inv: function (t, e) { return -x.log(1 - t) / e }, mean: function (t) { return 1 / t }, median: function (t) { return 1 / t * x.log(2) }, mode: function () { return 0 }, sample: function (t) { return -1 / t * x.log(_._random_fn()) }, variance: function (t) { return x.pow(t, -2) } }), _.extend(_.gamma, { pdf: function (t, e, n) { return t < 0 ? 0 : 0 === t && 1 === e ? 1 / n : x.exp((e - 1) * x.log(t) - t / n - _.gammaln(e) - e * x.log(n)) }, cdf: function (t, e, n) { return t < 0 ? 0 : _.lowRegGamma(e, t / n) }, inv: function (t, e, n) { return _.gammapinv(t, e) * n }, mean: function (t, e) { return t * e }, mode: function (t, e) { if (1 < t) return (t - 1) * e }, sample: function (t, e) { return _.randg(t) * e }, variance: function (t, e) { return t * e * e } }), _.extend(_.invgamma, { pdf: function (t, e, n) { return t <= 0 ? 0 : x.exp(-(e + 1) * x.log(t) - n / t - _.gammaln(e) + e * x.log(n)) }, cdf: function (t, e, n) { return t <= 0 ? 0 : 1 - _.lowRegGamma(e, n / t) }, inv: function (t, e, n) { return n / _.gammapinv(1 - t, e) }, mean: function (t, e) { return 1 < t ? e / (t - 1) : void 0 }, mode: function (t, e) { return e / (t + 1) }, sample: function (t, e) { return e / _.randg(t) }, variance: function (t, e) { if (!(t <= 2)) return e * e / ((t - 1) * (t - 1) * (t - 2)) } }), _.extend(_.kumaraswamy, { pdf: function (t, e, n) { return 0 === t && 1 === e ? n : 1 === t && 1 === n ? e : x.exp(x.log(e) + x.log(n) + (e - 1) * x.log(t) + (n - 1) * x.log(1 - x.pow(t, e))) }, cdf: function (t, e, n) { return t < 0 ? 0 : 1 < t ? 1 : 1 - x.pow(1 - x.pow(t, e), n) }, inv: function (t, e, n) { return x.pow(1 - x.pow(1 - t, 1 / n), 1 / e) }, mean: function (t, e) { return e * _.gammafn(1 + 1 / t) * _.gammafn(e) / _.gammafn(1 + 1 / t + e) }, median: function (t, e) { return x.pow(1 - x.pow(2, -1 / e), 1 / t) }, mode: function (t, e) { if (1 <= t && 1 <= e && 1 !== t && 1 !== e) return x.pow((t - 1) / (t * e - 1), 1 / t) }, variance: function () { throw new Error("variance not yet implemented") } }), _.extend(_.lognormal, { pdf: function (t, e, n) { return t <= 0 ? 0 : x.exp(-x.log(t) - .5 * x.log(2 * x.PI) - x.log(n) - x.pow(x.log(t) - e, 2) / (2 * n * n)) }, cdf: function (t, e, n) { return t < 0 ? 0 : .5 + .5 * _.erf((x.log(t) - e) / x.sqrt(2 * n * n)) }, inv: function (t, e, n) { return x.exp(-1.4142135623730951 * n * _.erfcinv(2 * t) + e) }, mean: function (t, e) { return x.exp(t + e * e / 2) }, median: function (t) { return x.exp(t) }, mode: function (t, e) { return x.exp(t - e * e) }, sample: function (t, e) { return x.exp(_.randn() * e + t) }, variance: function (t, e) { return (x.exp(e * e) - 1) * x.exp(2 * t + e * e) } }), _.extend(_.noncentralt, { pdf: function (t, e, n) { return x.abs(n) < 1e-14 ? _.studentt.pdf(t, e) : x.abs(t) < 1e-14 ? x.exp(_.gammaln((e + 1) / 2) - n * n / 2 - .5 * x.log(x.PI * e) - _.gammaln(e / 2)) : e / t * (_.noncentralt.cdf(t * x.sqrt(1 + 2 / e), e + 2, n) - _.noncentralt.cdf(t, e, n)) }, cdf: function (t, e, n) { if (x.abs(n) < 1e-14) return _.studentt.cdf(t, e); var r = !1; t < 0 && (r = !0, n = -n); for (var i = _.normal.cdf(-n, 0, 1), o = 1e-14 + 1, s = o, a = t * t / (t * t + e), u = 0, c = x.exp(-n * n / 2), l = x.exp(-n * n / 2 - .5 * x.log(2) - _.gammaln(1.5)) * n; u < 200 || 1e-14 < s || 1e-14 < o;)s = o, 0 < u && (c *= n * n / (2 * u), l *= n * n / (2 * (u + .5))), i += .5 * (o = c * _.beta.cdf(a, u + .5, e / 2) + l * _.beta.cdf(a, u + 1, e / 2)), u++; return r ? 1 - i : i } }), _.extend(_.normal, { pdf: function (t, e, n) { return x.exp(-.5 * x.log(2 * x.PI) - x.log(n) - x.pow(t - e, 2) / (2 * n * n)) }, cdf: function (t, e, n) { return .5 * (1 + _.erf((t - e) / x.sqrt(2 * n * n))) }, inv: function (t, e, n) { return -1.4142135623730951 * n * _.erfcinv(2 * t) + e }, mean: function (t) { return t }, median: function (t) { return t }, mode: function (t) { return t }, sample: function (t, e) { return _.randn() * e + t }, variance: function (t, e) { return e * e } }), _.extend(_.pareto, { pdf: function (t, e, n) { return t < e ? 0 : n * x.pow(e, n) / x.pow(t, n + 1) }, cdf: function (t, e, n) { return t < e ? 0 : 1 - x.pow(e / t, n) }, inv: function (t, e, n) { return e / x.pow(1 - t, 1 / n) }, mean: function (t, e) { if (!(e <= 1)) return e * x.pow(t, e) / (e - 1) }, median: function (t, e) { return t * (e * x.SQRT2) }, mode: function (t) { return t }, variance: function (t, e) { if (!(e <= 2)) return t * t * e / (x.pow(e - 1, 2) * (e - 2)) } }), _.extend(_.studentt, { pdf: function (t, e) { return e = 1e100 < e ? 1e100 : e, 1 / (x.sqrt(e) * _.betafn(.5, e / 2)) * x.pow(1 + t * t / e, -(e + 1) / 2) }, cdf: function (t, e) { var n = e / 2; return _.ibeta((t + x.sqrt(t * t + e)) / (2 * x.sqrt(t * t + e)), n, n) }, inv: function (t, e) { var n = _.ibetainv(2 * x.min(t, 1 - t), .5 * e, .5), n = x.sqrt(e * (1 - n) / n); return .5 < t ? n : -n }, mean: function (t) { return 1 < t ? 0 : void 0 }, median: function () { return 0 }, mode: function () { return 0 }, sample: function (t) { return _.randn() * x.sqrt(t / (2 * _.randg(t / 2))) }, variance: function (t) { return 2 < t ? t / (t - 2) : 1 < t ? 1 / 0 : void 0 } }), _.extend(_.weibull, { pdf: function (t, e, n) { return t < 0 || e < 0 || n < 0 ? 0 : n / e * x.pow(t / e, n - 1) * x.exp(-x.pow(t / e, n)) }, cdf: function (t, e, n) { return t < 0 ? 0 : 1 - x.exp(-x.pow(t / e, n)) }, inv: function (t, e, n) { return e * x.pow(-x.log(1 - t), 1 / n) }, mean: function (t, e) { return t * _.gammafn(1 + 1 / e) }, median: function (t, e) { return t * x.pow(x.log(2), 1 / e) }, mode: function (t, e) { return e <= 1 ? 0 : t * x.pow((e - 1) / e, 1 / e) }, sample: function (t, e) { return t * x.pow(-x.log(_._random_fn()), 1 / e) }, variance: function (t, e) { return t * t * _.gammafn(1 + 2 / e) - x.pow(_.weibull.mean(t, e), 2) } }), _.extend(_.uniform, { pdf: function (t, e, n) { return t < e || n < t ? 0 : 1 / (n - e) }, cdf: function (t, e, n) { return t < e ? 0 : t < n ? (t - e) / (n - e) : 1 }, inv: function (t, e, n) { return e + t * (n - e) }, mean: function (t, e) { return .5 * (t + e) }, median: function (t, e) { return _.mean(t, e) }, mode: function () { throw new Error("mode is not yet implemented") }, sample: function (t, e) { return t / 2 + e / 2 + (e / 2 - t / 2) * (2 * _._random_fn() - 1) }, variance: function (t, e) { return x.pow(e - t, 2) / 12 } }), _.extend(_.binomial, { pdf: function (t, e, n) { return 0 === n || 1 === n ? e * n === t ? 1 : 0 : _.combination(e, t) * x.pow(n, t) * x.pow(1 - n, e - t) }, cdf: function (t, e, n) { if (t < 0) return 0; if (e <= t) return 1; if (n < 0 || 1 < n || e <= 0) return NaN; var r = n, i = (t = x.floor(t)) + 1, n = e - t, e = i + n, t = x.exp(_.gammaln(e) - _.gammaln(n) - _.gammaln(i) + i * x.log(r) + n * x.log(1 - r)), i = r < (i + 1) / (e + 2) ? t * o(r, i, n, 1e-10) : 1 - t * o(1 - r, n, i, 1e-10); return x.round(1e10 * (1 - i)) / 1e10 } }), _.extend(_.negbin, { pdf: function (t, e, n) { return t === t >>> 0 && (t < 0 ? 0 : _.combination(t + e - 1, e - 1) * x.pow(1 - n, t) * x.pow(n, e)) }, cdf: function (t, e, n) { var r = 0, i = 0; if (t < 0) return 0; for (; i <= t; i++)r += _.negbin.pdf(i, e, n); return r } }), _.extend(_.hypgeom, { pdf: function (t, e, n, r) { if (t != t | 0) return !1; if (t < 0 || t < n - (e - r)) return 0; if (r < t || n < t) return 0; if (e < 2 * n) return e < 2 * r ? _.hypgeom.pdf(e - n - r + t, e, e - n, e - r) : _.hypgeom.pdf(r - t, e, e - n, r); if (e < 2 * r) return _.hypgeom.pdf(n - t, e, n, e - r); if (n < r) return _.hypgeom.pdf(t, e, r, n); for (var i = 1, o = 0, s = 0; s < t; s++) { for (; 1 < i && o < r;)i *= 1 - n / (e - o), o++; i *= (r - s) * (n - s) / ((s + 1) * (e - n - r + s + 1)) } for (; o < r; o++)i *= 1 - n / (e - o); return x.min(1, x.max(0, i)) }, cdf: function (t, e, n, r) { if (t < 0 || t < n - (e - r)) return 0; if (r <= t || n <= t) return 1; if (e < 2 * n) return e < 2 * r ? _.hypgeom.cdf(e - n - r + t, e, e - n, e - r) : 1 - _.hypgeom.cdf(r - t - 1, e, e - n, r); if (e < 2 * r) return 1 - _.hypgeom.cdf(n - t - 1, e, n, e - r); if (n < r) return _.hypgeom.cdf(t, e, r, n); for (var i = 1, o = 1, s = 0, a = 0; a < t; a++) { for (; 1 < i && s < r;) { var u = 1 - n / (e - s); o *= u, i *= u, s++ } i += o *= (r - a) * (n - a) / ((a + 1) * (e - n - r + a + 1)) } for (; s < r; s++)i *= 1 - n / (e - s); return x.min(1, x.max(0, i)) } }), _.extend(_.poisson, { pdf: function (t, e) { return e < 0 || t % 1 != 0 || t < 0 ? 0 : x.pow(e, t) * x.exp(-e) / _.factorial(t) }, cdf: function (t, e) { var n = [], r = 0; if (t < 0) return 0; for (; r <= t; r++)n.push(_.poisson.pdf(r, e)); return _.sum(n) }, mean: function (t) { return t }, variance: function (t) { return t }, sampleSmall: function (t) { for (var e = 1, n = 0, r = x.exp(-t); n++, e *= _._random_fn(), r < e;); return n - 1 }, sampleLarge: function (t) { for (var e, n, r, i = t, t = x.sqrt(i), o = x.log(i), s = .931 + 2.53 * t, a = .02483 * s - .059, u = 1.1239 + 1.1328 / (s - 3.4), c = .9277 - 3.6224 / (s - 2); ;) { if (e = x.random() - .5, n = x.random(), r = .5 - x.abs(e), e = x.floor((2 * a / r + s) * e + i + .43), .07 <= r && n <= c) return e; if (!(e < 0 || r < .013 && r < n) && x.log(n) + x.log(u) - x.log(a / (r * r) + s) <= e * o - i - _.loggam(e + 1)) return e } }, sample: function (t) { return t < 10 ? this.sampleSmall(t) : this.sampleLarge(t) } }), _.extend(_.triangular, { pdf: function (t, e, n, r) { return n <= e || r < e || n < r ? NaN : t < e || n < t ? 0 : t < r ? 2 * (t - e) / ((n - e) * (r - e)) : t === r ? 2 / (n - e) : 2 * (n - t) / ((n - e) * (n - r)) }, cdf: function (t, e, n, r) { return n <= e || r < e || n < r ? NaN : t <= e ? 0 : n <= t ? 1 : t <= r ? x.pow(t - e, 2) / ((n - e) * (r - e)) : 1 - x.pow(n - t, 2) / ((n - e) * (n - r)) }, inv: function (t, e, n, r) { return n <= e || r < e || n < r ? NaN : t <= (r - e) / (n - e) ? e + (n - e) * x.sqrt(t * ((r - e) / (n - e))) : e + (n - e) * (1 - x.sqrt((1 - t) * (1 - (r - e) / (n - e)))) }, mean: function (t, e, n) { return (t + e + n) / 3 }, median: function (t, e, n) { return n <= (t + e) / 2 ? e - x.sqrt((e - t) * (e - n)) / x.sqrt(2) : (t + e) / 2 < n ? t + x.sqrt((e - t) * (n - t)) / x.sqrt(2) : void 0 }, mode: function (t, e, n) { return n }, sample: function (t, e, n) { var r = _._random_fn(); return r < (n - t) / (e - t) ? t + x.sqrt(r * (e - t) * (n - t)) : e - x.sqrt((1 - r) * (e - t) * (e - n)) }, variance: function (t, e, n) { return (t * t + e * e + n * n - t * e - t * n - e * n) / 18 } }), _.extend(_.arcsine, { pdf: function (t, e, n) { return n <= e ? NaN : t <= e || n <= t ? 0 : 2 / x.PI * x.pow(x.pow(n - e, 2) - x.pow(2 * t - e - n, 2), -.5) }, cdf: function (t, e, n) { return t < e ? 0 : t < n ? 2 / x.PI * x.asin(x.sqrt((t - e) / (n - e))) : 1 }, inv: function (t, e, n) { return e + (.5 - .5 * x.cos(x.PI * t)) * (n - e) }, mean: function (t, e) { return e <= t ? NaN : (t + e) / 2 }, median: function (t, e) { return e <= t ? NaN : (t + e) / 2 }, mode: function () { throw new Error("mode is not yet implemented") }, sample: function (t, e) { return (t + e) / 2 + (e - t) / 2 * x.sin(2 * x.PI * _.uniform.sample(0, 1)) }, variance: function (t, e) { return e <= t ? NaN : x.pow(e - t, 2) / 8 } }), _.extend(_.laplace, { pdf: function (t, e, n) { return n <= 0 ? 0 : x.exp(-x.abs(t - e) / n) / (2 * n) }, cdf: function (t, e, n) { return n <= 0 ? 0 : t < e ? .5 * x.exp((t - e) / n) : 1 - .5 * x.exp(-(t - e) / n) }, mean: function (t) { return t }, median: function (t) { return t }, mode: function (t) { return t }, variance: function (t, e) { return 2 * e * e }, sample: function (t, e) { var n = _._random_fn() - .5; return t - e * ((e = n) / x.abs(e)) * x.log(1 - 2 * x.abs(n)) } }), _.extend(_.tukey, { cdf: function (t, e, n) { var r = e, i = [.9894009349916499, .9445750230732326, .8656312023878318, .755404408355003, .6178762444026438, .45801677765722737, .2816035507792589, .09501250983763744], o = [.027152459411754096, .062253523938647894, .09515851168249279, .12462897125553388, .14959598881657674, .16915651939500254, .18260341504492358, .1894506104550685]; if (t <= 0) return 0; if (n < 2 || r < 2) return NaN; if (!Number.isFinite(t)) return 1; if (25e3 < n) return v(t, 1, r); var e = .5 * n, s = e * x.log(n) - n * x.log(2) - _.gammaln(e), a = e - 1, u = .25 * n, c = n <= 100 ? 1 : n <= 800 ? .5 : n <= 5e3 ? .25 : .125; s += x.log(c); for (var l = 0, h = 1; h <= 50; h++) { for (var f = 0, p = (2 * h - 1) * c, d = 1; d <= 16; d++) { var g, m = 8 < d ? (g = d - 8 - 1, s + a * x.log(p + i[g] * c) - (i[g] * c + p) * u) : (g = d - 1, s + a * x.log(p - i[g] * c) + (i[g] * c - p) * u); -30 <= m && (f += v(8 < d ? t * x.sqrt(.5 * (i[g] * c + p)) : t * x.sqrt(.5 * (-i[g] * c + p)), 1, r) * o[g] * x.exp(m)) } if (1 <= h * c && f <= 1e-14) break; l += f } if (1e-14 < f) throw new Error("tukey.cdf failed to converge"); return 1 < l && (l = 1), l }, inv: function (t, e, n) { if (n < 2 || e < 2) return NaN; if (t < 0 || 1 < t) return NaN; if (0 === t) return 0; if (1 === t) return 1 / 0; for (var r, i, o, s, a = (i = e, o = n, s = .5 - .5 * (r = t), s = (r = x.sqrt(x.log(1 / (s * s)))) + ((((-453642210148e-16 * r - .204231210125) * r - .342242088547) * r - 1) * r + .322232421088) / ((((.0038560700634 * r + .10353775285) * r + .531103462366) * r + .588581570495) * r + .099348462606), o < 120 && (s += (s * s * s + s) / o / 4), r = .8832 - .2368 * s, o < 120 && (r += -1.214 / o + 1.208 * s / o), s * (r * x.log(i - 1) + 1.4142)), u = 0 < (f = _.tukey.cdf(a, e, n) - t) ? x.max(0, a - 1) : a + 1, c = _.tukey.cdf(u, e, n) - t, l = 1; l < 50; l++) { var h = u - c * (u - a) / (c - f), f = c, a = u; if (h < 0 && (h = 0, c = -t), c = _.tukey.cdf(h, e, n) - t, u = h, x.abs(u - a) < 1e-4) return h } throw new Error("tukey.inv failed to converge") } }), m = f, g = Math, i = Array.prototype.push, e = m.utils.isArray, m.extend({ add: function (t, r) { return y(r) ? (y(r[0]) || (r = [r]), m.map(t, function (t, e, n) { return t + r[e][n] })) : m.map(t, function (t) { return t + r }) }, subtract: function (t, r) { return y(r) ? (y(r[0]) || (r = [r]), m.map(t, function (t, e, n) { return t - r[e][n] || 0 })) : m.map(t, function (t) { return t - r }) }, divide: function (t, e) { return y(e) ? (y(e[0]) || (e = [e]), m.multiply(t, m.inv(e))) : m.map(t, function (t) { return t / e }) }, multiply: function (t, e) { var n, r, i, o, s, a, u, c; if (void 0 === t.length && void 0 === e.length) return t * e; if (s = t.length, a = t[0].length, u = m.zeros(s, i = y(e) ? e[0].length : a), c = 0, y(e)) { for (; c < i; c++)for (n = 0; n < s; n++) { for (r = o = 0; r < a; r++)o += t[n][r] * e[r][c]; u[n][c] = o } return 1 === s && 1 === c ? u[0][0] : u } return m.map(t, function (t) { return t * e }) }, outer: function (t, e) { return m.multiply(t.map(function (t) { return [t] }), [e]) }, dot: function (t, e) { y(t[0]) || (t = [t]), y(e[0]) || (e = [e]); for (var n, r, i = 1 === t[0].length && 1 !== t.length ? m.transpose(t) : t, o = 1 === e[0].length && 1 !== e.length ? m.transpose(e) : e, s = [], a = 0, u = i.length, c = i[0].length; a < u; a++) { for (s[a] = [], r = n = 0; r < c; r++)n += i[a][r] * o[a][r]; s[a] = n } return 1 === s.length ? s[0] : s }, pow: function (t, e) { return m.map(t, function (t) { return g.pow(t, e) }) }, exp: function (t) { return m.map(t, function (t) { return g.exp(t) }) }, log: function (t) { return m.map(t, function (t) { return g.log(t) }) }, abs: function (t) { return m.map(t, function (t) { return g.abs(t) }) }, norm: function (t, e) { var n = 0, r = 0; for (isNaN(e) && (e = 2), y(t[0]) && (t = t[0]); r < t.length; r++)n += g.pow(g.abs(t[r]), e); return g.pow(n, 1 / e) }, angle: function (t, e) { return g.acos(m.dot(t, e) / (m.norm(t) * m.norm(e))) }, aug: function (t, e) { for (var n = [], r = 0; r < t.length; r++)n.push(t[r].slice()); for (r = 0; r < n.length; r++)i.apply(n[r], e[r]); return n }, inv: function (t) { for (var e, n = t.length, r = t[0].length, i = m.identity(n, r), o = m.gauss_jordan(t, i), s = [], a = 0; a < n; a++)for (s[a] = [], e = r; e < o[0].length; e++)s[a][e - r] = o[a][e]; return s }, det: function (t) { var e, n = t.length, r = 2 * n, i = new Array(r), o = n - 1, s = r - 1, a = o - n + 1, u = s, c = 0, l = 0; if (2 === n) return t[0][0] * t[1][1] - t[0][1] * t[1][0]; for (; c < r; c++)i[c] = 1; for (c = 0; c < n; c++) { for (e = 0; e < n; e++)i[a < 0 ? a + n : a] *= t[c][e], i[u < n ? u + n : u] *= t[c][e], a++, u--; a = --o - n + 1, u = --s } for (c = 0; c < n; c++)l += i[c]; for (; c < r; c++)l -= i[c]; return l }, gauss_elimination: function (t, e) { for (var n, r, i, o, s = 0, a = 0, u = t.length, c = t[0].length, l = 0, h = [], f = (t = m.aug(t, e))[0].length, s = 0; s < u; s++) { for (r = t[s][s], o = (a = s) + 1; o < c; o++)r < g.abs(t[o][s]) && (r = t[o][s], a = o); if (a != s) for (o = 0; o < f; o++)i = t[s][o], t[s][o] = t[a][o], t[a][o] = i; for (a = s + 1; a < u; a++)for (n = t[a][s] / t[s][s], o = s; o < f; o++)t[a][o] = t[a][o] - n * t[s][o] } for (s = u - 1; 0 <= s; s--) { for (l = 0, a = s + 1; a <= u - 1; a++)l += h[a] * t[s][a]; h[s] = (t[s][f - 1] - l) / t[s][s] } return h }, gauss_jordan: function (t, e) { for (var n, r = m.aug(t, e), i = r.length, o = r[0].length, s = 0, a = 0; a < i; a++) { for (var u = a, c = a + 1; c < i; c++)g.abs(r[c][a]) > g.abs(r[u][a]) && (u = c); var l = r[a]; for (r[a] = r[u], r[u] = l, c = a + 1; c < i; c++)for (s = r[c][a] / r[a][a], n = a; n < o; n++)r[c][n] -= r[a][n] * s } for (a = i - 1; 0 <= a; a--) { for (s = r[a][a], c = 0; c < a; c++)for (n = o - 1; a - 1 < n; n--)r[c][n] -= r[a][n] * r[c][a] / s; for (r[a][a] /= s, n = i; n < o; n++)r[a][n] /= s } return r }, triaUpSolve: function (n, t) { var r, i = n[0].length, o = m.zeros(1, i)[0], e = !1; return null != t[0].length && (t = t.map(function (t) { return t[0] }), e = !0), m.arange(i - 1, -1, -1).forEach(function (e) { r = m.arange(e + 1, i).map(function (t) { return o[t] * n[e][t] }), o[e] = (t[e] - m.sum(r)) / n[e][e] }), e ? o.map(function (t) { return [t] }) : o }, triaLowSolve: function (n, t) { var r, e = n[0].length, i = m.zeros(1, e)[0], o = !1; return null != t[0].length && (t = t.map(function (t) { return t[0] }), o = !0), m.arange(e).forEach(function (e) { r = m.arange(e).map(function (t) { return n[e][t] * i[t] }), i[e] = (t[e] - m.sum(r)) / n[e][e] }), o ? i.map(function (t) { return [t] }) : i }, lu: function (r) { var t, e = r.length, i = m.identity(e), o = m.zeros(r.length, r[0].length); return m.arange(e).forEach(function (t) { o[0][t] = r[0][t] }), m.arange(1, e).forEach(function (n) { m.arange(n).forEach(function (e) { t = m.arange(e).map(function (t) { return i[n][t] * o[t][e] }), i[n][e] = (r[n][e] - m.sum(t)) / o[e][e] }), m.arange(n, e).forEach(function (e) { t = m.arange(n).map(function (t) { return i[n][t] * o[t][e] }), o[n][e] = r[t.length][e] - m.sum(t) }) }), [i, o] }, cholesky: function (t) { var r, e = t.length, i = m.zeros(t.length, t[0].length); return m.arange(e).forEach(function (n) { r = m.arange(n).map(function (t) { return g.pow(i[n][t], 2) }), i[n][n] = g.sqrt(t[n][n] - m.sum(r)), m.arange(n + 1, e).forEach(function (e) { r = m.arange(n).map(function (t) { return i[n][t] * i[e][t] }), i[e][n] = (t[n][e] - m.sum(r)) / i[n][n] }) }), i }, gauss_jacobi: function (t, e, n, r) { for (var i, o, s, a, u = 0, c = 0, l = t.length, h = [], f = [], p = []; u < l; u++)for (h[u] = [], f[u] = [], p[u] = [], c = 0; c < l; c++)c < u ? (h[u][c] = t[u][c], f[u][c] = p[u][c] = 0) : u < c ? (f[u][c] = t[u][c], h[u][c] = p[u][c] = 0) : (p[u][c] = t[u][c], h[u][c] = f[u][c] = 0); for (s = m.multiply(m.multiply(m.inv(p), m.add(h, f)), -1), o = m.multiply(m.inv(p), e), i = n, a = m.add(m.multiply(s, n), o), u = 2; g.abs(m.norm(m.subtract(a, i))) > r;)i = a, a = m.add(m.multiply(s, i), o), u++; return a }, gauss_seidel: function (t, e, n, r) { for (var i, o, s, a, u, c = 0, l = t.length, h = [], f = [], p = []; c < l; c++)for (h[c] = [], f[c] = [], p[c] = [], i = 0; i < l; i++)i < c ? (h[c][i] = t[c][i], f[c][i] = p[c][i] = 0) : c < i ? (f[c][i] = t[c][i], h[c][i] = p[c][i] = 0) : (p[c][i] = t[c][i], h[c][i] = f[c][i] = 0); for (a = m.multiply(m.multiply(m.inv(m.add(p, h)), f), -1), s = m.multiply(m.inv(m.add(p, h)), e), o = n, u = m.add(m.multiply(a, n), s), c = 2; g.abs(m.norm(m.subtract(u, o))) > r;)o = u, u = m.add(m.multiply(a, o), s), c += 1; return u }, SOR: function (t, e, n, r, i) { for (var o, s, a, u, c, l = 0, h = t.length, f = [], p = [], d = []; l < h; l++)for (f[l] = [], p[l] = [], d[l] = [], o = 0; o < h; o++)o < l ? (f[l][o] = t[l][o], p[l][o] = d[l][o] = 0) : l < o ? (p[l][o] = t[l][o], f[l][o] = d[l][o] = 0) : (d[l][o] = t[l][o], f[l][o] = p[l][o] = 0); for (u = m.multiply(m.inv(m.add(d, m.multiply(f, i))), m.subtract(m.multiply(d, 1 - i), m.multiply(p, i))), a = m.multiply(m.multiply(m.inv(m.add(d, m.multiply(f, i))), e), i), s = n, c = m.add(m.multiply(u, n), a), l = 2; g.abs(m.norm(m.subtract(c, s))) > r;)s = c, c = m.add(m.multiply(u, s), a), l++; return c }, householder: function (t) { for (var e, n, r, i, o, s = t.length, a = t[0].length, u = 0, c = []; u < s - 1; u++) { for (n = 0, o = u + 1; o < a; o++)n += t[o][u] * t[o][u]; for (n = (0 < t[u + 1][u] ? -1 : 1) * g.sqrt(n), r = g.sqrt((n * n - t[u + 1][u] * n) / 2), (c = m.zeros(s, 1))[u + 1][0] = (t[u + 1][u] - n) / (2 * r), i = u + 2; i < s; i++)c[i][0] = t[i][u] / (2 * r); e = m.subtract(m.identity(s, a), m.multiply(m.multiply(c, m.transpose(c)), 2)), t = m.multiply(e, m.multiply(t, e)) } return t }, QR: (a = m.sum, u = m.arange, function (e) { var t, n, r, i = e.length, o = e[0].length, s = m.zeros(o, o); for (e = m.copy(e), n = 0; n < o; n++) { for (s[n][n] = g.sqrt(a(u(i).map(function (t) { return e[t][n] * e[t][n] }))), t = 0; t < i; t++)e[t][n] = e[t][n] / s[n][n]; for (r = n + 1; r < o; r++)for (s[n][r] = a(u(i).map(function (t) { return e[t][n] * e[t][r] })), t = 0; t < i; t++)e[t][r] = e[t][r] - e[t][n] * s[n][r] } return [e, s] }), lstsq: function (t, e) { var n = !1; void 0 === e[0].length && (e = e.map(function (t) { return [t] }), n = !0); var o, s, r = (i = m.QR(t))[0], i = i[1], t = t[0].length, r = m.slice(r, { col: { end: t } }), t = m.slice(i, { row: { end: t } }), t = (o = t, t = (o = m.copy(o)).length, s = m.identity(t), m.arange(t - 1, -1, -1).forEach(function (i) { m.sliceAssign(s, { row: i }, m.divide(m.slice(s, { row: i }), o[i][i])), m.sliceAssign(o, { row: i }, m.divide(m.slice(o, { row: i }), o[i][i])), m.arange(i).forEach(function (t) { var e = m.multiply(o[t][i], -1), n = m.slice(o, { row: t }), r = m.multiply(m.slice(o, { row: i }), e); m.sliceAssign(o, { row: t }, m.add(n, r)); r = m.slice(s, { row: t }), e = m.multiply(m.slice(s, { row: i }), e); m.sliceAssign(s, { row: t }, m.add(r, e)) }) }), s); return void 0 === (r = m.transpose(r))[0].length && (r = [r]), void 0 === (e = m.multiply(m.multiply(t, r), e)).length && (e = [[e]]), n ? e.map(function (t) { return t[0] }) : e }, jacobi: function (t) { for (var e, n, r, i, o, s, a, u = 1, c = t.length, l = m.identity(c, c), h = []; 1 === u;) { for (o = t[0][1], i = 1, e = r = 0; e < c; e++)for (n = 0; n < c; n++)e != n && o < g.abs(t[e][n]) && (o = g.abs(t[e][n]), r = e, i = n); for (s = t[r][r] === t[i][i] ? 0 < t[r][i] ? g.PI / 4 : -g.PI / 4 : g.atan(2 * t[r][i] / (t[r][r] - t[i][i])) / 2, (a = m.identity(c, c))[r][r] = g.cos(s), a[r][i] = -g.sin(s), a[i][r] = g.sin(s), a[i][i] = g.cos(s), l = m.multiply(l, a), t = m.multiply(m.multiply(m.inv(a), t), a), u = 0, e = 1; e < c; e++)for (n = 1; n < c; n++)e != n && .001 < g.abs(t[e][n]) && (u = 1) } for (e = 0; e < c; e++)h.push(t[e][e]); return [l, h] }, rungekutta: function (t, e, n, r, i, o) { var s, a, u; if (2 === o) for (; r <= n;)i = i + ((s = e * t(r, i)) + (a = e * t(r + e, i + s))) / 2, r += e; if (4 === o) for (; r <= n;)i = i + ((s = e * t(r, i)) + 2 * (a = e * t(r + e / 2, i + s / 2)) + 2 * (u = e * t(r + e / 2, i + a / 2)) + e * t(r + e, i + u)) / 6, r += e; return i }, romberg: function (t, e, n, r) { for (var i, o, s, a, u, c = 0, l = (n - e) / 2, h = [], f = [], p = []; c < r / 2;) { for (u = t(e), s = e, a = 0; s <= n; s += l, a++)h[a] = s; for (i = h.length, s = 1; s < i - 1; s++)u += (s % 2 != 0 ? 4 : 2) * t(h[s]); u = l / 3 * (u + t(n)), p[c] = u, l /= 2, c++ } for (o = p.length, i = 1; 1 !== o;) { for (s = 0; s < o - 1; s++)f[s] = (g.pow(4, i) * p[s + 1] - p[s]) / (g.pow(4, i) - 1); o = f.length, p = f, f = [], i++ } return p }, richardson: function (t, e, n, r) { function i(t, e) { for (var n, r = 0, i = t.length; r < i; r++)t[r] === e && (n = r); return n } for (var o, s, a, u, c, l = g.abs(n - t[i(t, n) + 1]), h = 0, f = [], p = []; l <= r;)o = i(t, n + r), s = i(t, n), f[h] = (e[o] - 2 * e[s] + e[2 * s - o]) / (r * r), r /= 2, h++; for (u = f.length, a = 1; 1 != u;) { for (c = 0; c < u - 1; c++)p[c] = (g.pow(4, a) * f[c + 1] - f[c]) / (g.pow(4, a) - 1); u = p.length, f = p, p = [], a++ } return f }, simpson: function (t, e, n, r) { for (var i, o = (n - e) / r, s = t(e), a = [], u = e, c = 0, l = 1; u <= n; u += o, c++)a[c] = u; for (i = a.length; l < i - 1; l++)s += (l % 2 != 0 ? 4 : 2) * t(a[l]); return o / 3 * (s + t(n)) }, hermite: function (t, e, n, r) { for (var i, o = t.length, s = 0, a = 0, u = [], c = [], l = [], h = []; a < o; a++) { for (u[a] = 1, i = 0; i < o; i++)a != i && (u[a] *= (r - t[i]) / (t[a] - t[i])); for (i = c[a] = 0; i < o; i++)a != i && (c[a] += 1 / (t[a] - t[i])); l[a] = (1 - 2 * (r - t[a]) * c[a]) * (u[a] * u[a]), h[a] = (r - t[a]) * (u[a] * u[a]), s += l[a] * e[a] + h[a] * n[a] } return s }, lagrange: function (t, e, n) { for (var r, i, o = 0, s = 0, a = t.length; s < a; s++) { for (i = e[s], r = 0; r < a; r++)s != r && (i *= (n - t[r]) / (t[s] - t[r])); o += i } return o }, cubic_spline: function (t, e, n) { for (var r, i, o = t.length, s = 0, a = [], u = [], c = [], l = [], h = [], f = []; s < o - 1; s++)l[s] = t[s + 1] - t[s]; for (c[0] = 0, s = 1; s < o - 1; s++)c[s] = 3 / l[s] * (e[s + 1] - e[s]) - 3 / l[s - 1] * (e[s] - e[s - 1]); for (s = 1; s < o - 1; s++)a[s] = [], u[s] = [], a[s][s - 1] = l[s - 1], a[s][s] = 2 * (l[s - 1] + l[s]), a[s][s + 1] = l[s], u[s][0] = c[s]; for (i = m.multiply(m.inv(a), u), r = 0; r < o - 1; r++)h[r] = (e[r + 1] - e[r]) / l[r] - l[r] * (i[r + 1][0] + 2 * i[r][0]) / 3, f[r] = (i[r + 1][0] - i[r][0]) / (3 * l[r]); for (r = 0; r < o && !(t[r] > n); r++); return e[--r] + (n - t[r]) * h[r] + m.sq(n - t[r]) * i[r] + (n - t[r]) * m.sq(n - t[r]) * f[r] }, gauss_quadrature: function () { throw new Error("gauss_quadrature not yet implemented") }, PCA: function (t) { for (var e, n, r, i, o, s, a = t.length, u = t[0].length, c = 0, l = [], h = [], f = [], p = [], d = [], g = [], c = 0; c < a; c++)l[c] = m.sum(t[c]) / u; for (c = 0; c < u; c++)for (p[c] = [], e = 0; e < a; e++)p[c][e] = t[e][c] - l[e]; for (p = m.transpose(p), c = 0; c < a; c++)for (d[c] = [], e = 0; e < a; e++)d[c][e] = m.dot([p[c]], [p[e]]) / (u - 1); for (s = (r = m.jacobi(d))[0], h = r[1], g = m.transpose(s), c = 0; c < h.length; c++)for (e = c; e < h.length; e++)h[c] < h[e] && (n = h[c], h[c] = h[e], h[e] = n, i = g[c], g[c] = g[e], g[e] = i); for (o = m.transpose(p), c = 0; c < a; c++)for (f[c] = [], e = 0; e < o.length; e++)f[c][e] = m.dot([g[c]], [o[e]]); return [t, h, g, f] } }), function (t) { for (var e = 0; e < t.length; e++)!function (r) { m.fn[r] = function (t, e) { var n = this; return e ? (setTimeout(function () { e.call(n, m.fn[r].call(n, t)) }, 15), this) : "number" == typeof m[r](this, t) ? m[r](this, t) : m(m[r](this, t)) } }(t[e]) }("add divide multiply subtract dot pow exp log abs norm angle".split(" ")), c = f, l = Math, h = [].slice, s = c.utils.isNumber, n = c.utils.isArray, c.extend({ zscore: function () { var t = h.call(arguments); return s(t[1]) ? (t[0] - t[1]) / t[2] : (t[0] - c.mean(t[1])) / c.stdev(t[1], t[2]) }, ztest: function () { var t, e = h.call(arguments); return n(e[1]) ? (t = c.zscore(e[0], e[1], e[3]), 1 === e[2] ? c.normal.cdf(-l.abs(t), 0, 1) : 2 * c.normal.cdf(-l.abs(t), 0, 1)) : 2 < e.length ? (t = c.zscore(e[0], e[1], e[2]), 1 === e[3] ? c.normal.cdf(-l.abs(t), 0, 1) : 2 * c.normal.cdf(-l.abs(t), 0, 1)) : (t = e[0], 1 === e[1] ? c.normal.cdf(-l.abs(t), 0, 1) : 2 * c.normal.cdf(-l.abs(t), 0, 1)) } }), c.extend(c.fn, { zscore: function (t, e) { return (t - this.mean()) / this.stdev(e) }, ztest: function (t, e, n) { n = l.abs(this.zscore(t, n)); return 1 === e ? c.normal.cdf(-n, 0, 1) : 2 * c.normal.cdf(-n, 0, 1) } }), c.extend({ tscore: function () { var t = h.call(arguments); return 4 === t.length ? (t[0] - t[1]) / (t[2] / l.sqrt(t[3])) : (t[0] - c.mean(t[1])) / (c.stdev(t[1], !0) / l.sqrt(t[1].length)) }, ttest: function () { var t, e = h.call(arguments); return 5 === e.length ? (t = l.abs(c.tscore(e[0], e[1], e[2], e[3])), 1 === e[4] ? c.studentt.cdf(-t, e[3] - 1) : 2 * c.studentt.cdf(-t, e[3] - 1)) : s(e[1]) ? (t = l.abs(e[0]), 1 == e[2] ? c.studentt.cdf(-t, e[1] - 1) : 2 * c.studentt.cdf(-t, e[1] - 1)) : (t = l.abs(c.tscore(e[0], e[1])), 1 == e[2] ? c.studentt.cdf(-t, e[1].length - 1) : 2 * c.studentt.cdf(-t, e[1].length - 1)) } }), c.extend(c.fn, { tscore: function (t) { return (t - this.mean()) / (this.stdev(!0) / l.sqrt(this.cols())) }, ttest: function (t, e) { return 1 === e ? 1 - c.studentt.cdf(l.abs(this.tscore(t)), this.cols() - 1) : 2 * c.studentt.cdf(-l.abs(this.tscore(t)), this.cols() - 1) } }), c.extend({ anovafscore: function () { var t, e, n, r, i, o, s, a, u = h.call(arguments); if (1 === u.length) { for (i = new Array(u[0].length), s = 0; s < u[0].length; s++)i[s] = u[0][s]; u = i } for (e = new Array, s = 0; s < u.length; s++)e = e.concat(u[s]); for (n = c.mean(e), s = t = 0; s < u.length; s++)t += u[s].length * l.pow(c.mean(u[s]) - n, 2); for (t /= u.length - 1, s = o = 0; s < u.length; s++)for (r = c.mean(u[s]), a = 0; a < u[s].length; a++)o += l.pow(u[s][a] - r, 2); return t / (o /= e.length - u.length) }, anovaftest: function () { var t, e = h.call(arguments); if (s(e[0])) return 1 - c.centralF.cdf(e[0], e[1], e[2]); for (var n = c.anovafscore(e), r = e.length - 1, i = 0, o = 0; o < e.length; o++)i += e[o].length; return t = i - r - 1, 1 - c.centralF.cdf(n, r, t) }, ftest: function (t, e, n) { return 1 - c.centralF.cdf(t, e, n) } }), c.extend(c.fn, { anovafscore: function () { return c.anovafscore(this.toArray()) }, anovaftes: function () { for (var t = 0, e = 0; e < this.length; e++)t += this[e].length; return c.ftest(this.anovafscore(), this.length - 1, t - this.length) } }), c.extend({ qscore: function () { var t, e, n, r, i = h.call(arguments), i = s(i[0]) ? (t = i[0], e = i[1], n = i[2], r = i[3], i[4]) : (t = c.mean(i[0]), e = c.mean(i[1]), n = i[0].length, r = i[1].length, i[2]); return l.abs(t - e) / (i * l.sqrt((1 / n + 1 / r) / 2)) }, qtest: function () { var t, e = h.call(arguments), n = (e = 3 === e.length ? (t = e[0], e.slice(1)) : 7 === e.length ? (t = c.qscore(e[0], e[1], e[2], e[3], e[4]), e.slice(5)) : (t = c.qscore(e[0], e[1], e[2]), e.slice(3)))[0], e = e[1]; return 1 - c.tukey.cdf(t, e, n - e) }, tukeyhsd: function (t) { for (var e = c.pooledstdev(t), n = t.map(function (t) { return c.mean(t) }), r = t.reduce(function (t, e) { return t + e.length }, 0), i = [], o = 0; o < t.length; ++o)for (var s = o + 1; s < t.length; ++s) { var a = c.qtest(n[o], n[s], t[o].length, t[s].length, e, r, t.length); i.push([[o, s], a]) } return i } }), c.extend({ normalci: function () { var t = h.call(arguments), e = new Array(2), n = 4 === t.length ? l.abs(c.normal.inv(t[1] / 2, 0, 1) * t[2] / l.sqrt(t[3])) : l.abs(c.normal.inv(t[1] / 2, 0, 1) * c.stdev(t[2]) / l.sqrt(t[2].length)); return e[0] = t[0] - n, e[1] = t[0] + n, e }, tci: function () { var t = h.call(arguments), e = new Array(2), n = 4 === t.length ? l.abs(c.studentt.inv(t[1] / 2, t[3] - 1) * t[2] / l.sqrt(t[3])) : l.abs(c.studentt.inv(t[1] / 2, t[2].length - 1) * c.stdev(t[2], !0) / l.sqrt(t[2].length)); return e[0] = t[0] - n, e[1] = t[0] + n, e }, significant: function (t, e) { return t < e } }), c.extend(c.fn, { normalci: function (t, e) { return c.normalci(t, e, this.toArray()) }, tci: function (t, e) { return c.tci(t, e, this.toArray()) } }), c.extend(c.fn, { oneSidedDifferenceOfProportions: function (t, e, n, r) { r = b(t, e, n, r); return c.ztest(r, 1) }, twoSidedDifferenceOfProportions: function (t, e, n, r) { r = b(t, e, n, r); return c.ztest(r, 2) } }), f.models = { ols: function (t, e) { var n = w(t, e), r = C(n), t = { F_statistic: t = (i = n).R2 / i.df_model / ((1 - i.R2) / i.df_resid), pvalue: 1 - (e = t, t = i.df_model, i = i.df_resid, f.beta.cdf(e / (i / t + e), t / 2, i / 2)) }, i = 1 - (1 - n.R2) * ((n.nobs - 1) / n.df_resid); return n.t = r, n.f = t, n.adjust_R2 = i, n } }, f.extend({ buildxmatrix: function () { for (var t = new Array(arguments.length), e = 0; e < arguments.length; e++)t[e] = [1].concat(arguments[e]); return f(t) }, builddxmatrix: function (t) { for (var e = new Array(t.length), n = 0; n < t.length; n++)e[n] = [1].concat(t[n]); return f(e) }, buildjxmatrix: function (t) { for (var e = new Array(t.length), n = 0; n < t.length; n++)e[n] = t[n]; return f.builddxmatrix(e) }, buildymatrix: function (t) { return f(t).transpose() }, buildjymatrix: function (t) { return t.transpose() }, matrixmult: function (t, e) { var n, r, i, o, s; if (t.cols() == e.rows()) { if (1 < e.rows()) { for (o = [], n = 0; n < t.rows(); n++)for (o[n] = [], r = 0; r < e.cols(); r++) { for (i = s = 0; i < t.cols(); i++)s += t.toArray()[n][i] * e.toArray()[i][r]; o[n][r] = s } return f(o) } for (o = [], n = 0; n < t.rows(); n++)for (o[n] = [], r = 0; r < e.cols(); r++) { for (i = s = 0; i < t.cols(); i++)s += t.toArray()[n][i] * e.toArray()[r]; o[n][r] = s } return f(o) } }, regress: function (t, e) { var n = f.xtranspxinv(t), t = t.transpose(), t = f.matrixmult(f(n), t); return f.matrixmult(t, e) }, regresst: function (t, e, n) { var r = f.regress(t, e), i = { anova: {} }, o = f.jMatYBar(t, r); i.yBar = o; var s = e.mean(); i.anova.residuals = f.residuals(e, o), i.anova.ssr = f.ssr(o, s), i.anova.msr = i.anova.ssr / (t[0].length - 1), i.anova.sse = f.sse(e, o), i.anova.mse = i.anova.sse / (e.length - (t[0].length - 1) - 1), i.anova.sst = f.sst(e, s), i.anova.mst = i.anova.sst / (e.length - 1), i.anova.r2 = 1 - i.anova.sse / i.anova.sst, i.anova.r2 < 0 && (i.anova.r2 = 0), i.anova.fratio = i.anova.msr / i.anova.mse, i.anova.pvalue = f.anovaftest(i.anova.fratio, t[0].length - 1, e.length - (t[0].length - 1) - 1), i.anova.rmse = Math.sqrt(i.anova.mse), i.anova.r2adj = 1 - i.anova.mse / i.anova.mst, i.anova.r2adj < 0 && (i.anova.r2adj = 0), i.stats = new Array(t[0].length); for (var a, u, c, l = f.xtranspxinv(t), h = 0; h < r.length; h++)a = Math.sqrt(i.anova.mse * Math.abs(l[h][h])), u = Math.abs(r[h] / a), c = f.ttest(u, e.length - t[0].length - 1, n), i.stats[h] = [r[h], a, u, c]; return i.regress = r, i }, xtranspx: function (t) { return f.matrixmult(t.transpose(), t) }, xtranspxinv: function (t) { t = f.matrixmult(t.transpose(), t); return f.inv(t) }, jMatYBar: function (t, e) { e = f.matrixmult(t, e); return new f(e) }, residuals: function (t, e) { return f.matrixsubtract(t, e) }, ssr: function (t, e) { for (var n = 0, r = 0; r < t.length; r++)n += Math.pow(t[r] - e, 2); return n }, sse: function (t, e) { for (var n = 0, r = 0; r < t.length; r++)n += Math.pow(t[r] - e[r], 2); return n }, sst: function (t, e) { for (var n = 0, r = 0; r < t.length; r++)n += Math.pow(t[r] - e, 2); return n }, matrixsubtract: function (t, e) { for (var n = new Array(t.length), r = 0; r < t.length; r++) { n[r] = new Array(t[r].length); for (var i = 0; i < t[r].length; i++)n[r][i] = t[r][i] - e[r][i] } return f(n) } }), f.jStat = f }); var CryptoApi = function (n) { var r = {}; function i(t) { if (r[t]) return r[t].exports; var e = r[t] = { i: t, l: !1, exports: {} }; return n[t].call(e.exports, e, e.exports, i), e.l = !0, e.exports } return i.m = n, i.c = r, i.d = function (t, e, n) { i.o(t, e) || Object.defineProperty(t, e, { enumerable: !0, get: n }) }, 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 (e, t) { if (1 & t && (e = i(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var n = Object.create(null); if (i.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var r in e) i.d(n, r, function (t) { return e[t] }.bind(null, r)); return n }, 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 = 29) }([function (t, e, n) { "use strict"; function r(t, e) { return t << e | t >>> 32 - e | 0 } function i(t, e) { return t >>> e | t << 32 - e | 0 } function o(t, e, n) { return 32 === n ? e : 32 < n ? o(e, t, n - 32) : 4294967295 & (t >>> n | e << 32 - n) } function s(t, e, n) { return 32 === n ? t : 32 < n ? s(e, t, n - 32) : 4294967295 & (e >>> n | t << 32 - n) } n.d(e, "a", function () { return r }), n.d(e, "b", function () { return i }), n.d(e, "d", function () { return s }), n.d(e, "c", function () { return o }) }, function (t, e, n) { "use strict"; function r(t) { for (var e = "", n = 0, r = t.length; n < r; n++) { var i = t.charCodeAt(n); i < 128 ? e += String.fromCharCode(i) : (i < 2048 ? e += String.fromCharCode(192 | i >> 6) : (i < 55296 || 57344 <= i ? e += String.fromCharCode(224 | i >> 12) : (n++, i = 65536 + ((1023 & i) << 10 | 1023 & t.charCodeAt(n)), e += String.fromCharCode(240 | i >> 18), e += String.fromCharCode(128 | i >> 12 & 63)), e += String.fromCharCode(128 | i >> 6 & 63)), e += String.fromCharCode(128 | 63 & i)) } return e } n.d(e, "a", function () { return r }) }, function (t, e, n) { "use strict"; function r(t) { for (var e = "", n = 0, r = t.length; n < r; n++)e += (t.charCodeAt(n) < 16 ? "0" : "") + t.charCodeAt(n).toString(16); return e } n.d(e, "a", function () { return r }) }, function (t, e, n) { "use strict"; function r(t) { return (r = "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 })(t) } function i(t) { return (i = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function o(t, e) { return (o = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && o(t, e) })(s, n(4).a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(s.prototype, [{ key: "process", value: function () { for (; this.state.message.length >= this.blockSizeInBytes;) { this.blockUnits = []; for (var t = 0; t < this.blockSizeInBytes; t += 4)this.blockUnits.push(this.state.message.charCodeAt(t) << 24 | this.state.message.charCodeAt(t + 1) << 16 | this.state.message.charCodeAt(t + 2) << 8 | this.state.message.charCodeAt(t + 3)); this.state.message = this.state.message.substr(this.blockSizeInBytes), this.processBlock(this.blockUnits) } } }, { key: "processBlock", value: function (t) { } }, { key: "getStateHash", value: function (t) { t = t || this.state.hash.length; for (var e = "", n = 0; n < t; n++)e += String.fromCharCode(this.state.hash[n] >> 24 & 255) + String.fromCharCode(this.state.hash[n] >> 16 & 255) + String.fromCharCode(this.state.hash[n] >> 8 & 255) + String.fromCharCode(255 & this.state.hash[n]); return e } }, { key: "addLengthBits", value: function () { this.state.message += "\0\0\0" + String.fromCharCode(this.state.length >> 29 & 255) + String.fromCharCode(this.state.length >> 21 & 255) + String.fromCharCode(this.state.length >> 13 & 255) + String.fromCharCode(this.state.length >> 5 & 255) + String.fromCharCode(this.state.length << 3 & 255) } }]), n = s; function s(t) { var e; return function (t) { if (!(t instanceof s)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = i(s).call(this, t)) || "object" !== r(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).unitOrder = 1, t.blockUnits = [], t } e.a = n }, function (t, e, n) { "use strict"; var r = (function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(i.prototype, [{ key: "reset", value: function () { this.state = {}, this.state.message = "", this.state.length = 0 } }, { key: "getState", value: function () { return JSON.parse(JSON.stringify(this.state)) } }, { key: "setState", value: function (t) { this.state = t } }, { key: "update", value: function (t) { this.state.message += t, this.state.length += t.length, this.process() } }, { key: "process", value: function () { } }, { key: "finalize", value: function () { return "" } }, { key: "getStateHash", value: function (t) { return "" } }, { key: "addPaddingPKCS7", value: function (t) { this.state.message += new Array(t + 1).join(String.fromCharCode(t)) } }, { key: "addPaddingISO7816", value: function (t) { this.state.message += "€" + new Array(t).join("\0") } }, { key: "addPaddingZero", value: function (t) { this.state.message += new Array(t + 1).join("\0") } }]), i); function i(t) { !function (t) { if (!(t instanceof i)) throw new TypeError("Cannot call a class as a function") }(this), this.unitSize = 4, this.unitOrder = 0, this.blockSize = 16, this.blockSizeInBytes = this.blockSize * this.unitSize, this.options = t || {}, this.reset() } e.a = r }, function (t, e, n) { "use strict"; function r(t) { return (r = "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 })(t) } function i(t) { return (i = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function o(t, e) { return (o = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && o(t, e) })(s, n(4).a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(s.prototype, [{ key: "process", value: function () { for (; this.state.message.length >= this.blockSizeInBytes;) { this.blockUnits = []; for (var t = 0; t < this.blockSizeInBytes; t += 4)this.blockUnits.push(this.state.message.charCodeAt(t) | this.state.message.charCodeAt(t + 1) << 8 | this.state.message.charCodeAt(t + 2) << 16 | this.state.message.charCodeAt(t + 3) << 24); this.state.message = this.state.message.substr(this.blockSizeInBytes), this.processBlock(this.blockUnits) } } }, { key: "processBlock", value: function (t) { } }, { key: "getStateHash", value: function (t) { t = t || this.state.hash.length; for (var e = "", n = 0; n < t; n++)e += String.fromCharCode(255 & this.state.hash[n]) + String.fromCharCode(this.state.hash[n] >> 8 & 255) + String.fromCharCode(this.state.hash[n] >> 16 & 255) + String.fromCharCode(this.state.hash[n] >> 24 & 255); return e } }, { key: "addLengthBits", value: function () { this.state.message += String.fromCharCode(this.state.length << 3 & 255) + String.fromCharCode(this.state.length >> 5 & 255) + String.fromCharCode(this.state.length >> 13 & 255) + String.fromCharCode(this.state.length >> 21 & 255) + String.fromCharCode(this.state.length >> 29 & 255) + "\0\0\0" } }]), n = s; function s(t) { var e; return function (t) { if (!(t instanceof s)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = i(s).call(this, t)) || "object" !== r(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).blockUnits = [], t } e.a = n }, function (t, e, n) { "use strict"; var r = n(3), E = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var T = [1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591], r = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) }(u, r.a), r = [{ key: "reset", value: function () { switch (o(s(u.prototype), "reset", this).call(this), this.options.length) { case 384: this.state.hash = [-876896931, -1056596264, 1654270250, 914150663, -1856437926, 812702999, 355462360, -150054599, 1731405415, -4191439, -1900787065, 1750603025, -619958771, 1694076839, 1203062813, -1090891868]; break; case 512: this.state.hash = [1779033703, -205731576, -1150833019, -2067093701, 1013904242, -23791573, -1521486534, 1595750129, 1359893119, -1377402159, -1694144372, 725511199, 528734635, -79577749, 1541459225, 327033209]; break; default: for (var t = new u, e = 0; e < 16; e++)t.state.hash[e] = 2779096485 ^ t.state.hash[e]; t.update("SHA-512/" + this.options.length); var n = t.finalize(); this.state.hash = []; for (var r = 0; r < 64; r += 4)this.state.hash.push(n.charCodeAt(r) << 24 | n.charCodeAt(r + 1) << 16 | n.charCodeAt(r + 2) << 8 | n.charCodeAt(r + 3)) } } }, { key: "processBlock", value: function (t) { for (var e, n, r, i, o = this.state.hash[0], s = this.state.hash[1], a = this.state.hash[2], u = this.state.hash[3], c = this.state.hash[4], l = this.state.hash[5], h = this.state.hash[6], f = this.state.hash[7], p = this.state.hash[8], d = this.state.hash[9], g = this.state.hash[10], m = this.state.hash[11], v = this.state.hash[12], y = this.state.hash[13], b = this.state.hash[14], w = this.state.hash[15], _ = 0; _ < this.options.rounds; _ += 2) { _ < 32 ? (this.W[_] = t[_], this.W[_ + 1] = t[_ + 1]) : (e = Object(E.c)(this.W[_ - 30], this.W[_ - 29], 1) ^ Object(E.c)(this.W[_ - 30], this.W[_ - 29], 8) ^ this.W[_ - 30] >>> 7, n = Object(E.d)(this.W[_ - 30], this.W[_ - 29], 1) ^ Object(E.d)(this.W[_ - 30], this.W[_ - 29], 8) ^ (this.W[_ - 29] >>> 7 | this.W[_ - 30] << 25), r = Object(E.c)(this.W[_ - 4], this.W[_ - 3], 19) ^ Object(E.c)(this.W[_ - 4], this.W[_ - 3], 61) ^ this.W[_ - 4] >>> 6, i = Object(E.d)(this.W[_ - 4], this.W[_ - 3], 19) ^ Object(E.d)(this.W[_ - 4], this.W[_ - 3], 61) ^ (this.W[_ - 3] >>> 6 | this.W[_ - 4] << 26), S = (65535 & this.W[_ - 13]) + (65535 & this.W[_ - 31]) + (65535 & n) + (65535 & i) | 0, O = (this.W[_ - 13] >>> 16) + (this.W[_ - 31] >>> 16) + (n >>> 16) + (i >>> 16) + (S >>> 16) | 0, k = (65535 & this.W[_ - 14]) + (65535 & this.W[_ - 32]) + (65535 & e) + (65535 & r) + (O >>> 16) | 0, C = (this.W[_ - 14] >>> 16) + (this.W[_ - 32] >>> 16) + (e >>> 16) + (r >>> 16) + (k >>> 16) | 0, this.W[_] = 4294967295 & (C << 16 | 65535 & k), this.W[_ + 1] = 4294967295 & (O << 16 | 65535 & S)), e = Object(E.c)(o, s, 28) ^ Object(E.c)(o, s, 34) ^ Object(E.c)(o, s, 39), n = Object(E.d)(o, s, 28) ^ Object(E.d)(o, s, 34) ^ Object(E.d)(o, s, 39); var x = d & m ^ ~d & y, C = o & a ^ o & c ^ a & c, k = s & u ^ s & l ^ u & l, S = (S = (S = b + (r = Object(E.c)(p, d, 14) ^ Object(E.c)(p, d, 18) ^ Object(E.c)(p, d, 41)) + ((O = w + (i = Object(E.d)(p, d, 14) ^ Object(E.d)(p, d, 18) ^ Object(E.d)(p, d, 41)) | 0) >>> 0 < w >>> 0 ? 1 : 0) | 0) + (p & g ^ ~p & v) + ((O = O + x | 0) >>> 0 < x >>> 0 ? 1 : 0) | 0) + T[_] + ((O = O + T[_ + 1] | 0) >>> 0 < T[_ + 1] >>> 0 ? 1 : 0) | 0, O = O + this.W[_ + 1] | 0, k = n + k | 0, b = v, w = y, v = g, y = m, g = p, m = d, p = h + (S = S + this.W[_] + (O >>> 0 < this.W[_ + 1] >>> 0 ? 1 : 0) | 0) + ((d = f + O | 0) >>> 0 < f >>> 0 ? 1 : 0) | 0, h = c, f = l, c = a, l = u, a = o, u = s, o = S + (e + C + (k >>> 0 < n >>> 0 ? 1 : 0) | 0) + ((s = O + k | 0) >>> 0 < O >>> 0 ? 1 : 0) | 0 } this.state.hash[1] = this.state.hash[1] + s | 0, this.state.hash[0] = this.state.hash[0] + o + (this.state.hash[1] >>> 0 < s >>> 0 ? 1 : 0) | 0, this.state.hash[3] = this.state.hash[3] + u | 0, this.state.hash[2] = this.state.hash[2] + a + (this.state.hash[3] >>> 0 < u >>> 0 ? 1 : 0) | 0, this.state.hash[5] = this.state.hash[5] + l | 0, this.state.hash[4] = this.state.hash[4] + c + (this.state.hash[5] >>> 0 < l >>> 0 ? 1 : 0) | 0, this.state.hash[7] = this.state.hash[7] + f | 0, this.state.hash[6] = this.state.hash[6] + h + (this.state.hash[7] >>> 0 < f >>> 0 ? 1 : 0) | 0, this.state.hash[9] = this.state.hash[9] + d | 0, this.state.hash[8] = this.state.hash[8] + p + (this.state.hash[9] >>> 0 < d >>> 0 ? 1 : 0) | 0, this.state.hash[11] = this.state.hash[11] + m | 0, this.state.hash[10] = this.state.hash[10] + g + (this.state.hash[11] >>> 0 < m >>> 0 ? 1 : 0) | 0, this.state.hash[13] = this.state.hash[13] + y | 0, this.state.hash[12] = this.state.hash[12] + v + (this.state.hash[13] >>> 0 < y >>> 0 ? 1 : 0) | 0, this.state.hash[15] = this.state.hash[15] + w | 0, this.state.hash[14] = this.state.hash[14] + b + (this.state.hash[15] >>> 0 < w >>> 0 ? 1 : 0) | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 112 ? 112 - this.state.message.length | 0 : 240 - this.state.message.length | 0), this.state.message += "\0\0\0\0\0\0\0\0", this.addLengthBits(), this.process(), this.getStateHash(this.options.length / 32 | 0) } }], function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(u.prototype, r), u); function u(t) { var e; return function (t) { if (!(t instanceof u)) throw new TypeError("Cannot call a class as a function") }(this), (t = t || {}).length = t.length || 512, t.rounds = t.rounds || 160, e = this, (t = !(t = s(u).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).blockSize = 32, t.blockSizeInBytes = t.blockSize * t.unitSize, t.W = new Array(160), t } e.a = r }, function (t, e, n) { "use strict"; var r = n(3), f = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var p = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], r = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) }(u, r.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(u.prototype, [{ key: "reset", value: function () { 224 === (o(s(u.prototype), "reset", this).call(this), this.options.length) ? this.state.hash = [-1056596264, 914150663, 812702999, -150054599, -4191439, 1750603025, 1694076839, -1090891868] : this.state.hash = [1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225] } }, { key: "processBlock", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0 | this.state.hash[5], a = 0 | this.state.hash[6], u = 0 | this.state.hash[7], c = 0; c < this.options.rounds; c++) { this.W[c] = c < 16 ? 0 | t[c] : this.W[c - 16] + (Object(f.b)(this.W[c - 15], 7) ^ Object(f.b)(this.W[c - 15], 18) ^ this.W[c - 15] >>> 3) + this.W[c - 7] + (Object(f.b)(this.W[c - 2], 17) ^ Object(f.b)(this.W[c - 2], 19) ^ this.W[c - 2] >>> 10) | 0; var l = u + (Object(f.b)(o, 6) ^ Object(f.b)(o, 11) ^ Object(f.b)(o, 25)) + (o & s ^ ~o & a) + p[c] + this.W[c] | 0, h = (Object(f.b)(e, 2) ^ Object(f.b)(e, 13) ^ Object(f.b)(e, 22)) + (e & n ^ e & r ^ n & r) | 0, u = a, a = s, s = o, o = i + l | 0, i = r, r = n, n = e, e = l + h | 0 } this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0, this.state.hash[5] = this.state.hash[5] + s | 0, this.state.hash[6] = this.state.hash[6] + a | 0, this.state.hash[7] = this.state.hash[7] + u | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash(this.options.length / 32 | 0) } }]), u); function u(t) { var e; return function (t) { if (!(t instanceof u)) throw new TypeError("Cannot call a class as a function") }(this), (t = t || {}).length = t.length || 256, t.rounds = t.rounds || 64, e = this, (t = !(t = s(u).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).W = new Array(64), t } e.a = r }, function (t, e, n) { "use strict"; var r = n(5), d = n(0); function i(t) { return (i = "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 })(t) } function o(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } function s(t, e, n) { return (s = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = a(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function a(t) { return (a = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function u(t, e) { return (u = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var g = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], m = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11], v = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], y = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11], n = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && u(t, e) }(b, r.a), n = [{ key: "F", value: function (t, e, n) { return t ^ e ^ n } }, { key: "G", value: function (t, e, n) { return t & e | ~t & n } }, { key: "H", value: function (t, e, n) { return (t | ~e) ^ n } }, { key: "I", value: function (t, e, n) { return t & n | e & ~n } }, { key: "J", value: function (t, e, n) { return t ^ (e | ~n) } }, { key: "T", value: function (t, e, n, r) { return t < 16 ? this.F(e, n, r) : t < 32 ? this.G(e, n, r) + 1518500249 | 0 : t < 48 ? this.H(e, n, r) + 1859775393 | 0 : t < 64 ? this.I(e, n, r) + 2400959708 | 0 : this.J(e, n, r) + 2840853838 | 0 } }, { key: "T64", value: function (t, e, n, r) { return t < 16 ? this.I(e, n, r) + 1352829926 | 0 : t < 32 ? this.H(e, n, r) + 1548603684 | 0 : t < 48 ? this.G(e, n, r) + 1836072691 | 0 : this.F(e, n, r) } }, { key: "T80", value: function (t, e, n, r) { return t < 16 ? this.J(e, n, r) + 1352829926 | 0 : t < 32 ? this.I(e, n, r) + 1548603684 | 0 : t < 48 ? this.H(e, n, r) + 1836072691 | 0 : t < 64 ? this.G(e, n, r) + 2053994217 | 0 : this.F(e, n, r) } }], o((r = b).prototype, [{ key: "reset", value: function () { switch (s(a(b.prototype), "reset", this).call(this), this.options.length) { case 128: this.state.hash = [1732584193, 4023233417, 2562383102, 271733878], this.processBlock = this.processBlock128; break; case 256: this.state.hash = [1732584193, 4023233417, 2562383102, 271733878, 1985229328, 4275878552, 2309737967, 19088743], this.processBlock = this.processBlock256; break; case 320: this.state.hash = [1732584193, 4023233417, 2562383102, 271733878, 3285377520, 1985229328, 4275878552, 2309737967, 19088743, 1009589775], this.processBlock = this.processBlock320; break; default: this.state.hash = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], this.processBlock = this.processBlock160 } } }, { key: "processBlock128", value: function (t) { for (var e = a = 0 | this.state.hash[0], n = l = 0 | this.state.hash[1], r = c = 0 | this.state.hash[2], i = u = 0 | this.state.hash[3], o = 0; o < 64; o++) { var s = (s = a + t[g[o]] | 0) + b.T(o, l, c, u) | 0, a = u, u = c, c = l, l = s = Object(d.a)(s, v[o]); s = (s = e + t[m[o]] | 0) + b.T64(o, n, r, i) | 0, e = i, i = r, r = n, n = s = Object(d.a)(s, y[o]) } var h = this.state.hash[1] + c + i | 0; this.state.hash[1] = this.state.hash[2] + u + e | 0, this.state.hash[2] = this.state.hash[3] + a + n | 0, this.state.hash[3] = this.state.hash[0] + l + r | 0, this.state.hash[0] = h } }, { key: "processBlock160", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = e, a = n, u = r, c = i, l = o, h = 0; h < 80; h++) { var f = (f = e + t[g[h]] | 0) + b.T(h, n, r, i) | 0; f = (f = Object(d.a)(f, v[h])) + o | 0, e = o, o = i, i = Object(d.a)(r, 10), r = n, n = f, f = (f = s + t[m[h]] | 0) + b.T80(h, a, u, c) | 0, f = (f = Object(d.a)(f, y[h])) + l | 0, s = l, l = c, c = Object(d.a)(u, 10), u = a, a = f } var p = this.state.hash[1] + r + c | 0; this.state.hash[1] = this.state.hash[2] + i + l | 0, this.state.hash[2] = this.state.hash[3] + o + s | 0, this.state.hash[3] = this.state.hash[4] + e + a | 0, this.state.hash[4] = this.state.hash[0] + n + u | 0, this.state.hash[0] = p } }, { key: "processBlock256", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0 | this.state.hash[5], a = 0 | this.state.hash[6], u = 0 | this.state.hash[7], c = 0; c < 64; c += 1) { var l = (l = e + t[g[c]] | 0) + b.T(c, n, r, i) | 0, e = i, i = r, r = n, n = l = Object(d.a)(l, v[c]); switch (l = (l = o + t[m[c]] | 0) + b.T64(c, s, a, u) | 0, o = u, u = a, a = s, s = l = Object(d.a)(l, y[c]), c) { case 15: l = e, e = o, o = l; break; case 31: l = n, n = s, s = l; break; case 47: l = r, r = a, a = l; break; case 63: l = i, i = u, u = l } } this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0, this.state.hash[5] = this.state.hash[5] + s | 0, this.state.hash[6] = this.state.hash[6] + a | 0, this.state.hash[7] = this.state.hash[7] + u | 0 } }, { key: "processBlock320", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0 | this.state.hash[5], a = 0 | this.state.hash[6], u = 0 | this.state.hash[7], c = 0 | this.state.hash[8], l = 0 | this.state.hash[9], h = 0; h < 80; h += 1) { var f = (f = e + t[g[h]] | 0) + b.T(h, n, r, i) | 0; switch (f = (f = Object(d.a)(f, v[h])) + o | 0, e = o, o = i, i = Object(d.a)(r, 10), r = n, n = f, f = (f = s + t[m[h]] | 0) + b.T80(h, a, u, c) | 0, f = (f = Object(d.a)(f, y[h])) + l | 0, s = l, l = c, c = Object(d.a)(u, 10), u = a, a = f, h) { case 15: f = n, n = a, a = f; break; case 31: f = i, i = c, c = f; break; case 47: f = e, e = s, s = f; break; case 63: f = r, r = u, u = f; break; case 79: f = o, o = l, l = f } } this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0, this.state.hash[5] = this.state.hash[5] + s | 0, this.state.hash[6] = this.state.hash[6] + a | 0, this.state.hash[7] = this.state.hash[7] + u | 0, this.state.hash[8] = this.state.hash[8] + c | 0, this.state.hash[9] = this.state.hash[9] + l | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), o(r, n), b); function b(t) { return function (t) { if (!(t instanceof b)) throw new TypeError("Cannot call a class as a function") }(this), (t = t || {}).length = t.length || 160, e = this, !(t = a(b).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t; var e } e.a = n }, function (t, e, n) { "use strict"; var r = n(3), c = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var u = [10097, 32533, 76520, 13586, 34673, 54876, 80959, 9117, 39292, 74945, 37542, 4805, 64894, 74296, 24805, 24037, 20636, 10402, 822, 91665, 8422, 68953, 19645, 9303, 23209, 2560, 15953, 34764, 35080, 33606, 99019, 2529, 9376, 70715, 38311, 31165, 88676, 74397, 4436, 27659, 12807, 99970, 80157, 36147, 64032, 36653, 98951, 16877, 12171, 76833, 66065, 74717, 34072, 76850, 36697, 36170, 65813, 39885, 11199, 29170, 31060, 10805, 45571, 82406, 35303, 42614, 86799, 7439, 23403, 9732, 85269, 77602, 2051, 65692, 68665, 74818, 73053, 85247, 18623, 88579, 63573, 32135, 5325, 47048, 90553, 57548, 28468, 28709, 83491, 25624, 73796, 45753, 3529, 64778, 35808, 34282, 60935, 20344, 35273, 88435, 98520, 17767, 14905, 68607, 22109, 40558, 60970, 93433, 50500, 73998, 11805, 5431, 39808, 27732, 50725, 68248, 29405, 24201, 52775, 67851, 83452, 99634, 6288, 98083, 13746, 70078, 18475, 40610, 68711, 77817, 88685, 40200, 86507, 58401, 36766, 67951, 90364, 76493, 29609, 11062, 99594, 67348, 87517, 64969, 91826, 8928, 93785, 61368, 23478, 34113, 65481, 17674, 17468, 50950, 58047, 76974, 73039, 57186, 40218, 16544, 80124, 35635, 17727, 8015, 45318, 22374, 21115, 78253, 14385, 53763, 74350, 99817, 77402, 77214, 43236, 210, 45521, 64237, 96286, 2655, 69916, 26803, 66252, 29148, 36936, 87203, 76621, 13990, 94400, 56418, 9893, 20505, 14225, 68514, 46427, 56788, 96297, 78822, 54382, 14598, 91499, 14523, 68479, 27686, 46162, 83554, 94750, 89923, 37089, 20048, 80336, 94598, 26940, 36858, 70297, 34135, 53140, 33340, 42050, 82341, 44104, 81949, 85157, 47954, 32979, 26575, 57600, 40881, 22222, 6413, 12550, 73742, 11100, 2040, 12860, 74697, 96644, 89439, 28707, 25815, 63606, 49329, 16505, 34484, 40219, 52563, 43651, 77082, 7207, 31790, 61196, 90446, 26457, 47774, 51924, 33729, 65394, 59593, 42582, 60527, 15474, 45266, 95270, 79953, 59367, 83848, 82396, 10118, 33211, 59466, 94557, 28573, 67897, 54387, 54622, 44431, 91190, 42592, 92927, 45973, 42481, 16213, 97344, 8721, 16868, 48767, 3071, 12059, 25701, 46670, 23523, 78317, 73208, 89837, 68935, 91416, 26252, 29663, 5522, 82562, 4493, 52494, 75246, 33824, 45862, 51025, 61962, 79335, 65337, 12472, 549, 97654, 64051, 88159, 96119, 63896, 54692, 82391, 23287, 29529, 35963, 15307, 26898, 9354, 33351, 35462, 77974, 50024, 90103, 39333, 59808, 8391, 45427, 26842, 83609, 49700, 13021, 24892, 78565, 20106, 46058, 85236, 1390, 92286, 77281, 44077, 93910, 83647, 70617, 42941, 32179, 597, 87379, 25241, 5567, 7007, 86743, 17157, 85394, 11838, 69234, 61406, 20117, 45204, 15956, 6e4, 18743, 92423, 97118, 96338, 19565, 41430, 1758, 75379, 40419, 21585, 66674, 36806, 84962, 85207, 45155, 14938, 19476, 7246, 43667, 94543, 59047, 90033, 20826, 69541, 94864, 31994, 36168, 10851, 34888, 81553, 1540, 35456, 5014, 51176, 98086, 24826, 45240, 28404, 44999, 8896, 39094, 73407, 35441, 31880, 33185, 16232, 41941, 50949, 89435, 48581, 88695, 41994, 37548, 73043, 80951, 406, 96382, 70774, 20151, 23387, 25016, 25298, 94624, 61171, 79752, 49140, 71961, 28296, 69861, 2591, 74852, 20539, 387, 59579, 18633, 32537, 98145, 6571, 31010, 24674, 5455, 61427, 77938, 91936, 74029, 43902, 77557, 32270, 97790, 17119, 52527, 58021, 80814, 51748, 54178, 45611, 80993, 37143, 5335, 12969, 56127, 19255, 36040, 90324, 11664, 49883, 52079, 84827, 59381, 71539, 9973, 33440, 88461, 23356, 48324, 77928, 31249, 64710, 2295, 36870, 32307, 57546, 15020, 9994, 69074, 94138, 87637, 91976, 35584, 4401, 10518, 21615, 1848, 76938, 9188, 20097, 32825, 39527, 4220, 86304, 83389, 87374, 64278, 58044, 90045, 85497, 51981, 50654, 94938, 81997, 91870, 76150, 68476, 64659, 73189, 50207, 47677, 26269, 62290, 64464, 27124, 67018, 41361, 82760, 75768, 76490, 20971, 87749, 90429, 12272, 95375, 5871, 93823, 43178, 54016, 44056, 66281, 31003, 682, 27398, 20714, 53295, 7706, 17813, 8358, 69910, 78542, 42785, 13661, 58873, 4618, 97553, 31223, 8420, 28306, 3264, 81333, 10591, 40510, 7893, 32604, 60475, 94119, 1840, 53840, 86233, 81594, 13628, 51215, 90290, 28466, 68795, 77762, 20791, 91757, 53741, 61613, 62269, 50263, 90212, 55781, 76514, 83483, 47055, 89415, 92694, 397, 58391, 12607, 17646, 48949, 72306, 94541, 37408, 77513, 3820, 86864, 29901, 68414, 82774, 51908, 13980, 72893, 55507, 19502, 37174, 69979, 20288, 55210, 29773, 74287, 75251, 65344, 67415, 21818, 59313, 93278, 81757, 5686, 73156, 7082, 85046, 31853, 38452, 51474, 66499, 68107, 23621, 94049, 91345, 42836, 9191, 8007, 45449, 99559, 68331, 62535, 24170, 69777, 12830, 74819, 78142, 43860, 72834, 33713, 48007, 93584, 72869, 51926, 64721, 58303, 29822, 93174, 93972, 85274, 86893, 11303, 22970, 28834, 34137, 73515, 90400, 71148, 43643, 84133, 89640, 44035, 52166, 73852, 70091, 61222, 60561, 62327, 18423, 56732, 16234, 17395, 96131, 10123, 91622, 85496, 57560, 81604, 18880, 65138, 56806, 87648, 85261, 34313, 65861, 45875, 21069, 85644, 47277, 38001, 2176, 81719, 11711, 71602, 92937, 74219, 64049, 65584, 49698, 37402, 96397, 1304, 77586, 56271, 10086, 47324, 62605, 40030, 37438, 97125, 40348, 87083, 31417, 21815, 39250, 75237, 62047, 15501, 29578, 21826, 41134, 47143, 34072, 64638, 85902, 49139, 6441, 3856, 54552, 73135, 42742, 95719, 9035, 85794, 74296, 8789, 88156, 64691, 19202, 7638, 77929, 3061, 18072, 96207, 44156, 23821, 99538, 4713, 66994, 60528, 83441, 7954, 19814, 59175, 20695, 5533, 52139, 61212, 6455, 83596, 35655, 6958, 92983, 5128, 9719, 77433, 53783, 92301, 50498, 10850, 62746, 99599, 10507, 13499, 6319, 53075, 71839, 6410, 19362, 39820, 98952, 43622, 63147, 64421, 80814, 43800, 9351, 31024, 73167, 59580, 6478, 75569, 78800, 88835, 54486, 23768, 6156, 4111, 8408, 38508, 7341, 23793, 48763, 90822, 97022, 17719, 4207, 95954, 49953, 30692, 70668, 94688, 16127, 56196, 80091, 82067, 63400, 5462, 69200, 65443, 95659, 18288, 27437, 49632, 24041, 8337, 65676, 96299, 90836, 27267, 50264, 13192, 72294, 7477, 44606, 17985, 48911, 97341, 30358, 91307, 6991, 19072, 24210, 36699, 53728, 28825, 35793, 28976, 66252, 68434, 94688, 84473, 13622, 62126, 98408, 12843, 82590, 9815, 93146, 48908, 15877, 54745, 24591, 35700, 4754, 83824, 52692, 54130, 55160, 6913, 45197, 42672, 78601, 11883, 9528, 63011, 98901, 14974, 40344, 10455, 16019, 14210, 33712, 91342, 37821, 88325, 80851, 43667, 70883, 12883, 97343, 65027, 61184, 4285, 1392, 17974, 15077, 90712, 26769, 21778, 30976, 38807, 36961, 31649, 42096, 63281, 2023, 8816, 47449, 19523, 59515, 65122, 59659, 86283, 68258, 69572, 13798, 16435, 91529, 67245, 52670, 35583, 16563, 79246, 86686, 76463, 34222, 26655, 90802, 60584, 47377, 7500, 37992, 45134, 26529, 26760, 83637, 41326, 44344, 53853, 41377, 36066, 94850, 58838, 73859, 49364, 73331, 96240, 43642, 24637, 38736, 74384, 89342, 52623, 7992, 12369, 18601, 3742, 83873, 83080, 12451, 38992, 22815, 7759, 51777, 97377, 27585, 51972, 37867, 16444, 24334, 36151, 99073, 27493, 70939, 85130, 32552, 54846, 54759, 60790, 18157, 57178, 65762, 11161, 78576, 45819, 52979, 65130, 4860, 3991, 10461, 93716, 16894, 66083, 24653, 84609, 58232, 88618, 19161, 38555, 95554, 32886, 59780, 8355, 60860, 29735, 47762, 71299, 23853, 17546, 73704, 92052, 46215, 55121, 29281, 59076, 7936, 27954, 58909, 32643, 52861, 95819, 6831, 911, 98936, 76355, 93779, 80863, 514, 69572, 68777, 39510, 35905, 14060, 40619, 29549, 69616, 33564, 60780, 24122, 66591, 27699, 6494, 14845, 46672, 61958, 77100, 90899, 75754, 61196, 30231, 92962, 61773, 41839, 55382, 17267, 70943, 78038, 70267, 30532, 21704, 10274, 12202, 39685, 23309, 10061, 68829, 55986, 66485, 3788, 97599, 75867, 20717, 74416, 53166, 35208, 33374, 87539, 8823, 48228, 63379, 85783, 47619, 53152, 67433, 35663, 52972, 16818, 60311, 60365, 94653, 35075, 33949, 42614, 29297, 1918, 28316, 98953, 73231, 83799, 42402, 56623, 34442, 34994, 41374, 70071, 14736, 9958, 18065, 32960, 7405, 36409, 83232, 99385, 41600, 11133, 7586, 15917, 6253, 19322, 53845, 57620, 52606, 66497, 68646, 78138, 66559, 19640, 99413, 11220, 94747, 7399, 37408, 48509, 23929, 27482, 45476, 85244, 35159, 31751, 57260, 68980, 5339, 15470, 48355, 88651, 22596, 3152, 19121, 88492, 99382, 14454, 4504, 20094, 98977, 74843, 93413, 22109, 78508, 30934, 47744, 7481, 83828, 73788, 6533, 28597, 20405, 94205, 20380, 22888, 48893, 27499, 98748, 60530, 45128, 74022, 84617, 82037, 10268, 78212, 16993, 35902, 91386, 44372, 15486, 65741, 14014, 87481, 37220, 41849, 84547, 46850, 52326, 34677, 58300, 74910, 64345, 19325, 81549, 46352, 33049, 69248, 93460, 45305, 7521, 61318, 31855, 14413, 70951, 11087, 96294, 14013, 31792, 59747, 67277, 76503, 34513, 39663, 77544, 52701, 8337, 56303, 87315, 16520, 69676, 11654, 99893, 2181, 68161, 57275, 36898, 81304, 48585, 68652, 27376, 92852, 55866, 88448, 3584, 20857, 73156, 70284, 24326, 79375, 95220, 1159, 63267, 10622, 48391, 15633, 84924, 90415, 93614, 33521, 26665, 55823, 47641, 86225, 31704, 92694, 48297, 39904, 2115, 59589, 49067, 66821, 41575, 49767, 4037, 77613, 19019, 88152, 80, 20554, 91409, 96277, 48257, 50816, 97616, 38688, 32486, 45134, 63545, 59404, 72059, 43947, 51680, 43852, 59693, 25163, 1889, 70014, 15021, 41290, 67312, 71857, 15957, 68971, 11403, 65251, 7629, 37239, 33295, 5870, 1119, 92784, 26340, 18477, 65622, 36815, 43625, 18637, 37509, 82444, 99005, 4921, 73701, 14707, 93997, 64397, 11692, 5327, 82162, 20247, 81759, 45197, 25332, 83745, 22567, 4515, 25624, 95096, 67946, 48460, 85558, 15191, 18782, 16930, 33361, 83761, 60873, 43253, 84145, 60833, 25983, 1291, 41349, 20368, 7126, 14387, 6345, 80854, 9279, 43529, 6318, 38384, 74761, 41196, 37480, 51321, 92246, 80088, 77074, 88722, 56736, 66164, 49431, 66919, 31678, 72472, 8, 80890, 18002, 94813, 31900, 54155, 83436, 35352, 54131, 5466, 55306, 93128, 18464, 74457, 90561, 72848, 11834, 79982, 68416, 39528, 72484, 82474, 25593, 48545, 35247, 18619, 13674, 18611, 19241, 81616, 18711, 53342, 44276, 75122, 11724, 74627, 73707, 58319, 15997, 7586, 16120, 82641, 22820, 92904, 13141, 32392, 19763, 61199, 67940, 90767, 4235, 13574, 17200, 69902, 63742, 78464, 22501, 18627, 90872, 40188, 28193, 29593, 88627, 94972, 11598, 62095, 36787, 441, 58997, 34414, 82157, 86887, 55087, 19152, 23, 12302, 80783, 32624, 68691, 63439, 75363, 44989, 16822, 36024, 867, 76378, 41605, 65961, 73488, 67049, 9070, 93399, 45547, 94458, 74284, 5041, 49807, 20288, 34060, 79495, 4146, 52162, 90286, 54158, 34243, 46978, 35482, 59362, 95938, 91704, 30552, 4737, 21031, 75051, 93029, 47665, 64382, 99782, 93478, 94015, 46874, 32444, 48277, 59820, 96163, 64654, 25843, 41145, 42820, 74108, 88222, 88570, 74015, 25704, 91035, 1755, 14750, 48968, 38603, 62880, 87873, 95160, 59221, 22304, 90314, 72877, 17334, 39283, 4149, 11748, 12102, 80580, 41867, 17710, 59621, 6554, 7850, 73950, 79552, 17944, 5600, 60478, 3343, 25852, 58905, 57216, 39618, 49856, 99326, 66067, 42792, 95043, 52680, 46780, 56487, 9971, 59481, 37006, 22186, 54244, 91030, 45547, 70818, 59849, 96169, 61459, 21647, 87417, 17198, 30945, 57589, 31732, 57260, 47670, 7654, 46376, 25366, 94746, 49580, 69170, 37403, 86995, 90307, 94304, 71803, 26825, 5511, 12459, 91314, 8345, 88975, 35841, 85771, 8105, 59987, 87112, 21476, 14713, 71181, 27767, 43584, 85301, 88977, 29490, 69714, 73035, 41207, 74699, 9310, 13025, 14338, 54066, 15243, 47724, 66733, 47431, 43905, 31048, 56699, 80217, 36292, 98525, 24335, 24432, 24896, 43277, 58874, 11466, 16082, 10875, 62004, 90391, 61105, 57411, 6368, 53856, 30743, 8670, 84741, 54127, 57326, 26629, 19087, 24472, 88779, 30540, 27886, 61732, 75454, 60311, 42824, 37301, 42678, 45990, 43242, 17374, 52003, 70707, 70214, 49739, 71484, 92003, 98086, 76668, 73209, 59202, 11973, 2902, 33250, 78626, 51594, 16453, 94614, 39014, 97066, 83012, 9832, 25571, 77628, 66692, 13986, 99837, 582, 81232, 44987, 9504, 96412, 90193, 79568, 44071, 28091, 7362, 97703, 76447, 42537, 98524, 97831, 65704, 9514, 41468, 85149, 49554, 17994, 14924, 39650, 95294, 556, 70481, 6905, 94559, 37559, 49678, 53119, 70312, 5682, 66986, 34099, 74474, 20740, 41615, 70360, 64114, 58660, 90850, 64618, 80620, 51790, 11436, 38072, 50273, 93113, 41794, 86861, 24781, 89683, 55411, 85667, 77535, 99892, 41396, 80504, 90670, 8289, 40902, 5069, 95083, 6783, 28102, 57816, 25807, 24260, 71529, 78920, 72682, 7385, 90726, 57166, 98884, 8583, 6170, 97965, 88302, 98041, 21443, 41808, 68984, 83620, 89747, 98882, 60808, 54444, 74412, 81105, 1176, 28838, 36421, 16489, 18059, 51061, 80940, 44893, 10408, 36222, 80582, 71944, 92638, 40333, 67054, 16067, 19516, 90120, 46759, 71643, 13177, 55292, 21036, 82808, 77501, 97427, 49386, 54480, 23604, 23554, 21785, 41101, 91178, 10174, 29420, 90438, 6312, 88940, 15995, 69321, 47458, 64809, 98189, 81851, 29651, 84215, 60942, 307, 11897, 92674, 40405, 68032, 96717, 54244, 10701, 41393, 92329, 98932, 78284, 46347, 71209, 92061, 39448, 93136, 25722, 8564, 77936, 63574, 31384, 51924, 85561, 29671, 58137, 17820, 22751, 36518, 38101, 77756, 11657, 13897, 95889, 57067, 47648, 13885, 70669, 93406, 39641, 69457, 91339, 22502, 92613, 89719, 11947, 56203, 19324, 20504, 84054, 40455, 99396, 63680, 67667, 60631, 69181, 96845, 38525, 11600, 47468, 3577, 57649, 63266, 24700, 71594, 14004, 23153, 69249, 5747, 43321, 31370, 28977, 23896, 76479, 68562, 62342, 7589, 8899, 5985, 64281, 61826, 18555, 64937, 13173, 33365, 78851, 16499, 87064, 13075, 66847, 70495, 32350, 2985, 86716, 38746, 26313, 77463, 55387, 72681, 72461, 33230, 21529, 53424, 92581, 2262, 78438, 66276, 18396, 73538, 21032, 91050, 13058, 16218, 12470, 56500, 15292, 76139, 59526, 52113, 95362, 67011, 6651, 16136, 1016, 857, 55018, 56374, 35824, 71708, 49712, 97380, 10404, 55452, 34030, 60726, 75211, 10271, 36633, 68424, 58275, 61764, 97586, 54716, 50259, 46345, 87195, 46092, 26787, 60939, 89514, 11788, 68224, 23417, 73959, 76145, 30342, 40277, 11049, 72049, 15472, 50669, 48139, 36732, 46874, 37088, 73465, 9819, 58869, 35220, 12120, 86124, 51247, 44302, 60883, 52109, 21437, 36786, 49226, 77837, 19612, 78430, 11661, 94770, 77603, 65669, 86868, 12665, 30012, 75989, 39141, 77400, 28e3, 64238, 73258, 71794, 31340, 26256, 66453, 37016, 64756, 80457, 8747, 12836, 3469, 50678, 3274, 43423, 66677, 82556, 92901, 51878, 56441, 22998, 29718, 38447, 6453, 25311, 7565, 53771, 3551, 90070, 9483, 94050, 45938, 18135, 36908, 43321, 11073, 51803, 98884, 66209, 6830, 53656, 14663, 56346, 71430, 4909, 19818, 5707, 27369, 86882, 53473, 7541, 53633, 70863, 3748, 12822, 19360, 49088, 59066, 75974, 63335, 20483, 43514, 37481, 58278, 26967, 49325, 43951, 91647, 93783, 64169, 49022, 98588, 9495, 49829, 59068, 38831, 4838, 83605, 92419, 39542, 7772, 71568, 75673, 35185, 89759, 44901, 74291, 24895, 88530, 70774, 35439, 46758, 70472, 70207, 92675, 91623, 61275, 35720, 26556, 95596, 20094, 73750, 85788, 34264, 1703, 46833, 65248, 14141, 53410, 38649, 6343, 57256, 61342, 72709, 75318, 90379, 37562, 27416, 75670, 92176, 72535, 93119, 56077, 6886, 18244, 92344, 31374, 82071, 7429, 81007, 47749, 40744, 56974, 23336, 88821, 53841, 10536, 21445, 82793, 24831, 93241, 14199, 76268, 70883, 68002, 3829, 17443, 72513, 76400, 52225, 92348, 62308, 98481, 29744, 33165, 33141, 61020, 71479, 45027, 76160, 57411, 13780, 13632, 52308, 77762, 88874, 33697, 83210, 51466, 9088, 50395, 26743, 5306, 21706, 70001, 99439, 80767, 68749, 95148, 94897, 78636, 96750, 9024, 94538, 91143, 96693, 61886, 5184, 75763, 47075, 88158, 5313, 53439, 14908, 8830, 60096, 21551, 13651, 62546, 96892, 25240, 47511, 58483, 87342, 78818, 7855, 39269, 566, 21220, 292, 24069, 25072, 29519, 52548, 54091, 21282, 21296, 50958, 17695, 58072, 68990, 60329, 95955, 71586, 63417, 35947, 67807, 57621, 64547, 46850, 37981, 38527, 9037, 64756, 3324, 4986, 83666, 9282, 25844, 79139, 78435, 35428, 43561, 69799, 63314, 12991, 93516, 23394, 94206, 93432, 37836, 94919, 26846, 2555, 74410, 94915, 48199, 5280, 37470, 93622, 4345, 15092, 19510, 18094, 16613, 78234, 50001, 95491, 97976, 38306, 32192, 82639, 54624, 72434, 92606, 23191, 74693, 78521, 104, 18248, 75583, 90326, 50785, 54034, 66251, 35774, 14692, 96345, 44579, 85932, 44053, 75704, 20840, 86583, 83944, 52456, 73766, 77963, 31151, 32364, 91691, 47357, 40338, 23435, 24065, 8458, 95366, 7520, 11294, 23238, 1748, 41690, 67328, 54814, 37777, 10057, 42332, 38423, 2309, 70703, 85736, 46148, 14258, 29236, 12152, 5088, 65825, 2463, 65533, 21199, 60555, 33928, 1817, 7396, 89215, 30722, 22102, 15880, 92261, 17292, 88190, 61781, 48898, 92525, 21283, 88581, 60098, 71926, 819, 59144, 224, 30570, 90194, 18329, 6999, 26857, 19238, 64425, 28108, 16554, 16016, 42, 83229, 10333, 36168, 65617, 94834, 79782, 23924, 49440, 30432, 81077, 31543, 95216, 64865, 13658, 51081, 35337, 74538, 44553, 64672, 90960, 41849, 93865, 44608, 93176, 34851, 5249, 29329, 19715, 94082, 14738, 86667, 43708, 66354, 93692, 25527, 56463, 99380, 38793, 85774, 19056, 13939, 46062, 27647, 66146, 63210, 96296, 33121, 54196, 34108, 75814, 85986, 71171, 15102, 28992, 63165, 98380, 36269, 60014, 7201, 62448, 46385, 42175, 88350, 46182, 49126, 52567, 64350, 16315, 53969, 80395, 81114, 54358, 64578, 47269, 15747, 78498, 90830, 25955, 99236, 43286, 91064, 99969, 95144, 64424, 77377, 49553, 24241, 8150, 89535, 8703, 91041, 77323, 81079, 45127, 93686, 32151, 7075, 83155, 10252, 73100, 88618, 23891, 87418, 45417, 20268, 11314, 50363, 26860, 27799, 49416, 83534, 19187, 8059, 76677, 2110, 12364, 71210, 87052, 50241, 90785, 97889, 81399, 58130, 64439, 5614, 59467, 58309, 87834, 57213, 37510, 33689, 1259, 62486, 56320, 46265, 73452, 17619, 56421, 40725, 23439, 41701, 93223, 41682, 45026, 47505, 27635, 56293, 91700, 4391, 67317, 89604, 73020, 69853, 61517, 51207, 86040, 2596, 1655, 9918, 45161, 222, 54577, 74821, 47335, 8582, 52403, 94255, 26351, 46527, 68224, 90183, 85057, 72310, 34963, 83462, 49465, 46581, 61499, 4844, 94626, 2963, 41482, 83879, 44942, 63915, 94365, 92560, 12363, 30246, 2086, 75036, 88620, 91088, 67691, 67762, 34261, 8769, 91830, 23313, 18256, 28850, 37639, 92748, 57791, 71328, 37110, 66538, 39318, 15626, 44324, 82827, 8782, 65960, 58167, 1305, 83950, 45424, 72453, 19444, 68219, 64733, 94088, 62006, 89985, 36936, 61630, 97966, 76537, 46467, 30942, 7479, 67971, 14558, 22458, 35148, 1929, 17165, 12037, 74558, 16250, 71750, 55546, 29693, 94984, 37782, 41659, 39098, 23982, 29899, 71594, 77979, 54477, 13764, 17315, 72893, 32031, 39608, 75992, 73445, 1317, 50525, 87313, 45191, 30214, 19769, 90043, 93478, 58044, 6949, 31176, 88370, 50274, 83987, 45316, 38551, 79418, 14322, 91065, 7841, 36130, 86602, 10659, 40859, 964, 71577, 85447, 61079, 96910, 72906, 7361, 84338, 34114, 52096, 66715, 51091, 86219, 81115, 49625, 48799, 89485, 24855, 13684, 68433, 70595, 70102, 71712, 88559, 92476, 32903, 68009, 58417, 87962, 11787, 16644, 72964, 29776, 63075, 13270, 84758, 49560, 10317, 28778, 23006, 31036, 84906, 81488, 17340, 74154, 42801, 27917, 89792, 62604, 62234, 13124, 76471, 51667, 37589, 87147, 24743, 48023, 6325, 79794, 35889, 13255, 4925, 99004, 70322, 60832, 76636, 56907, 56534, 72615, 46288, 36788, 93196, 68656, 66492, 35933, 52293, 47953, 95495, 95304, 50009, 83464, 28608, 38074, 74083, 9337, 7965, 65047, 36871, 59015, 21769, 30398, 44855, 1020, 80680, 59328, 8712, 48190, 45332, 27284, 31287, 66011, 9376, 86379, 74508, 33579, 77114, 92955, 23085, 92824, 3054, 25242, 16322, 48498, 9938, 44420, 13484, 52319, 58875, 2012, 88591, 52500, 95795, 41800, 95363, 54142, 17482, 32705, 60564, 12505, 40954, 46174, 64130, 63026, 96712, 79883, 39225, 52653, 69549, 36693, 59822, 22684, 31661, 88298, 15489, 16030, 42480, 15372, 38781, 71995, 77438, 91161, 10192, 7839, 62735, 99218, 25624, 2547, 27445, 69187, 55749, 32322, 15504, 73298, 51108, 48717, 92926, 75705, 89787, 96114, 99902, 37749, 96305, 12829, 70474, 838, 50385, 91711, 80370, 56504, 56857, 80906, 9018, 76569, 61072, 48568, 36491, 22587, 44363, 39592, 61546, 90181, 37348, 41665, 41339, 62106, 44203, 6732, 76111, 79840, 67999, 32231, 76869, 58652, 49983, 1669, 27464, 79553, 52855, 25988, 18087, 38052, 17529, 13607, 657, 76173, 43357, 77334, 24140, 53860, 2906, 89863, 44651, 55715, 26203, 65933, 51087, 98234, 40625, 45545, 63563, 89148, 82581, 4110, 66683, 99001, 9796, 47349, 65003, 66524, 81970, 71262, 14479, 31300, 8681, 58068, 44115, 40064, 77879, 23965, 69019, 73985, 19453, 26225, 97543, 37044, 7494, 85778, 35345, 61115, 92498, 49737, 64599, 7158, 82763, 25072, 38478, 57782, 75291, 62155, 52056, 4786, 11585, 71251, 25572, 79771, 93328, 66927, 54069, 58752, 26624, 50463, 77361, 29991, 96526, 2820, 91659, 12818, 96356, 49499, 1507, 40223, 9171, 83642, 21057, 2677, 9367, 38097, 16100, 19355, 6120, 15378, 56559, 69167, 30235, 6767, 66323, 78294, 14916, 19124, 88044, 16673, 66102, 86018, 29406, 75415, 22038, 27056, 26906, 25867, 14751, 92380, 30434, 44114, 6026, 79553, 55091, 95385, 41212, 37882, 46864, 54717, 97038, 53805, 64150, 70915, 63127, 63695, 41288, 38192, 72437, 75075, 18570, 52065, 8853, 30104, 79937, 66913, 53200, 84570, 78079, 28970, 53859, 37632, 80274, 35240, 32960, 74859, 7359, 55176, 3930, 38984, 35151, 82576, 82805, 94031, 12779, 90879, 24109, 25367, 77861, 9541, 85739, 69023, 64971, 99321, 7521, 95909, 43897, 71724, 92581, 5471, 64337, 98949, 3606, 78236, 78985, 29212, 57369, 34857, 67757, 58019, 58872, 96526, 28749, 56592, 37871, 72905, 70198, 57319, 54116, 47014, 18285, 33692, 72111, 60958, 96848, 17893, 40993, 50445, 14186, 76877, 87867, 50335, 9513, 44346, 26439, 55293, 6449, 44301, 63740, 40158, 72703, 88321, 85062, 57345, 66231, 15409, 3451, 95261, 43561, 15673, 28956, 90303, 62469, 82517, 43035, 36850, 15592, 64098, 59022, 31752, 4370, 50486, 11885, 23085, 41712, 80692, 48492, 16495, 99721, 36912, 28267, 27882, 16269, 64483, 11273, 2680, 1616, 46138, 54606, 14761, 5134, 45144, 63213, 49666, 27441, 86989, 29884, 54334, 6740, 8368, 80051, 81020, 17882, 74973, 74531, 94994, 24927, 64894, 22667, 20466, 82948, 66831, 47427, 76033, 31197, 59817, 20064, 61135, 28556, 29695, 80179, 74058, 18293, 9963, 35278, 13062, 83094, 23373, 90287, 33477, 48865, 30348, 70174, 11468, 25994, 25343, 22317, 1587, 30682, 1, 67814, 59557, 23362, 13746, 82244, 42093, 24671, 79458, 93730, 45488, 60234, 67098, 9899, 25775, 332, 36636, 57594, 19958, 85564, 58977, 12247, 60774, 66371, 69442, 20385, 14486, 91330, 50332, 46023, 75768, 59877, 60081, 92936, 72302, 75064, 85727, 52987, 5750, 19384, 33684, 78859, 80458, 69902, 34870, 88684, 49762, 40801, 86291, 18194, 90366, 82639, 53844, 96326, 65728, 48563, 26027, 52692, 62406, 76294, 41848, 63010, 69841, 29451, 36170, 21529, 16525, 64326, 22086, 24469, 57407, 96033, 37771, 31002, 18311, 93285, 31948, 14331, 58335, 15977, 80336, 81667, 27286, 24361, 61638, 57580, 95270, 46180, 76990, 53031, 94366, 2727, 49944, 19278, 5756, 51875, 53445, 33342, 1965, 7937, 10054, 97712, 87693, 58124, 46064, 39133, 77385, 9605, 65359, 70113, 90563, 86637, 94282, 12025, 31926, 24541, 23854, 58407, 32131, 92845, 20714, 27898, 26917, 50326, 35145, 50859, 72119, 95094, 29441, 42301, 62460, 75252, 94267, 38422, 73047, 24200, 85349, 72049, 91723, 97802, 98496, 12734, 73432, 10371, 57213, 53300, 80847, 46229, 7099, 72961, 13767, 65654, 31102, 82119, 96946, 65919, 81083, 3819, 57888, 57908, 16849, 77111, 41429, 92261, 45263, 1172, 55926, 78835, 27697, 48420, 58865, 41207, 21406, 8582, 10785, 36233, 12237, 7866, 13706, 92551, 11021, 63813, 71512, 65206, 37768, 94325, 14721, 20990, 54235, 71986, 5345, 56239, 52028, 1419, 7215, 55067, 11669, 21738, 66605, 69621, 69827, 8537, 18638, 60982, 28151, 98885, 76431, 25566, 3085, 23639, 30849, 63986, 73287, 26201, 36174, 14106, 54102, 57041, 16141, 64174, 3591, 90024, 73332, 31254, 17288, 59809, 25061, 51612, 47951, 16570, 43330, 79213, 11354, 55585, 19646, 99246, 37564, 32660, 20632, 21124, 60597, 69315, 31312, 57741, 85108, 21615, 24365, 27684, 16124, 33888, 14966, 35303, 69921, 15795, 4020, 67672, 86816, 63027, 84470, 45605, 44887, 26222, 79888, 58982, 22466, 98844, 48353, 60666, 58256, 31140, 93507, 69561, 6256, 88526, 18655, 865, 75247, 264, 65957, 98261, 72706, 36396, 46065, 85700, 32121, 99975, 73627, 78812, 89638, 86602, 96758, 65099, 52777, 46792, 13790, 55240, 52002, 10313, 91933, 71231, 10053, 78416, 54563, 96004, 42215, 30094, 45958, 48437, 49591, 50483, 13422, 69108, 59952, 27896, 40450, 79327, 31962, 46456, 39260, 51479, 61882, 48181, 50691, 64709, 32902, 10676, 12083, 35771, 79656, 56667, 76783, 3937, 99859, 10362, 57411, 40986, 35045, 2838, 29255, 64230, 84418, 34988, 77644, 39892, 77327, 74129, 53444, 35487, 95803, 38640, 20383, 55402, 25793, 14213, 87082, 42837, 95030, 97198, 61608, 97723, 79390, 35290, 34683, 81419, 87133, 70447, 53127, 97146, 28299, 56763, 12868, 1145, 12147, 58158, 92124, 60934, 18414, 97510, 7056, 54488, 20719, 53743, 91037, 44797, 52110, 8512, 18991, 20129, 31441, 51449, 14661, 71126, 23180, 68124, 18807, 70997, 21913, 19594, 70355, 73637, 68266, 60775, 43164, 52643, 96363, 77989, 79332, 39890, 65379, 20405, 52935, 43816, 92740, 95319, 4538, 60660, 28982, 15328, 80475, 34690, 2293, 19646, 46524, 96627, 33159, 42081, 8816, 74931, 20674, 8697, 66169, 46460, 46326, 39923, 60625, 28386, 22919, 19415, 75766, 43668, 31626, 70301, 67053, 3949, 70082, 2303, 48642, 38429, 94053, 38770, 68137, 68441, 52928, 70244, 91954, 17401, 92693, 98342, 21451, 84988, 80487, 33807, 73797, 49494, 41878, 76635, 83227, 76618, 11946, 13451, 87591, 78381, 21407, 90038, 72638, 69692, 51599, 86413, 32019, 64856, 74730, 41531, 11064, 1790, 58817, 86400, 66213, 92599, 70905, 78324, 54326, 43659, 34206, 63132, 38837, 40210, 96346, 16967, 81619, 96503, 14881, 89405, 32205, 49508, 98425, 2451, 35423, 56072, 36810, 30332, 85998, 49358, 92748, 84147, 79835, 94867, 41224, 61794, 35066, 82220, 66684, 20096, 2754, 41731, 37068, 32753, 91059, 13407, 5607, 69384, 53329, 95909, 44968, 11397, 92973, 50014, 92997, 80968, 93761, 57598, 74703, 7768, 37978, 73873, 33475, 9720, 97852, 98449, 48722, 84977, 11271, 11728, 68318, 22312, 78792, 87508, 88466, 72976, 47099, 84126, 38595, 85124, 64405, 90020, 7492, 52413, 95111, 34455, 86311, 68892, 1074, 60274, 28136, 19328, 38161, 57475, 13771, 63562, 84207, 94121, 18901, 52768, 33801, 82087, 86091, 59969, 90398, 56870, 55756, 78841, 98450, 54165, 55106, 50343, 70519, 14567, 36780, 55450, 19606, 83749, 67562, 64765, 38543, 16585, 86841, 73742, 8766, 39252, 75678, 75379, 78760, 37279, 15280, 13558, 95916, 89759, 76686, 76467, 67147, 63110, 94008, 8037, 35263, 53710, 16667, 79008, 11231, 29397, 67136, 18601, 64502, 90228, 89109, 72849, 22711, 65547, 34542, 26686, 81678, 87765, 77654, 23664, 96352, 14106, 32938, 28083, 18633, 80286, 65507, 46197, 52722, 75476, 77816, 47204, 34876, 45963, 79262, 90181, 84041, 3745, 90041, 30780, 27226, 92847, 85572, 15308, 80688, 5761, 82638, 13464, 23683, 81015, 54214, 64175, 43701, 86845, 15569, 50687, 52679, 87696, 8285, 97444, 47599, 94472, 64150, 87753, 68652, 60726, 26213, 17320, 64553, 81285, 98126, 12158, 52095, 64833, 492, 35817, 55571, 91300, 97812, 37507, 4209, 53515, 64342, 21223, 16662, 43265, 68219, 3529, 43636, 68417, 53640, 95326, 93381, 37113, 80751, 76469, 96677, 43054, 22937, 31954, 13266, 34140, 27253, 2734, 99070, 60077, 57988, 93211, 92795, 83795, 57477, 3941, 39007, 14619, 38320, 93449, 31336, 25279, 97030, 26245, 47394, 39475, 90621, 23820, 29344, 94859, 91604, 14033, 41868, 14816, 4075, 66644, 87803, 97815, 99552, 78666, 3942, 8175, 22345, 19983, 76783, 99044, 20851, 84981, 59052, 77178, 72109, 76475, 21619, 73017, 6812, 56633, 50612, 55289, 4671, 84419, 94072, 94446, 80603, 32188, 93415, 23464, 43947, 43728, 74284, 67177, 57105, 31059, 10642, 13803, 69602, 46961, 66567, 19359, 84676, 63918, 40650, 12923, 15974, 79732, 20225, 92525, 71179, 4859, 91208, 60430, 5239, 61458, 24089, 68852, 60171, 29603, 42535, 86365, 93905, 28237, 45317, 60718, 82001, 41679, 20679, 56304, 70043, 87568, 21386, 59049, 78353, 48696, 77379, 55309, 23780, 28391, 5940, 55583, 81256, 59418, 97521, 32846, 70761, 90115, 45325, 5490, 65974, 11186, 15357, 3568, 450, 96644, 58976, 36211, 88240, 92457, 89200, 94696, 11370, 91157, 48487, 59501, 56983, 89795, 42789, 69758, 79701, 29511, 55968, 41472, 89474, 84344, 80517, 7485, 97523, 17264, 82840, 59556, 37119, 30985, 48866, 60605, 95719, 70417, 59083, 95137, 76538, 44155, 67286, 57897, 28262, 4052, 919, 86207, 79932, 44236, 10089, 44373, 65670, 44285, 6903, 20834, 49701, 95735, 21149, 3425, 17594, 31427, 14262, 32252, 68540, 39427, 44026, 47257, 45055, 95091, 8367, 28381, 57375, 41562, 83883, 27715, 10122, 67745, 46497, 28626, 87297, 36568, 39483, 11385, 63292, 92305, 78683, 6146, 81905, 15038, 38338, 51206, 65749, 34119, 71516, 74068, 51094, 6665, 91884, 66762, 11428, 70908, 21506, 480, 94183, 78484, 66507, 75901, 25728, 52539, 86806, 69944, 65036, 27882, 2530, 4918, 74351, 65737, 89178, 8791, 39342, 94963, 22581, 56917, 17541, 83578, 75376, 65202, 30935, 79270, 91986, 99286, 45236, 44720, 81915, 70881, 45886, 43213, 49789, 97081, 16075, 20517, 69980, 25310, 91953, 1759, 67635, 88933, 54558, 18395, 73375, 62251, 58871, 9870, 70538, 48936, 7757, 90374, 56631, 88862, 30487, 38794, 36079, 32712, 11130, 55451, 25137, 38785, 83558, 31960, 69473, 45950, 18225, 9871, 88502, 75179, 11551, 75664, 74321, 67351, 27703, 83717, 18913, 42470, 8816, 37627, 14288, 62831, 44047, 67612, 72738, 26995, 50933, 63758, 50003, 43693, 52661, 55852, 52372, 59042, 37595, 4931, 73622, 68387, 86478, 40997, 5245, 75300, 24902, 59609, 35653, 15970, 37681, 69365, 22236, 86374, 65550, 343, 98377, 35354, 65770, 15365, 41422, 71356, 16630, 40044, 19290, 66449, 53629, 79452, 71674, 30260, 97303, 6487, 62789, 13005, 70152, 22501, 49867, 89294, 59232, 31776, 54919, 99851, 5438, 1096, 72269, 50486, 16719, 6144, 82041, 38332, 64452, 31840, 99287, 59928, 25503, 8407, 46970, 45907, 99238, 74547, 19704, 72035, 26542, 54600, 79172, 58779, 35747, 78956, 11478, 41195, 58135, 63856, 33037, 45753, 60159, 25193, 71838, 7526, 7985, 60714, 88627, 75790, 38454, 96110, 39237, 19792, 34534, 70169, 24805, 63215, 38175, 38784, 38855, 24826, 50917, 25147, 17082, 26997, 32295, 10894, 21805, 65245, 85407, 37926, 69214, 38579, 84721, 23544, 88548, 65626, 75517, 69737, 55626, 52175, 21697, 19453, 16908, 82841, 24060, 40285, 19195, 80281, 89322, 15232, 70043, 60691, 86370, 91949, 19017, 83846, 77869, 14321, 95102, 87073, 71467, 31305, 64677, 80358, 52629, 79419, 22359, 87867, 48296, 50141, 46807, 82184, 95812, 84665, 74511, 59914, 4146, 90417, 58508, 62875, 17630, 21868, 9199, 30322, 33352, 43374, 25473, 4119, 63086, 14147, 14863, 38020, 44757, 98628, 57916, 22199, 11865, 42911, 62651, 78290, 9392, 77294, 63168, 21043, 17409, 13786, 27475, 75979, 89668, 43596, 74316, 84489, 54941, 95992, 45445, 41059, 55142, 15214, 42903, 16799, 88254, 95984, 48575, 77822, 21067, 57238, 35352, 96779, 89564, 23797, 99937, 46379, 27119, 16060, 30302, 95327, 12849, 38111, 97090, 7598, 78473, 63079, 18570, 72803, 70040, 91385, 96436, 96263, 17368, 56188, 85999, 50026, 36050, 73736, 13351, 48321, 28357, 51718, 65636, 72903, 21584, 21060, 39829, 15564, 4716, 14594, 22363, 97639, 65937, 17802, 31535, 42767, 98761, 30987, 57657, 33398, 63053, 25926, 20944, 19306, 81727, 2695, 97479, 79172, 72764, 66446, 78864, 12698, 15812, 97209, 38827, 91016, 91281, 57875, 45228, 49211, 69755, 99224, 43999, 62879, 8879, 80015, 74396, 57146, 64665, 31159, 6980, 79069, 37409, 75037, 69977, 85919, 42826, 6974, 61063, 97640, 13433, 92528, 91311, 8440, 38840, 22362, 93929, 1836, 36590, 75052, 89475, 15437, 65648, 99012, 70236, 12307, 83585, 414, 62851, 48787, 28447, 21702, 57033, 29633, 44760, 34165, 27548, 37516, 24343, 63046, 2081, 20378, 19510, 42226, 97134, 68739, 32982, 56455, 53129, 77693, 25022, 55534, 99375, 30086, 98001, 7432, 67126, 76656, 29347, 28492, 43108, 64736, 32278, 84816, 80440, 30461, 818, 9136, 1952, 48442, 91058, 92590, 10443, 5195, 34009, 32141, 62209, 43740, 54102, 76895, 98172, 31583, 4155, 66492, 58981, 16591, 11331, 6838, 3818, 77063, 12523, 45570, 68970, 70055, 77751, 73743, 71732, 4704, 61384, 57343, 66682, 44500, 89745, 10436, 67202, 36455, 42467, 88801, 91280, 1056, 27534, 81619, 79004, 25824, 66362, 33280, 20706, 31929, 57422, 18730, 96197, 22101, 47592, 2180, 18287, 82310, 60430, 59627, 26471, 7794, 60475, 76713, 45427, 89654, 14370, 81674, 41246, 98416, 8669, 48883, 77154, 9806, 94015, 60347, 20027, 8405, 33150, 27368, 53375, 70171, 59431, 14534, 34018, 85665, 77797, 17944, 49602, 74391, 48830, 55029, 10371, 94261, 16658, 68400, 44148, 28150, 40364, 90913, 73151, 64463, 50058, 78191, 84439, 82478, 62398, 3113, 17578, 12830, 6571, 95934, 9132, 25287, 78731, 80683, 67207, 76597, 42096, 34934, 76609, 52553, 47508, 71561, 8038, 83011, 72577, 95790, 40076, 20292, 32138, 61197, 95476, 23123, 26648, 13611, 48452, 39963, 85857, 4855, 27029, 1542, 72443, 53688, 82635, 56264, 7977, 23090, 93553, 65434, 12124, 91087, 87800, 95675, 99419, 44659, 30382, 55263, 82514, 86800, 16781, 65977, 65946, 13033, 93895, 4056, 75895, 47878, 91309, 51233, 81409, 46773, 69135, 56906, 84493, 34530, 84534, 38312, 54574, 92933, 77341, 20839, 36126, 1143, 35356, 35459, 7959, 98335, 53266, 36146, 78047, 50607, 22486, 63308, 8996, 96056, 39085, 26567, 6779, 62663, 30523, 47881, 41279, 49864, 82248, 78333, 29466, 48151, 41957, 93235, 53308, 22682, 90722, 54478, 7235, 34306, 15827, 20121, 96837, 6283, 80172, 66109, 92592, 48238, 76428, 94546, 45430, 16288, 74839, 740, 25553, 83767, 35900, 5998, 7493, 46755, 11449, 88824, 44906, 33143, 7454, 56652, 34755, 63992, 59674, 65131, 46358, 12799, 96988, 51158, 73176, 1184, 49925, 63519, 11785, 29073, 72850, 47997, 75172, 55187, 15313, 40725, 33225, 56643, 10465, 38583, 86440, 97967, 26401, 17078, 38765, 33454, 19136, 57712, 48446, 98790, 27315, 71074, 10157, 57946, 35582, 49383, 61324, 26572, 84503, 3496, 60449, 17962, 26017, 65651, 40400, 83246, 80056, 75306, 75147, 41863, 25581, 87530, 33193, 43294, 5065, 99644, 62771, 75986, 79005, 44924, 18703, 40889, 4403, 5862, 2571, 82500, 74200, 36170, 46836, 74642, 65471, 26815, 30937, 64946, 10160, 15544, 31962, 54015, 28853, 66533, 14573, 79398, 47391, 73165, 47805, 77589, 16881, 13423, 89452, 76992, 62509, 9796, 57540, 13486, 48855, 25546, 47589, 21012, 47388, 78428, 70196, 84413, 81026, 87597, 22445, 83769, 85937, 38321, 85485, 87359, 9839, 67228, 71179, 94372, 4446, 62801, 50775, 96179, 40646, 44272, 12417, 47199, 39701, 30665, 32775, 66525, 53558, 78882, 31939, 67209, 38906, 34533, 99914, 27719, 216, 99225, 96537, 3843, 90564, 91110, 51838, 30300, 9559, 37795, 94880, 11325, 44979, 89696, 28129, 29931, 89971, 46292, 92710, 11036, 74760, 75307, 12291, 49618, 16293, 92408, 67928, 80823, 32872, 25460, 66819, 35374, 4035, 99087, 61129, 11341, 39118, 10891, 37217, 63638, 75477, 30068, 42334, 57570, 6890, 59353, 89939, 37692, 15232, 20033, 32202, 22348, 2766, 96791, 58448, 92248, 5769, 96684, 67885, 99295, 47271, 38655, 59513, 96960, 31718, 8974, 16122, 20535, 52380, 29769, 70660, 57425, 50891, 75044, 84257, 73315, 38181, 28673, 93140, 26307, 82265, 78382, 19681, 56585, 8975, 76764, 39956, 83450, 84663, 89963, 71584, 57696, 30829, 60527, 64947, 34899, 28805, 28397, 91830, 51842, 99838, 39839, 66971, 67177, 74219, 35637, 35634, 93581, 81746, 29991, 81096, 94279, 2968, 62561, 2479, 82126, 25702, 67953, 88088, 50293, 83423, 86206, 39935, 23253, 43041, 48941, 85787, 8388, 6671, 43574, 84908, 67295, 33623, 55060, 28174, 48415, 2529, 22009, 24524, 5283, 30460, 32399, 80423, 56929, 40852, 69969, 88541, 5979, 91496, 64730, 57198, 83145, 39750, 3568, 54669, 98679, 4297, 51047, 31492, 47734, 31343, 31180, 232, 19707, 24823, 75079, 73943, 17997, 8446, 91252, 39879, 58682, 82972, 18417, 39203, 36681, 42895, 8459, 15618, 17941, 52594, 43277, 16530, 40052, 91100, 87422, 47230, 95699, 49794, 50492, 87439, 86354, 4546, 65333, 11057, 77727, 19748, 38722, 91821, 18107, 42125, 89239, 28847, 54623, 38783, 47803, 31414, 38450, 3697, 89186, 30579, 44188, 26532, 8420, 80723, 48100, 60748, 76330, 45832, 8311, 16051, 4475, 13400, 48527, 46073, 17439, 56498, 94632, 9021, 16871, 83366, 14896, 4219, 38375, 87890, 90217, 42370, 61028, 85101, 76771, 83715, 94737, 69973, 74187, 1958, 59691, 86712, 86570, 60984, 76342, 13648, 85250, 28323, 48379, 45141, 36277, 51845, 29039, 3553, 5128, 59866, 51281, 68124, 17007, 24729, 29710, 41439, 40574, 11774, 86746, 89698, 56020, 37810, 88972, 11361, 95583, 70786, 589, 74473, 87513, 17690, 61427, 72914, 32517, 1804, 97910, 6327, 30246, 33049, 2622, 41026, 80875, 41293, 16752, 84225, 84414, 37137, 68956, 8095, 64981, 28180, 38629, 76962, 23840, 17477, 75268, 48297, 70340, 57888, 13938, 38554, 86836, 2195, 30270, 55484, 53364, 54705, 41380, 56316, 37723, 234, 21424, 26664, 63804, 75139, 36534, 18579, 9833, 98849, 72762, 59767, 52497, 24227, 83152, 71794, 21398, 99456, 89215, 51632, 54799, 27973, 68568, 68465, 98500, 28681, 18369, 24279, 96335, 12874, 82160, 67202, 85199, 27908, 67022, 49810, 77929, 96212, 81153, 77884, 7032, 1671, 53362, 28119, 56786, 30883, 28540, 76029, 3774, 64611, 19736, 25589, 46569, 45206, 48215, 69523, 17423, 91807, 90039, 30393, 58319, 85098, 66519, 57571, 24541, 3562, 14400, 62731, 82534, 61477, 89731, 18421, 29861, 52829, 838, 78040, 43350, 74323, 82892, 84746, 28302, 13264, 7595, 134, 12933, 46831, 24864, 47275, 20527, 9110, 28485, 30326, 99826, 64005, 99308, 65779, 42760, 90066, 3974, 38688, 39968, 32604, 11694, 46262, 73262, 45405, 43923, 67397, 88228, 56405, 17839, 92073, 57622, 93328, 15442, 50186, 7570, 58001, 31e3, 8915, 11467, 14793, 82691, 51238, 12485, 51745, 18192, 5985, 36826, 89434, 38669, 91592, 88799, 65621, 67237, 59541, 19657, 93402, 58705, 73553, 78280, 69125, 95591, 81168, 91927, 25976, 89077, 71690, 19404, 64603, 59752, 74698, 44233, 67602, 38615, 31303, 28650, 53700, 89819, 7783, 4351, 77451, 47350, 21234, 16016, 41532, 76508, 23063, 44993, 43983, 33356, 61715, 96485, 22121, 78004, 6316, 87896, 99289, 93981, 37850, 66128, 92735, 45064, 50924, 24204, 58816, 65290, 34392, 55567, 66416, 72353, 45775, 68590, 85685, 72683, 60090, 37149, 85347, 57414, 72336, 12979, 5720, 92754, 76911, 96883, 74420, 5220, 85815, 23557, 80567, 44365, 70254, 50864, 36619, 51479, 23281, 76428, 18580, 34240, 59289, 49076, 18439, 29522, 42541, 4024, 84446, 92434, 90407, 77241, 19690, 78143, 65919, 13699, 91844, 91241, 38361, 67171, 90551, 5709, 3474, 76025, 97043, 33834, 44638, 54040, 82797, 545, 38159, 16089, 35870, 89158, 55864, 98078, 50563, 36492, 10994, 85909, 9018, 19252, 73887, 67928, 60045, 70782, 11937, 4074, 53814, 46621, 52577, 94853, 45968, 73667, 65062, 73306, 76045, 78649, 91654, 53958, 96537, 95542, 67622, 54579, 17279, 67440, 56441, 20681, 64011, 52226, 96618, 32831, 60664, 67547, 39523, 2043, 59748, 1887, 69229, 94653, 99271, 98164, 62155, 9234, 47367, 13047, 6364, 35064, 10073, 6793, 80248, 29009, 44969, 11129, 17139, 79630, 89772, 26921, 56949, 23465, 30036, 17173, 82459, 96218, 60768, 76417, 24405, 18710, 68887, 82394, 69729, 82503, 40873, 41590, 67255, 30757, 9657, 91881, 34578, 9511, 5417, 58953, 18532, 10721, 22029, 48524, 47778, 881, 83489, 3464, 57462, 97459, 86689, 39755, 39547, 740, 36666, 7993, 31671, 86304, 12970, 73402, 52849, 31652, 79655, 11250, 18463, 57518, 20306, 25301, 1374, 51208, 33298, 87662, 61849, 60923, 68685, 69411, 39266, 80320, 34844, 89416, 81569, 83651, 35795, 40168, 33501, 1042, 58931, 3892, 85188, 74740, 85476, 23790, 33842, 89565, 53359, 25579, 59049, 62394, 72435, 12457, 21904, 18370, 97035, 57905, 9581, 91227, 92754, 37760, 1411, 7440, 87175, 88318, 63242, 85960, 56690, 12618, 30493, 11569, 73723, 7448, 58830, 157, 65814, 21118, 22140, 73793, 57855, 81830, 6795, 13183, 12625, 30635, 56429, 73216, 12342, 36722, 83886, 96828, 82870, 90954, 97614, 2370, 42160, 73370, 11944, 49067, 59452, 80495, 43911, 46712, 17033, 68037, 41963, 3874, 44856, 82985, 57453, 84358, 16120, 4454, 76624, 405, 62369, 55080, 61880, 51270, 87807, 10653, 36894, 70850, 35660, 234, 14705, 93418, 94084, 82856, 25384, 71555, 56754, 78315, 18291, 91656, 98079, 52384, 43306, 65205, 75903, 58701, 99496, 50048, 33557, 87793, 90857, 10143, 46726, 84284, 43635, 41213, 83845, 70986, 91408, 80220, 5728, 68890, 46577, 21152, 43759, 43301, 93661, 97252, 50106, 10099, 13722, 18572, 44024, 351, 18173, 23717, 85114, 85998, 57782, 63951, 53723, 86853, 63851, 79430, 49181, 46386, 69666, 55743, 76162, 71724, 40028, 94786, 34457, 16906, 90040, 30789, 40281, 94697, 96584, 81907, 4055, 53990, 66397, 80579, 42517, 78181, 39251, 9467, 67097, 95523, 66568, 63632, 71048, 15581, 39904, 75774, 77495, 75994, 29911, 65690, 41178, 47712, 70355, 16998, 56025, 5230, 10093, 71495, 34784, 70950, 54680, 57811, 53782, 39145, 36829, 85342, 40406, 35883, 45668, 3459, 29870, 78252, 70088, 70621, 67153, 5737, 40933, 91075, 93335, 86853, 15860, 81167, 91259, 16118, 52401, 83593, 84474, 2423, 75608, 39646, 90871, 70284, 82100, 96032, 5115, 63678, 2225, 88087, 58581, 44364, 57468, 21539, 13042, 64150, 63754, 5210, 87644, 54114, 64013, 63562, 41388, 32397, 74152, 23982, 71982, 71700, 33026, 66477, 47838, 46712, 39848, 35083, 65927, 97868, 11067, 76771, 71799, 43836, 41014, 97025, 93225, 8511, 63096, 26628, 73012, 12543, 76269, 99708, 2629, 49845, 73677, 19193, 14924, 57236, 95564, 15010, 59667, 73773, 78515, 2624, 99744, 13585, 33746, 58771, 94785, 62628, 99585, 11363, 80832, 59979, 9444, 78700, 2596, 85984, 69438, 16913, 96475, 93283, 18625, 77086, 45911, 39746, 64722, 39938, 43930, 54619, 302, 50384, 2738, 75714, 75249, 95439, 80714, 52555, 47266, 96190, 78750, 94973, 83669, 16479, 53163, 48071, 28e3, 45011, 26733, 67132, 83362, 84162, 43028, 8415, 27236, 52651, 89059, 64844, 80910, 1676, 91752, 57815, 26264, 3415, 57532, 29981, 61200, 96036, 62600, 20068, 56530, 38487, 8432, 89514, 26883, 69165, 97237, 22361, 55276, 39902, 95927, 82190, 49269, 27212, 46095, 37106, 64254, 27460, 49572, 51700, 27679, 12574, 33891, 3867, 9925, 6476, 82018, 45094, 59014, 67113, 44192, 75, 23318, 79895, 70550, 81717, 28833, 30271, 15821, 14999, 88174, 62617, 57517, 55256, 50281, 51583, 96879, 5225, 42272, 5339, 20483, 57596, 41011, 75937, 22767, 50120, 95938, 49753, 63882, 99616, 69083, 38721, 73889, 80236, 99531, 23053, 71237, 48861, 59046, 76283, 60538, 19732, 93877, 30345, 64882, 66660, 17026, 70364, 45676, 8039, 96228, 89936, 59141, 95585, 89552, 97247, 59325, 27848, 80058, 15950, 61481, 90906, 40998, 44137, 16144, 66300, 44091, 50018, 81364, 18211, 60294, 76559, 20279, 27414, 10589, 39860, 23e3, 31767, 95618, 56738, 50332, 16936, 70342, 92481, 30702, 76264, 62619, 68678, 62284, 83112, 93032, 55203, 52614, 36950, 41796, 45403, 79262, 2887, 53596, 61308, 20738, 34811, 27099, 90956, 65448, 3080, 75795, 29753, 97699, 80872, 23830, 85882, 74427, 99523, 74904, 28017, 45898, 57232, 48525, 7086, 26805, 74533, 92470, 18840, 76011, 93109, 14344, 55614, 50284, 15865, 19458, 35856, 13464, 53679, 64603, 51571, 56124, 79107, 29596, 89572, 78198, 57121, 73649, 8804, 87977, 87959, 70859, 40909, 77295, 87877, 75158, 62810, 92074, 23244, 59516, 50552, 31602, 41899, 6347, 27821, 68370, 48596, 88577, 30231, 25267, 84622, 31449, 12086, 56461, 22962, 78213, 62483, 93966, 60437, 52239, 58113, 32526, 38708, 81607, 57016, 1695, 90110, 4649, 59990, 23979, 3855, 10297, 46516, 96092, 82305, 30760, 78756, 4967, 82876, 4773, 86651, 16648, 53133, 82439, 78851, 49766, 24553, 15273, 36417, 1901, 33386, 76979, 25920, 33372, 2695, 11982, 40911, 6230, 91696, 43907, 17827, 30332, 89203, 32215, 91806, 23080, 49102, 9174, 11548, 54590, 75803, 66108, 73882, 62324, 26017, 72716, 33887, 1285, 31604, 71039, 24337, 53514, 58964, 89901, 22040, 92751, 12617, 37007, 5523, 61672, 62557, 98540, 26094, 60284, 19621, 96230, 38044, 6545, 9458, 42988, 2913, 86345, 67936, 90174, 40840, 44991, 24256, 34989, 74086, 13652, 68706, 1363, 4294, 88008, 78693, 83068, 94746, 221, 89299, 53186, 5930, 61889, 51341, 45412, 58860, 72568, 11381, 59785, 36887, 10690, 31347, 93326, 96267, 86987, 57565, 86836, 49071, 90331, 41248, 34629, 30240, 27270, 3864, 84308, 3035, 61369, 36902, 51017, 44409, 17120, 23823, 36460, 63359, 8333, 63173, 19134, 6493, 303, 18550, 26191, 19051, 81502, 66343, 6737, 90430, 65478, 58982, 82484, 16483, 47704, 44640, 68322, 44548, 72787, 2335, 28749, 39320, 5436, 98146, 56596, 812, 51445, 35533, 35478, 47573, 38414, 25542, 38032, 13442, 42983, 97207, 77854, 57806, 81616, 52828, 79429, 47389, 96795, 57764, 19605, 24767, 63253, 18809, 65093, 44449, 22952, 76872, 30983, 38948, 9310, 48336, 87651, 27110, 84427, 76209, 56412, 12760, 16747, 14551, 82626, 31224, 98636, 75100, 84882, 79479, 83420, 5347, 6803, 90063, 4617, 40257, 79183, 41766, 71873, 25242, 12275, 336, 40798, 42055, 74066, 69128, 32547, 76508, 32530, 42359, 89207, 49758, 58984, 92732, 15779, 7234, 28884, 28226, 50011, 35883, 99606, 45423, 76224, 75427, 85747, 33879, 97978, 57441, 927, 19164, 74716, 40702, 19715, 70917, 60344, 40236, 9019, 50577, 15598, 53136, 57285, 20536, 7539, 74832, 89184, 41501, 39447, 97422, 97041, 21913, 40581, 76081, 13089, 28776, 54164, 55736, 36263, 71841, 34488, 74988, 55467, 43322, 9214, 36746, 67981, 71877, 81683, 32461, 84091, 19422, 88366, 62054, 85664, 13409, 8003, 88276, 6989, 16607, 33633, 85349, 5784, 25950, 97998, 74110, 16699, 60184, 92818, 79705, 10381, 1474, 18656, 50434, 18232, 92132, 66537, 70141, 42854, 25120, 39581, 28249, 14215, 34810, 19767, 3409, 11807, 6566, 66138, 42997, 41999, 67504, 87117, 28961, 5e3, 29673, 77726, 73225, 54753, 69712, 71576, 92337, 17713, 63185, 87923, 91889, 68351, 17712, 75532, 93849, 48280, 62219, 317, 25290, 29209, 90927, 92929, 92762, 60413, 2018, 31793, 76290, 73373, 80777, 60819, 77375, 57886, 47291, 99670, 32605, 29064, 99476, 80999, 31217, 35, 91300, 14892, 73653, 26593, 25305, 56797, 12837, 39560, 27582, 37253, 38531, 76489, 49946, 69108, 58687, 43092, 73807, 96282, 6648, 67431, 87124, 57694, 21660, 64002, 6, 33600, 30245, 60636, 80164, 9285, 61426, 4658, 54130, 14710, 76553, 1904, 93668, 63110, 98618, 5601, 32199, 74923, 98049, 49717, 55539, 35940, 58545, 43295, 35810, 45451, 38735, 42065, 66769, 69825, 45461, 83881, 67372, 67351, 90612, 79502, 69460, 23108, 74421, 82990, 46821, 40683, 71603, 55267, 48192, 50242, 79738, 96417, 6664, 19929, 23644, 41116, 51056, 219, 45086, 32747, 49492, 15399, 24874, 80825, 95928, 61457, 45813, 59037, 16136, 3953, 83583, 5910, 12654, 53630, 92997, 22168, 93491, 71897, 74579, 24022, 6278, 24049, 71670, 43044, 8474, 38572, 77402, 35800, 7455, 96177, 41653, 74493, 20802, 65843, 73050, 73349, 2638, 65813, 96209, 49196, 45007, 32207, 14097, 66059, 46681, 7534, 71263, 20582, 10171, 51514, 52142, 60961, 57951, 25637, 37860, 21683, 86190, 90434, 94481, 85697, 95344, 2606, 74095, 61133, 7472, 64777, 94050, 41482, 975, 23471, 76052, 82021, 87676, 91345, 20196, 2612, 86299, 44996, 40312, 65712, 46079, 88514, 8610, 3685, 63197, 9073, 53105, 86824, 28112, 99306, 40706, 66840, 83003, 51590, 52755, 32285, 68454, 85058, 13645, 23073, 24724, 52989, 71880, 21952, 44144, 74975, 76715, 7844, 46447, 86643, 75579, 29276, 10864, 83179, 36721, 19300, 35066, 29383, 47478, 56644, 33354, 31414, 17643, 92374, 85085, 88458, 87191, 85248, 34963, 76278, 53230, 13953, 76985, 70959, 36663, 5293, 32658, 56767, 56997, 76736, 6558, 64248, 11907, 29123, 78458, 17678, 63805, 89973, 5076, 39263, 54404, 4355, 64957, 74407, 99838, 18836, 78098, 6490, 74888, 73719, 80675, 86178, 56283, 33591, 96957, 38382, 18772, 74773, 71229, 2603, 52673, 44609, 14843, 58418, 18060, 95459, 626, 30914, 13550, 42195, 44863, 8871, 89182, 64446, 78422, 41140, 15312, 98274, 48168, 95651, 35562, 85386, 56252, 72136, 85088, 68761, 78434, 98143, 61330, 2446, 64409, 49406, 99127, 98626, 55095, 44808, 13594, 87370, 89472, 12833, 98932, 68064, 58193, 20225, 5192, 28425, 23978, 24542, 80845, 55858, 4015, 21454, 37346, 51007, 17202, 10242, 12682, 55933, 96922, 22280, 75597, 50227, 70712, 44236, 20470, 36320, 49339, 60536, 80083, 38880, 93327, 49522, 93585, 9918, 55268, 4671, 57526, 11457, 48424, 54610, 7211, 78610, 9473, 72923, 27347, 30057, 76968, 26177, 59367, 46172, 88951, 40229, 34921, 60405, 88959, 16779, 29547, 92231, 61997, 36002, 21080, 39795, 77221, 10012, 49748, 76900, 15964, 3803, 40260, 92351, 92844, 10288, 57483, 10881, 70408, 75688, 16610, 1638, 93082, 44282, 66849, 75702, 69428, 34047, 84968, 71281, 72328, 73143, 88672, 49802, 50639, 18129, 93659, 58389, 49095, 45971, 34196, 84609, 59222, 19332, 17777, 41004, 47057, 30688, 16039, 20906, 41477, 42915, 60877, 33864, 75195, 62294, 3371, 11672, 1370, 2486, 35553, 17907, 90621, 45136, 9722, 67635, 12114, 63055, 16004, 21625, 24321, 20491, 26881, 66259, 94287, 54751, 36242, 36557, 5842, 30687, 65418, 94608, 24741, 45887, 78800, 86912, 42076, 50287, 9284, 68891, 76368, 83094, 96302, 35997, 30761, 97081, 9501, 68887, 32876, 1705, 34260, 95065, 45528, 88241, 30402, 12318, 52430, 40139, 96986, 84900, 72408, 42027, 31676, 54382, 73370, 26184, 14024, 57444, 57660, 52173, 30274, 93448, 63273, 77681, 74946, 2099, 69091, 19372, 66961, 14595, 58642, 75760, 52253, 53148, 26074, 52293, 65359, 63971, 4833, 86492, 1227, 54505, 19515, 89889, 46933, 13364, 33883, 83389, 36952, 52505, 67513, 40071, 31001, 3105, 87912, 29610, 75108, 37363, 28479, 43546, 89992, 19550, 54863, 82633, 19209, 21548, 35022, 21960, 57961, 11815, 95867, 559, 26428, 69386, 57453, 70147, 73538, 49562, 46806, 64550, 36653, 25718, 68792, 31113, 7607, 48037, 71020, 22666, 65957, 11141, 39227, 7990, 19849, 65972, 74528, 40888, 55386, 95918, 92088, 91125, 53648, 66122, 138, 79933, 71058, 34826, 97725, 69513, 22915, 18246, 52244, 91161, 40861, 40374, 13239, 56162, 4703, 95851, 22824, 41271, 28202, 62852, 84238, 46625, 20031, 8524, 20077, 65817, 21174, 29279, 57712, 22401, 67500, 30980, 74485, 26480, 21343, 30031, 61921, 35744, 57308, 71196, 1865, 49234, 62616, 54021, 29008, 83672, 85839, 96836, 45077, 80900, 66906, 63526, 93824, 71820, 11033, 20183, 85704, 4683, 63512, 39144, 56880, 64424, 95979, 17709, 94849, 31771, 5737, 84286, 16757, 46256, 24478, 73180, 59978, 8254, 78963, 95437, 86351, 33824, 32540, 18357, 2668, 99260, 21284, 81351, 70961, 10255, 6911, 47394, 72408, 23827, 59865, 96395, 30665, 43699, 3593, 29165, 23388, 26628, 92402, 16731, 86740, 29493, 9069, 78653, 90094, 42735, 33682, 95041, 89887, 92369, 57949, 81585, 50593, 14698, 4737, 72551, 57271, 59433, 156, 33966, 58773, 59108, 49578, 18100, 59836, 73221, 21110, 1650, 11058, 47770, 66141, 84576, 58388, 40915, 94507, 32209, 17272, 65674, 95552, 25685, 5345, 36995, 36302, 7971, 67001, 62062, 75939, 36005, 26739, 56484, 46885, 66348, 87666, 78055, 44485, 82955, 85936, 9219, 1847, 92687, 72579, 45457, 78252, 98239, 4e4, 75563, 92408, 17175, 78845, 32638, 26959, 35406, 59553, 57852, 7506, 9, 93172, 77713, 93880, 40981, 27924, 9678, 24538, 52426, 84852, 83781, 23712, 82490, 77890, 22482, 66668, 55850, 25644, 44972, 62275, 78089, 28894, 98685, 32998, 98766, 89119, 34355, 75127, 69797, 71419, 62067, 57990, 96514, 50603, 79807, 26135, 29207, 43632, 32905, 38513, 18924, 88872, 20758, 70232, 60425, 1116, 24077, 21369, 93541, 75329, 78656, 44251, 42014, 98154, 42552, 14575, 30765, 348, 1134, 71581, 68420, 78141, 21105, 63305, 9718, 54851, 65867, 8595, 47390, 39182, 51174, 41478, 64433, 59628, 31945, 87322, 78667, 95282, 5622, 26224, 19972, 97269, 98376, 14779, 51138, 49658, 45345, 4972, 52794, 15737, 496, 48939, 63485, 42780, 16061, 59631, 37171, 13483, 56058, 51093, 62290, 88227, 17400, 88433, 67363, 89507, 26482, 85964, 71336, 67799, 28342, 37747, 61722, 27180, 78755, 18603, 42953, 6606, 23875, 56766, 1932, 36113, 62807, 84012, 21103, 9685, 69662, 76755, 13701, 95168, 13169, 44726, 15284, 16702, 89617, 54397, 52052, 12835, 37741, 86434, 22400, 37947, 95763, 86337, 35189, 22756, 47473, 16618, 42479, 47405, 14055, 64262, 66670, 89692, 54032, 94591, 44149, 29854, 76691, 33263, 62048, 25116, 88598, 16119, 62116, 54517, 31883, 86707, 18895, 81790, 71294, 2684, 15292, 48107, 14341, 91416, 75609, 92564, 39987, 2283, 89970, 95855, 80970, 5432, 89860, 90293, 99851, 94648, 5598, 32171, 28793, 92305, 64244, 8277, 93391, 96717, 34464, 29838, 10664, 28050, 60122, 77934, 10758, 84922, 92220, 45071, 97697, 36368, 17792, 84792, 76594, 67319, 51886, 5665, 45201, 11348, 9254, 7510, 51039, 91683, 84500, 85338, 5555, 19633, 3870, 39576, 41486, 58524, 54508, 20707, 58504, 39642, 22454, 80069, 83455, 31043, 90794, 51934, 3295, 26582, 16300, 74990, 22197, 83310, 69642, 81113, 58558, 84833, 17105, 46659, 25003, 85749, 44829, 4103, 67516, 76458, 52392, 53546, 70291, 98846, 67315, 30686, 18555, 29755, 5923, 22732, 19501, 56181, 85351, 5023, 4808, 56911, 16793, 75336, 49712, 27723, 96974, 34321, 5454, 12862, 71924, 45928, 95697, 68664, 58183, 78104, 42483, 71204, 99628, 40642, 56410, 17350, 13396, 76724, 87509, 9158, 83708, 27298, 92651, 95086, 38851, 63558, 89810, 1580, 32518, 35795, 26514, 56322, 78635, 63731, 91428, 7247, 66460, 38671, 26799, 22549, 47991, 46064, 80467, 40083, 17141, 39152, 99872, 27561, 75389, 74778, 94893, 82935, 99076, 93419, 10474, 84436, 47536, 16719, 60136, 80566, 28404, 74525, 74212, 3704, 65516, 98197, 34210, 64140, 22238, 49939, 99542, 27481, 21992, 78181, 90060, 71365, 66935, 29578, 14961, 8569, 9454, 43308, 66753, 45972, 93572, 16382, 87320, 37183, 25478, 38164, 31997, 69856, 60898, 63968, 62264, 4799, 17591, 89937, 73905, 55890, 88285, 2448, 40398, 54180, 65869, 45155, 43407, 39105, 339, 51619, 20203, 21189, 68245, 76912, 1222, 76411, 82679, 7, 66047, 32043, 42627, 16638, 27019, 15248, 66444, 8249, 18790, 82150, 54084, 84469, 3426, 50226, 99868, 88894, 43769, 66384, 8593, 41414, 2976, 60053, 51866, 87904, 74135, 53842, 59520, 67482, 16995, 32328, 29555, 49067, 2799, 68851, 41049, 97190, 53984, 99755, 46412, 45885, 64e3, 21962, 36438, 71742, 57223, 66599, 86071, 31436, 32667, 98099, 38399, 47377, 5171, 2742, 48803, 17823, 22093, 9866, 691, 5514, 25546, 2114, 5919, 56181, 96052, 67211, 61712, 25995, 3188, 23833, 38549, 44775, 55355, 61548, 55988, 47309, 23749, 30667, 70732, 33299, 16127, 30842, 78961, 41072, 9876, 18903, 30292, 25275, 61881, 15939, 72573, 84502, 92654, 97226, 53434, 77025, 63892, 12421, 33644, 39445, 30933, 84218, 13757, 37719, 84450, 2697, 60309, 22402, 80310, 92771, 45205, 72792, 95776, 85945, 74651, 216, 50842, 47854, 21916, 61588, 75405, 10495, 83083, 60427, 78495, 99809, 47890, 22993, 21508, 9459, 26845, 98130, 1184, 46438, 27698, 40652, 65654, 98517, 1096, 6998, 49133, 57041, 77983, 58708, 42176, 67356, 324, 70063, 10597, 65205, 25622, 34336, 16640, 27896, 26907, 86760, 48244, 89650, 44997, 51609, 28934, 9171, 97859, 97213, 19859, 41037, 64081, 94781, 27683, 41521, 52871, 86935, 26486, 38744, 25943, 60617, 6414, 42292, 46204, 53262, 30201, 38776, 88831, 97253, 67282, 72860, 18452, 60927, 81504, 57713, 30296, 10896, 39900, 67135, 42772, 4631, 55283, 39253, 25264, 1809, 12874, 88035, 88421, 90491, 83290, 6884, 15444, 90113, 20406, 20796, 40239, 34431, 15018, 45600, 17241, 26611, 9551, 89126, 65673, 31708, 91252, 39647, 63011, 24193, 58932, 89326, 33491, 53217, 27976, 70151, 37531, 53576, 23931, 11789, 73073, 52171, 89301, 51718, 15385, 79487, 66436, 35771, 34163, 86540, 42665, 80748, 77622, 14679, 40185, 25030, 42622, 13162, 17048, 24243, 59985, 59807, 60562, 3595, 10135, 29199, 69784, 59796, 38194, 58432, 50943, 40422, 63035, 3208, 81440, 90749, 88046, 32218, 88092, 22224, 2627, 91576, 16781, 43948, 57795, 71073, 27817, 87077, 82717, 24473, 42096, 76920, 88864, 90537, 14715, 42551, 45066, 24316, 37361, 38582, 21871, 14672, 93362, 21727, 57021, 94313, 39562, 64985, 94028, 46094, 43845, 91838, 79574, 7597, 3153, 56783, 18817, 74711, 6883, 91061, 31674, 73729, 99315, 66183, 57647, 74484, 68077, 33224, 397, 56753, 53158, 71872, 68153, 9298, 20961, 49656, 33407, 95683, 14328, 44708, 72952, 27048, 67887, 28741, 46752, 88177, 95894, 40086, 88534, 87112, 68614, 83073, 88794, 96799, 67588, 75049, 84603, 83140, 97347, 87316, 73087, 77135, 71883, 98643, 3808, 8848, 14133, 60447, 1366, 72976, 1868, 51667, 63279, 60040, 88264, 79152, 3474, 61366, 20523, 21584, 93712, 83654, 89761, 90154, 96345, 37539, 32556, 74254, 70603, 97122, 44978, 78028, 8943, 13778, 11080, 34271, 68276, 85372, 48410, 94516, 15427, 75323, 71685, 70774, 50342, 33771, 3678, 42321, 69788, 41758, 55004, 30992, 17402, 63523, 42328, 87171, 24751, 15084, 33884, 83655, 88345, 69602, 52606, 57886, 18034, 3381, 75796, 35901, 77480, 28683, 68324, 66035, 7223, 14926, 16128, 13645, 90370, 31949, 11057, 98849, 29499, 21565, 30786, 83292, 92392, 37104, 36899, 49906, 79368, 43710, 80365, 88735, 75275, 21664, 57965, 19002, 301, 12658, 94385, 1717, 96191, 50404, 80166, 93965, 24688, 27839, 10812, 31715, 92127, 42588, 93307, 80834, 11317, 26583, 25769, 98227, 14884, 58462, 29148, 68662, 26872, 72927, 79021, 51622, 29521, 33355, 45701, 45996, 33782, 93424, 16530, 96086, 17329, 74020, 11501, 46660, 5583, 22277, 77653, 55430, 84644, 448, 86828, 58855, 67451, 95264, 67386, 82424, 52611, 60012, 88620, 72894, 94716, 22262, 99813, 69592, 63464, 33163, 91857, 47904, 22209, 78590, 68615, 52952, 31441, 41313, 18550, 72685, 68825, 4795, 53971, 14592, 39634, 23682, 76630, 2731, 81481, 86542, 23727, 54291, 56045, 61635, 32186, 9355, 73416, 63532, 24340, 18886, 84832, 30654, 48543, 18339, 65024, 91197, 64624, 74648, 9660, 27897, 49771, 11123, 8732, 49393, 12911, 72416, 17834, 18878, 62754, 85072, 23727, 56577, 51257, 83291, 12329, 16203, 91681, 68137, 79959, 43609, 58987, 2026, 42969, 59144, 84349, 75214, 76972, 22633, 64104, 53799, 16851, 99197, 70476, 77113, 46320, 88693, 37711, 96536, 68156, 7119, 2104, 49435, 77706, 18924, 24957, 92406, 87148, 70482, 36491, 42605, 54440, 7893, 31618, 35707, 65130, 30007, 75706, 77266, 37100, 9601, 87681, 42543, 69847, 81848, 32034, 49429, 99434, 62209, 17125, 55227, 61634, 52574, 83649, 28725, 70119, 62467, 80676, 21192, 99584, 21310, 25292, 72781, 17186, 10393, 98390, 19789, 92931, 36234, 62627, 23437, 3885, 58822, 82941, 43806, 8172, 23790, 72295, 36196, 98200, 2889, 87619, 13846, 56197, 27151, 21238, 48794, 81100, 62643, 40001, 39243, 33213, 78416, 194, 91369, 79342, 36404, 52308, 13741, 24442, 88610, 12659, 11574, 70052, 93039, 79367, 41792, 61816, 35435, 47192, 97596, 28330, 41145, 16918, 62865, 9576, 45857, 68737, 90124, 16703, 7071, 48433, 57222, 34435, 800, 72496, 16449, 68187, 28739, 97672, 86818, 50768, 40807, 88681, 64340, 2224, 19703, 59245, 90905, 31239, 84216, 93942, 97371, 16842, 92168, 52692, 16064, 84686, 89444, 27938, 98406, 41365, 4515, 20494, 18813, 16242, 10634, 61566, 18592, 78057, 8720, 33739, 78345, 87693, 30242, 70545, 55521, 23687, 9160, 8655, 38811, 61768, 7228, 5567, 5561, 82071, 85, 50145, 23113, 97761, 88441, 14891, 72188, 85166, 37189, 75671, 81377, 92470, 73645, 93258, 6610, 12185, 43065, 26704, 47922, 56650, 7527, 18006, 56948, 51675, 16658, 66402, 1047, 81624, 77395, 62310, 73262, 66050, 57275, 32936, 87641, 51528, 58183, 21952, 84098, 28913, 28622, 18140, 89796, 41317, 93954, 67690, 64667, 57092, 21315, 4731, 76115, 77291, 11204, 8634, 93034, 27411, 27149, 13843, 9817, 9407, 84492, 28444, 59901, 14592, 89654, 66207, 66232, 80293, 74502, 36925, 55515, 10121, 16768, 4720, 71502, 40500, 21406, 571, 87320, 81683, 42788, 86367, 44686, 22159, 67015, 35892, 49668, 83991, 72088, 30210, 74009, 86370, 97956, 2132, 93512, 54819, 26094, 51409, 21485, 94764, 85806, 13393, 48543, 7042, 76538, 64224, 47909, 9994, 23750, 17351, 52141, 30486, 60380, 86546, 66606, 36913, 58173, 45709, 83679, 82617, 23381, 9603, 61107, 566, 6572, 64745, 10614, 86371, 43244, 97154, 10397, 50975, 68006, 20045, 16942, 25536, 74031, 31807, 70133, 78790, 40341, 68730, 39635, 39013, 66841, 44043, 96215, 21270, 59427, 25034, 40645, 84741, 52083, 54503, 36861, 27659, 95463, 53847, 40921, 70116, 61536, 56756, 8967, 31079, 20097, 76014, 99818, 16606, 19713, 66904, 27106, 24874, 96701, 73287, 76772, 6073, 57343, 51428, 91171, 28299, 17520, 64903, 4177, 36071, 94952, 59008, 28543, 11576, 74547, 13260, 20688, 41261, 2780, 6633, 37536, 8844, 95774, 49323, 30448, 14154, 83379, 71259, 23302, 68402, 43750, 88505, 15575, 44927, 6584, 29867, 21541, 65763, 12154, 86616, 79877, 73259, 68626, 98962, 68548, 86576, 48046, 51755, 64995, 3661, 64585, 81550, 46798, 49319, 50206, 22024, 5175, 12923, 23427, 55915, 91723, 55831, 83784, 81034, 86779, 34622, 84570, 18960, 48798, 42970, 95789, 39465, 82353, 68905, 44234, 18244, 54345, 5592, 89361, 14644, 67924, 66415, 89349, 88530, 72096, 44459, 5258, 48317, 48866, 56886, 90458, 75889, 4514, 37227, 11302, 4667, 2129, 80414, 86289, 15887, 87380, 50749, 83220, 50529, 20619, 11606, 36531, 23409, 78122, 19566, 76564, 33045, 66703, 30017, 35347, 35038, 12952, 13971, 3922, 98702, 11786, 38388, 69556, 76728, 60535, 59961, 23634, 42211, 98387, 34880, 27755, 93182, 99040, 96390, 65989, 38375, 3652, 59657, 57431, 24666, 11061, 64713, 85185, 72849, 58611, 31220, 26657, 77056, 24553, 24993, 5210, 89024, 32054, 46997, 92652, 28363, 98992, 22593, 97710, 47766, 37646, 93573, 95502, 33790, 92973, 27766, 62671, 89698, 10877, 73893, 41004, 96035, 18795, 48080, 59666, 30241, 35233, 87353, 43647, 13404, 41982, 19264, 29229, 61369, 8309, 39383, 42305, 25944, 13577, 51545, 68990, 69801, 37145, 79189, 55897, 57793, 66816, 21930, 56771, 79296, 73793, 21632, 42301, 23696, 72641, 56310, 85576, 3004, 25669, 69221, 32996, 23040, 65782, 23712, 13414, 10758, 15590, 97298, 74246, 51511, 46900, 36795, 38292, 3852, 6384, 84421, 3446, 91670, 45312, 27609, 87034, 6683, 83891, 88991, 16533, 9197, 34427, 60384, 48525, 90978, 46107, 21693, 12956, 21804, 46558, 37682, 81207, 85840, 53238, 35026, 4835, 53264, 41376, 17783, 64756, 39278, 25403, 33042, 20954, 31193, 24247, 45911, 92453, 25370, 86602, 48574, 57865, 26436, 16122, 76614, 17028, 21262, 59718, 77821, 14036, 31033, 90563, 45410, 15158, 90209, 84089, 38053, 60780, 54166, 14255, 33120, 27171, 71798, 91214, 80040, 56699, 12475, 40193, 59415, 4769, 75920, 1036, 2692, 75862, 16612, 73670, 61182, 3305, 90334, 187, 91659, 28063, 75684, 50017, 82643, 9282, 77376, 85469, 8164, 5584, 36623, 82597, 83859, 3435, 98460, 70095, 80257, 4381, 6501, 8924, 35514, 14297, 54373, 71369, 5172, 15955, 82441, 4636, 48215, 6821, 3385, 17663, 40107, 55679, 30366, 42390, 95895, 16083, 58499, 17176, 55993, 51034, 49296, 4010, 78974, 35930, 2019, 96226, 27167, 68245, 53109, 59037, 37843, 79243, 10262, 58797, 61490, 82590, 52411, 54783, 29447, 94551, 30026, 97959, 93939, 73217, 82573, 62154, 78291, 33728, 39102, 11484, 86210, 43794, 73553, 87435, 1110, 77108, 56521, 78610, 8254, 1842, 43068, 70415, 79195, 26136, 49786, 47279, 38471, 20379, 54704, 86614, 91138, 51595, 50818, 80186, 73087, 17262, 94735, 4952, 27935, 4928, 74862, 51392, 62388, 9570, 38485, 30594, 56278, 47395, 72762, 94597, 72279, 16010, 34697, 54475, 67874, 78014, 88381, 4045, 41494, 55178, 46054, 24373, 1824, 55333, 7525, 97908, 61178, 84635, 2199, 35361, 4803, 21907, 79414, 66083, 54782, 58692, 28332, 41851, 28198, 55819, 37313, 67046, 16147, 90478, 71230, 34141, 85002, 44332, 35906, 429, 39744, 773, 22909, 19536, 98986, 90945, 45209, 85439, 92265, 25291, 22775, 60611, 49159, 95701, 36113, 53923, 60824, 84935, 29656, 50007, 86624, 61691, 76150, 32187, 42765, 60660, 13859, 10792, 88210, 29374, 29563, 45188, 28811, 19739, 67649, 73775, 99247, 48414, 91067, 68253, 9452, 90116, 91737, 73979, 62370, 69112, 58791, 20349, 71480, 56852, 36919, 87977, 77609, 68738, 85159, 4918, 70076, 46473, 4122, 57713, 1426, 50987, 77910, 66211, 62546, 77749, 96462, 34304, 77441, 12104, 91805, 10287, 60943, 49632, 83116, 25716, 23113, 22707, 77770, 31176, 6759, 46130, 4739, 55554, 3843, 31653, 70834, 72877, 41561, 36903, 23010, 6663, 2266, 16360, 70118, 91936, 17098, 77278, 4880, 23484, 94970, 41826, 46733, 93484, 68350, 38861, 18134, 32936, 241, 24803, 13876, 93278, 5039, 35873, 44418, 5305, 28510, 36115, 46717, 15238, 78607, 23464, 68635, 55712, 55007, 92411, 65739, 4858, 67537, 37041, 67453, 89801, 45963, 14800, 14225, 65655, 80463, 9716, 77255, 65136, 11230, 76323, 81433, 36445, 86523, 61058, 59560, 19380, 40791, 48073, 29626, 36661, 87907, 57369, 41623, 13705, 3880, 45088, 55444, 41003, 27754, 1450, 75312, 71801, 99600, 60719, 54182, 29245, 63315, 73758, 42973, 32702, 10855, 56363, 14638, 84424, 27178, 78195, 3133, 70865, 48019, 26117, 7151, 52107, 85562, 41347, 50486, 69457, 86961, 95482, 11857, 93587, 45680, 42145, 13029, 10043, 5142, 49213, 54525, 85761, 42707, 70754, 33768, 87671, 85038, 58900, 88438, 20004, 63390, 14815, 38875, 73417, 82875, 89481, 55517, 944, 15773, 61814, 32915, 27868, 5510, 21916, 28426, 89881, 16680, 88850, 11056, 51991, 4230, 39107, 49216, 40065, 4523, 75848, 95349, 56034, 10724, 9885, 88232, 42478, 65702, 95696, 39746, 66032, 88082, 86905, 30007, 75068, 66629, 7358, 26706, 90511, 72843, 67857, 20061, 98581, 69682, 38e3, 14186, 70, 2290, 17269, 30909, 69449, 19997, 13275, 2444, 84985, 51290, 97641, 15092, 69650, 21920, 19617, 7418, 49725, 91090, 20805, 28627, 80665, 67192, 34697, 57667, 99323, 50101, 40587, 35081, 14037, 34414, 19898, 60779, 83267, 87499, 29596, 41852, 15813, 32419, 72232, 8322, 39184, 46525, 13833, 65743, 94595, 37363, 4711, 35386, 96413, 10627, 62625, 56555, 12919, 93218, 25191, 98380, 51923, 66181, 5788, 73491, 1452, 487, 12277, 45415, 11884, 61300, 94528, 9181, 26616, 11455, 31514, 63290, 45035, 42759, 33804, 85721, 80979, 46010, 50975, 72482, 31231, 3086, 58941, 46102, 25773, 89742, 29788, 96741, 88523, 14922, 88262, 76305, 57676, 93259, 2396, 69145, 26074, 30056, 3853, 75317, 56639, 66203, 38923, 48939, 22813, 91864, 10934, 6714, 84099, 25631, 73223, 95630, 97552, 45950, 22197, 42886, 33764, 1263, 41856, 82057, 62349, 94091, 78028, 62651, 18911, 5693, 92561, 97821, 41994, 92343, 76785, 22216, 4203, 5038, 86151, 23596, 24338, 77181, 51761, 97693, 10955, 98159, 37568, 58932, 72128, 27303, 99608, 31688, 57557, 91022, 43036, 93927, 32869, 53653, 55205, 33139, 47271, 31224, 51650, 36422, 86857, 73799, 22068, 43376, 84760, 44898, 65776, 42451, 71480, 38509, 41673, 44141, 75918, 95652, 68981, 83001, 48815, 98086, 67950, 27986, 33175, 43624, 55274, 71051, 61124, 51550, 64967, 31570, 15748, 19159, 38174, 51078, 79811, 39183, 57527, 96550, 85168, 28824, 47466, 56993, 13151, 96664, 29735, 70251, 1079, 4314, 77714, 11507, 1440, 48415, 31984, 99915, 20282, 26524, 18057, 4992, 40521, 98108, 84045, 91961, 79256, 72244, 25788, 5487, 23595, 73302, 14205, 8925, 27625, 64343, 28821, 37992, 67156, 83320, 31106, 10884, 30735, 15067, 51091, 15668, 48777, 50770, 19169, 76504, 41165, 29749, 92812, 8065, 66782, 26841, 1411, 95461, 61134, 18699, 52261, 60469, 81373, 44825, 11448, 73320, 30151, 56991, 31372, 6655, 36472, 86292, 30247, 30931, 21029, 53410, 9859, 37267, 47514, 3492, 49008, 94727, 25234, 40546, 53417, 36492, 25723, 76227, 58456, 15979, 34876, 9574, 34392, 3751, 36933, 83921, 65108, 63135, 67572, 40184, 21098], l = new Array(16), h = [16, 8, 16, 24], f = 4, p = 0; !function () { for (var t = 0; t < 16; t++) { l[t] = new Array(256); for (var e = 0; e < 256; e++)l[t][e] = e | e << 8 | e << 16 | e << 24 | 0; for (var n = 3; 0 <= n; n--)for (var r = 0; r < 255; r++) { var i = 255 << (n << 3), o = 0 | l[t][r], s = function (t, e) { var n = e - t + 1, r = 0, i = 1; do { for (r = 0, i = 1; i < n; i *= 10)r = 10 * r + (f < 0 && (f = 4, p++), u[p] % Math.pow(10, f + 1) / Math.pow(10, f--) | 0) } while ((i / n | 0) * n <= r); return t + r % n | 0 }(r, 255); l[t][r] = l[t][r] & ~i | l[t][s] & i | 0, l[t][s] = l[t][s] & ~i | o & i | 0 } } }(); (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) })(d, r.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(d.prototype, [{ key: "reset", value: function () { o(s(d.prototype), "reset", this).call(this), this.state.hash = new Array(this.options.length / 32 | 0); for (var t = 0; t < this.state.hash.length; t++)this.state.hash[t] = 0 } }, { key: "processBlock", value: function (t) { for (var e = 0; e < this.state.hash.length; e++)this.W[e] = 0 | this.state.hash[e]; for (var n = this.state.hash.length; n < 16; n++)this.W[n] = 0 | t[n - this.state.hash.length]; for (var r = 0; r < this.options.rounds << 1; r += 2)for (var i = 0; i < 4; i++) { for (var o = 0; o < 16; o++) { var s = 0 | l[r + (o / 2 | 0) % 2][255 & this.W[o]]; this.W[o - 1 >>> 0 & 15] ^= s, this.W[o + 1 & 15] ^= s } for (var a = 0; a < 16; a++)this.W[a] = Object(c.b)(this.W[a], h[i]) } for (var u = 0; u < this.state.hash.length; u++)this.state.hash[u] = this.state.hash[u] ^ this.W[15 - u] | 0 } }, { key: "finalize", value: function () { return 0 < this.state.message.length && this.addPaddingZero(this.blockSizeInBytes - this.state.message.length | 0), this.addPaddingZero(this.blockSizeInBytes - 8 | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), r = d; function d(t) { var e; return function (t) { if (!(t instanceof d)) throw new TypeError("Cannot call a class as a function") }(this), (t = t || {}).length = t.length || 128, t.rounds = t.rounds || 8, e = this, (t = !(t = s(d).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).blockSize = 16 - t.state.hash.length, t.blockSizeInBytes = t.blockSize * t.unitSize, t.W = new Array(16), t } e.a = r }, function (t, e, n) { "use strict"; var r = n(5), u = n(0); function i(t) { return (i = "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 })(t) } function o(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } function s(t, e, n) { return (s = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = a(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function a(t) { return (a = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function c(t, e) { return (c = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } for (var l = [[7, 12, 17, 22], [5, 9, 14, 20], [4, 11, 16, 23], [6, 10, 15, 21]], h = new Array(64), f = 0; f < 64; f++)h[f] = 4294967296 * Math.abs(Math.sin(f + 1)) | 0; (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && c(t, e) })(p, r.a), n = [{ key: "FF", value: function (t, e, n) { return t & e | ~t & n } }, { key: "GG", value: function (t, e, n) { return t & n | e & ~n } }, { key: "HH", value: function (t, e, n) { return t ^ e ^ n } }, { key: "II", value: function (t, e, n) { return e ^ (t | ~n) } }, { key: "CC", value: function (t, e, n, r, i, o, s, a) { return Object(u.a)(n + t(r, i, o) + s + e, a) + r | 0 } }], o((r = p).prototype, [{ key: "reset", value: function () { s(a(p.prototype), "reset", this).call(this), this.state.hash = [1732584193, -271733879, -1732584194, 271733878] } }, { key: "processBlock", value: function (t) { var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], e = p.CC(p.FF, h[0], e, n, r, i, t[0], l[0][0]), i = p.CC(p.FF, h[1], i, e, n, r, t[1], l[0][1]), r = p.CC(p.FF, h[2], r, i, e, n, t[2], l[0][2]), n = p.CC(p.FF, h[3], n, r, i, e, t[3], l[0][3]); e = p.CC(p.FF, h[4], e, n, r, i, t[4], l[0][0]), i = p.CC(p.FF, h[5], i, e, n, r, t[5], l[0][1]), r = p.CC(p.FF, h[6], r, i, e, n, t[6], l[0][2]), n = p.CC(p.FF, h[7], n, r, i, e, t[7], l[0][3]), e = p.CC(p.FF, h[8], e, n, r, i, t[8], l[0][0]), i = p.CC(p.FF, h[9], i, e, n, r, t[9], l[0][1]), r = p.CC(p.FF, h[10], r, i, e, n, t[10], l[0][2]), n = p.CC(p.FF, h[11], n, r, i, e, t[11], l[0][3]), e = p.CC(p.FF, h[12], e, n, r, i, t[12], l[0][0]), i = p.CC(p.FF, h[13], i, e, n, r, t[13], l[0][1]), r = p.CC(p.FF, h[14], r, i, e, n, t[14], l[0][2]), n = p.CC(p.FF, h[15], n, r, i, e, t[15], l[0][3]), e = p.CC(p.GG, h[16], e, n, r, i, t[1], l[1][0]), i = p.CC(p.GG, h[17], i, e, n, r, t[6], l[1][1]), r = p.CC(p.GG, h[18], r, i, e, n, t[11], l[1][2]), n = p.CC(p.GG, h[19], n, r, i, e, t[0], l[1][3]), e = p.CC(p.GG, h[20], e, n, r, i, t[5], l[1][0]), i = p.CC(p.GG, h[21], i, e, n, r, t[10], l[1][1]), r = p.CC(p.GG, h[22], r, i, e, n, t[15], l[1][2]), n = p.CC(p.GG, h[23], n, r, i, e, t[4], l[1][3]), e = p.CC(p.GG, h[24], e, n, r, i, t[9], l[1][0]), i = p.CC(p.GG, h[25], i, e, n, r, t[14], l[1][1]), r = p.CC(p.GG, h[26], r, i, e, n, t[3], l[1][2]), n = p.CC(p.GG, h[27], n, r, i, e, t[8], l[1][3]), e = p.CC(p.GG, h[28], e, n, r, i, t[13], l[1][0]), i = p.CC(p.GG, h[29], i, e, n, r, t[2], l[1][1]), r = p.CC(p.GG, h[30], r, i, e, n, t[7], l[1][2]), n = p.CC(p.GG, h[31], n, r, i, e, t[12], l[1][3]), e = p.CC(p.HH, h[32], e, n, r, i, t[5], l[2][0]), i = p.CC(p.HH, h[33], i, e, n, r, t[8], l[2][1]), r = p.CC(p.HH, h[34], r, i, e, n, t[11], l[2][2]), n = p.CC(p.HH, h[35], n, r, i, e, t[14], l[2][3]), e = p.CC(p.HH, h[36], e, n, r, i, t[1], l[2][0]), i = p.CC(p.HH, h[37], i, e, n, r, t[4], l[2][1]), r = p.CC(p.HH, h[38], r, i, e, n, t[7], l[2][2]), n = p.CC(p.HH, h[39], n, r, i, e, t[10], l[2][3]), e = p.CC(p.HH, h[40], e, n, r, i, t[13], l[2][0]), i = p.CC(p.HH, h[41], i, e, n, r, t[0], l[2][1]), r = p.CC(p.HH, h[42], r, i, e, n, t[3], l[2][2]), n = p.CC(p.HH, h[43], n, r, i, e, t[6], l[2][3]), e = p.CC(p.HH, h[44], e, n, r, i, t[9], l[2][0]), i = p.CC(p.HH, h[45], i, e, n, r, t[12], l[2][1]), r = p.CC(p.HH, h[46], r, i, e, n, t[15], l[2][2]), n = p.CC(p.HH, h[47], n, r, i, e, t[2], l[2][3]), e = p.CC(p.II, h[48], e, n, r, i, t[0], l[3][0]), i = p.CC(p.II, h[49], i, e, n, r, t[7], l[3][1]), r = p.CC(p.II, h[50], r, i, e, n, t[14], l[3][2]), n = p.CC(p.II, h[51], n, r, i, e, t[5], l[3][3]), e = p.CC(p.II, h[52], e, n, r, i, t[12], l[3][0]), i = p.CC(p.II, h[53], i, e, n, r, t[3], l[3][1]), r = p.CC(p.II, h[54], r, i, e, n, t[10], l[3][2]), n = p.CC(p.II, h[55], n, r, i, e, t[1], l[3][3]), e = p.CC(p.II, h[56], e, n, r, i, t[8], l[3][0]), i = p.CC(p.II, h[57], i, e, n, r, t[15], l[3][1]), r = p.CC(p.II, h[58], r, i, e, n, t[6], l[3][2]), n = p.CC(p.II, h[59], n, r, i, e, t[13], l[3][3]), e = p.CC(p.II, h[60], e, n, r, i, t[4], l[3][0]), i = p.CC(p.II, h[61], i, e, n, r, t[11], l[3][1]), r = p.CC(p.II, h[62], r, i, e, n, t[2], l[3][2]), n = p.CC(p.II, h[63], n, r, i, e, t[9], l[3][3]), this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), o(r, n), n = p; function p() { return function (t) { if (!(t instanceof p)) throw new TypeError("Cannot call a class as a function") }(this), t = this, !(e = a(p).apply(this, arguments)) || "object" !== i(e) && "function" != typeof e ? function () { if (void 0 !== t) return t; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : e; var t, e } e.a = n }, function (t, e, n) { "use strict"; var r = n(3), u = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var c = [1518500249, 1859775393, 2400959708, 3395469782], r = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) }(l, r.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(l.prototype, [{ key: "reset", value: function () { o(s(l.prototype), "reset", this).call(this), this.state.hash = [1732584193, -271733879, -1732584194, 271733878, -1009589776] } }, { key: "processBlock", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0; s < this.options.rounds; s++) { this.W[s] = s < 16 ? 0 | t[s] : 0 | Object(u.a)(this.W[s - 3] ^ this.W[s - 8] ^ this.W[s - 14] ^ this.W[s - 16], 1); var a = Object(u.a)(e, 5) + o + this.W[s] + c[s / 20 >> 0] | 0, a = s < 20 ? a + (n & r | ~n & i) | 0 : !(s < 40) && s < 60 ? a + (n & r | n & i | r & i) | 0 : a + (n ^ r ^ i) | 0, o = i, i = r, r = 0 | Object(u.a)(n, 30), n = e, e = a } this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), l); function l(t) { var e; return function (t) { if (!(t instanceof l)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = s(l).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).options.rounds = t.options.rounds || 80, t.W = new Array(80), t } e.a = r }, function (t, e, n) { "use strict"; var c = n(0), n = n(3); function r(t) { return (r = "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 })(t) } function i(t, e, n) { return (i = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = o(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function o(t) { return (o = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function s(t, e) { return (s = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var a = new Array(256), u = [104, 208, 235, 43, 72, 157, 106, 228, 227, 163, 86, 129, 125, 241, 133, 158, 44, 142, 120, 202, 23, 169, 97, 213, 93, 11, 140, 60, 119, 81, 34, 66, 63, 84, 65, 128, 204, 134, 179, 24, 46, 87, 6, 98, 244, 54, 209, 107, 27, 101, 117, 16, 218, 73, 38, 249, 203, 102, 231, 186, 174, 80, 82, 171, 5, 240, 13, 115, 59, 4, 32, 254, 221, 245, 180, 95, 10, 181, 192, 160, 113, 165, 45, 96, 114, 147, 57, 8, 131, 33, 92, 135, 177, 224, 0, 195, 18, 145, 138, 2, 28, 230, 69, 194, 196, 253, 191, 68, 161, 76, 51, 197, 132, 35, 124, 176, 37, 21, 53, 105, 255, 148, 77, 112, 162, 175, 205, 214, 108, 183, 248, 9, 243, 103, 164, 234, 236, 182, 212, 210, 20, 30, 225, 36, 56, 198, 219, 75, 122, 58, 222, 94, 223, 149, 252, 170, 215, 206, 7, 15, 61, 88, 154, 152, 156, 242, 167, 17, 126, 139, 67, 3, 226, 220, 229, 178, 78, 199, 109, 233, 39, 64, 216, 55, 146, 143, 1, 29, 83, 62, 89, 193, 79, 50, 22, 250, 116, 251, 99, 159, 52, 26, 42, 90, 141, 201, 207, 246, 144, 40, 136, 155, 49, 14, 189, 74, 232, 150, 166, 12, 200, 121, 188, 190, 239, 110, 70, 151, 91, 237, 25, 217, 172, 153, 168, 41, 100, 31, 173, 85, 19, 187, 247, 111, 185, 71, 47, 238, 184, 123, 137, 48, 211, 127, 118, 130], l = [1, 11, 9, 12, 13, 6, 15, 3, 14, 8, 7, 4, 10, 2, 5, 0], h = [7, 12, 11, 13, 14, 4, 9, 15, 6, 3, 8, 10, 2, 5, 1, 0], f = new Array(16), p = [1, 1, 4, 1, 8, 5, 2, 9], d = [1, 1, 3, 1, 5, 8, 9, 5], g = new Array(512), m = new Array(22), v = new Array(512), y = new Array(22), b = new Array(512), w = new Array(22); function _(t, e) { for (var n = new Array(512), r = new Array(22), i = 0; i < 8; i++)n[i] = []; for (var o = 0; o < 256; o++) { var s = new Array(10); s[1] = t[o], s[2] = s[1] << 1, 256 <= s[2] && (s[2] ^= 285), s[3] = s[2] ^ s[1], s[4] = s[2] << 1, 256 <= s[4] && (s[4] ^= 285), s[5] = s[4] ^ s[1], s[8] = s[4] << 1, 256 <= s[8] && (s[8] ^= 285), s[9] = s[8] ^ s[1], n[0][2 * o] = s[e[0]] << 24 | s[e[1]] << 16 | s[e[2]] << 8 | s[e[3]], n[0][2 * o + 1] = s[e[4]] << 24 | s[e[5]] << 16 | s[e[6]] << 8 | s[e[7]]; for (var a = 1; a < 8; a++)n[a][2 * o] = Object(c.d)(n[0][2 * o + 1], n[0][2 * o], a << 3), n[a][2 * o + 1] = Object(c.c)(n[0][2 * o + 1], n[0][2 * o], a << 3) } r[0] = 0, r[1] = 0; for (var u = 1; u <= 10; u++)r[2 * u] = 4278190080 & n[0][16 * u - 16] ^ 16711680 & n[1][16 * u - 14] ^ 65280 & n[2][16 * u - 12] ^ 255 & n[3][16 * u - 10], r[2 * u + 1] = 4278190080 & n[4][16 * u - 7] ^ 16711680 & n[5][16 * u - 5] ^ 65280 & n[6][16 * u - 3] ^ 255 & n[7][16 * u - 1]; return [n, r] } !function () { !function () { for (var t = 0; t < 16; t++)f[l[t]] = 0 | t; for (var e = 0; e < 256; e++) { var n = l[e >> 4], r = f[15 & e], i = h[n ^ r]; a[e] = l[n ^ i] << 4 | f[r ^ i] } }(); var t = _(u, d); v = t[0], y = t[1], t = _(a, d), b = t[0], w = t[1], t = _(a, p), g = t[0], m = t[1] }(); (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && s(t, e) })(x, n.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(x.prototype, [{ key: "reset", value: function () { i(o(x.prototype), "reset", this).call(this), this.state.hash = new Array(16); for (var t = 0; t < 16; t++)this.state.hash[t] = 0 } }, { key: "processBlock", value: function (t) { for (var e = new Array(16), n = [], r = 0; r < 16; r++)n[r] = t[r] ^ (e[r] = this.state.hash[r]) | 0; for (var i = [], o = 1; o <= this.options.rounds; o++) { for (var s = 0; s < 8; s++) { i[2 * s] = 0; for (var a = i[2 * s + 1] = 0, u = 56, c = 0; a < 8; a++, c = (u -= 8) < 32 ? 1 : 0)i[2 * s] ^= this.C[a][2 * (e[2 * (s - a & 7) + c] >>> u % 32 & 255)], i[2 * s + 1] ^= this.C[a][2 * (e[2 * (s - a & 7) + c] >>> u % 32 & 255) + 1] } for (var l = 0; l < 16; l++)e[l] = i[l]; e[0] ^= this.RC[2 * o], e[1] ^= this.RC[2 * o + 1]; for (var h = 0; h < 8; h++) { i[2 * h] = e[2 * h], i[2 * h + 1] = e[2 * h + 1]; for (var f = 0, p = 56, d = 0; f < 8; f++, d = (p -= 8) < 32 ? 1 : 0)i[2 * h] ^= this.C[f][2 * (n[2 * (h - f & 7) + d] >>> p % 32 & 255)], i[2 * h + 1] ^= this.C[f][2 * (n[2 * (h - f & 7) + d] >>> p % 32 & 255) + 1] } for (var g = 0; g < 16; g++)n[g] = i[g] } for (var m = 0; m < 16; m++)this.state.hash[m] ^= n[m] ^ t[m] } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 32 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), n = x; function x(t) { var e, n; switch (function (t) { if (!(t instanceof x)) throw new TypeError("Cannot call a class as a function") }(this), (t = t || {}).type = t.type || "", t.rounds = t.rounds || 10, n = this, (e = !(t = o(x).call(this, t)) || "object" !== r(t) && "function" != typeof t ? function () { if (void 0 !== n) return n; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).options.type) { case "0": case 0: e.C = v, e.RC = y; break; case "t": e.C = b, e.RC = w; break; default: e.C = g, e.RC = m }return e } e.a = n }, function (t, e, n) { "use strict"; function r(t) { return (r = "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 })(t) } function i(t) { return (i = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function o(t, e) { return (o = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && o(t, e) })(s, n(4).a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(s.prototype, [{ key: "process", value: function () { for (; this.state.message.length >= this.blockSizeInBytes;) { this.blockUnits = new Array(this.blockSizeInBytes); for (var t = 0; t < this.blockSizeInBytes; t++)this.blockUnits[t] = 0 | this.state.message.charCodeAt(t); this.state.message = this.state.message.substr(this.blockSizeInBytes), this.processBlock(this.blockUnits) } } }, { key: "processBlock", value: function (t) { } }, { key: "getStateHash", value: function (t) { t = t || this.state.hash.length; for (var e = "", n = 0; n < t; n++)e += String.fromCharCode(255 & this.state.hash[n]); return e } }]), n = s; function s(t) { var e; return function (t) { if (!(t instanceof s)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = i(s).call(this, t)) || "object" !== r(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).unitSize = 1, t.blockSizeInBytes = t.blockSize * t.unitSize, t.blockUnits = [], t } function a(t) { return (a = "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 })(t) } function u(t, e, n) { return (u = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = c(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function c(t) { return (c = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function l(t, e) { return (l = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var h = [41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20], n = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), l(t, e) }(f, n), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(f.prototype, [{ key: "reset", value: function () { u(c(f.prototype), "reset", this).call(this), this.state.hash = new Array(48), this.state.checksum = new Array(16) } }, { key: "processBlock", value: function (t) { for (var e = 0; e < 16; e++)this.state.hash[16 + e] = 0 | t[e], this.state.hash[32 + e] = t[e] ^ this.state.hash[e]; for (var n = 0, r = 0; r < this.options.rounds; r++) { for (var i = 0; i < 48; i++)n = this.state.hash[i] ^= h[n]; n = n + r & 255 } n = 255 & this.state.checksum[15]; for (var o = 0; o < 16; o++)n = this.state.checksum[o] ^= h[t[o] ^ n] } }, { key: "finalize", value: function () { this.addPaddingPKCS7(16 - (15 & this.state.message.length) | 0), this.process(); for (var t = 0; t < 16; t++)this.state.message += String.fromCharCode(this.state.checksum[t]); return this.process(), this.getStateHash(16) } }]), f); function f(t) { var e; return function (t) { if (!(t instanceof f)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = c(f).call(this, t)) || "object" !== a(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).options.rounds = t.options.rounds || 18, t } e.a = n }, function (t, e, n) { "use strict"; var r = n(5), c = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var l = [0, 1518500249, 1859775393, 2400959708], h = [5, 11, 7, 15, 6, 13, 8, 14, 7, 12, 9, 11, 8, 15, 6, 12, 9, 14, 5, 13], f = [10, 17, 25, 30], p = [18, 0, 1, 2, 3, 19, 4, 5, 6, 7, 16, 8, 9, 10, 11, 17, 12, 13, 14, 15, 22, 3, 6, 9, 12, 23, 15, 2, 5, 8, 20, 11, 14, 1, 4, 21, 7, 10, 13, 0, 26, 12, 5, 14, 7, 27, 0, 9, 2, 11, 24, 4, 13, 6, 15, 25, 8, 1, 10, 3, 30, 7, 2, 13, 8, 31, 3, 14, 9, 4, 28, 15, 10, 5, 0, 29, 11, 6, 1, 12], r = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) }(u, r.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(u.prototype, [{ key: "reset", value: function () { o(s(u.prototype), "reset", this).call(this), this.state.hash = [1732584193, 4023233417, 2562383102, 271733878, 3285377520] } }, { key: "processBlock", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0; s < 16; s++)this.W[s] = 0 | t[s]; this.W[16] = this.W[0] ^ this.W[1] ^ this.W[2] ^ this.W[3] | 0, this.W[17] = this.W[4] ^ this.W[5] ^ this.W[6] ^ this.W[7] | 0, this.W[18] = this.W[8] ^ this.W[9] ^ this.W[10] ^ this.W[11] | 0, this.W[19] = this.W[12] ^ this.W[13] ^ this.W[14] ^ this.W[15] | 0, this.W[20] = this.W[3] ^ this.W[6] ^ this.W[9] ^ this.W[12] | 0, this.W[21] = this.W[2] ^ this.W[5] ^ this.W[8] ^ this.W[15] | 0, this.W[22] = this.W[1] ^ this.W[4] ^ this.W[11] ^ this.W[14] | 0, this.W[23] = this.W[0] ^ this.W[7] ^ this.W[10] ^ this.W[13] | 0, this.W[24] = this.W[5] ^ this.W[7] ^ this.W[12] ^ this.W[14] | 0, this.W[25] = this.W[0] ^ this.W[2] ^ this.W[9] ^ this.W[11] | 0, this.W[26] = this.W[4] ^ this.W[6] ^ this.W[13] ^ this.W[15] | 0, this.W[27] = this.W[1] ^ this.W[3] ^ this.W[8] ^ this.W[10] | 0, this.W[28] = this.W[2] ^ this.W[7] ^ this.W[8] ^ this.W[13] | 0, this.W[29] = this.W[3] ^ this.W[4] ^ this.W[9] ^ this.W[14] | 0, this.W[30] = this.W[0] ^ this.W[5] ^ this.W[10] ^ this.W[15] | 0, this.W[31] = this.W[1] ^ this.W[6] ^ this.W[11] ^ this.W[12] | 0; for (var a = 0; a < this.options.rounds; a++)var u = Object(c.a)(e, h[a % 20]) + o + this.W[p[a]] + l[a / 20 >> 0] | 0, u = a < 20 ? u + (n & r | ~n & i) | 0 : !(a < 40) && a < 60 ? u + (r ^ (n | ~i)) | 0 : u + (n ^ r ^ i) | 0, o = i, i = r, r = 0 | Object(c.a)(n, f[a / 20 >> 0]), n = e, e = u; this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), u); function u(t) { var e; return function (t) { if (!(t instanceof u)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = s(u).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).options.rounds = t.options.rounds || 80, t.W = new Array(32), t } e.a = r }, function (t, e, n) { "use strict"; n.d(e, "a", function () { return r }); var o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function r(t) { for (var e = "", n = t.length - t.length % 3 | 0, r = 0, i = 0; i < n; i += 3)r = t.charCodeAt(i) << 16 | t.charCodeAt(i + 1) << 8 | t.charCodeAt(i + 2), e += o.charAt(r >> 18) + o.charAt(r >> 12 & 63) + o.charAt(r >> 6 & 63) + o.charAt(63 & r); return t.length - n == 2 ? (r = t.charCodeAt(n) << 16 | t.charCodeAt(1 + n) << 8, e += o.charAt(r >> 18) + o.charAt(r >> 12 & 63) + o.charAt(r >> 6 & 63) + "=") : t.length - n == 1 && (r = t.charCodeAt(n) << 16, e += o.charAt(r >> 18) + o.charAt(r >> 12 & 63) + "=="), e } }, function (t, e, n) { "use strict"; var r = n(5), u = n(0); function i(t) { return (i = "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 })(t) } function o(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } function s(t, e, n) { return (s = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = a(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function a(t) { return (a = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function c(t, e) { return (c = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var l = [[3, 7, 11, 19], [3, 5, 9, 13], [3, 9, 11, 15]], h = 1518500249, f = 1859775393, n = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && c(t, e) }(p, r.a), n = [{ key: "FF", value: function (t, e, n) { return t & e | ~t & n } }, { key: "GG", value: function (t, e, n) { return t & e | t & n | e & n } }, { key: "HH", value: function (t, e, n) { return t ^ e ^ n } }, { key: "CC", value: function (t, e, n, r, i, o, s, a) { return 0 | Object(u.a)(n + t(r, i, o) + s + e, a) } }], o((r = p).prototype, [{ key: "reset", value: function () { s(a(p.prototype), "reset", this).call(this), this.state.hash = [1732584193, -271733879, -1732584194, 271733878] } }, { key: "processBlock", value: function (t) { var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], e = p.CC(p.FF, 0, e, n, r, i, t[0], l[0][0]), i = p.CC(p.FF, 0, i, e, n, r, t[1], l[0][1]), r = p.CC(p.FF, 0, r, i, e, n, t[2], l[0][2]), n = p.CC(p.FF, 0, n, r, i, e, t[3], l[0][3]); e = p.CC(p.FF, 0, e, n, r, i, t[4], l[0][0]), i = p.CC(p.FF, 0, i, e, n, r, t[5], l[0][1]), r = p.CC(p.FF, 0, r, i, e, n, t[6], l[0][2]), n = p.CC(p.FF, 0, n, r, i, e, t[7], l[0][3]), e = p.CC(p.FF, 0, e, n, r, i, t[8], l[0][0]), i = p.CC(p.FF, 0, i, e, n, r, t[9], l[0][1]), r = p.CC(p.FF, 0, r, i, e, n, t[10], l[0][2]), n = p.CC(p.FF, 0, n, r, i, e, t[11], l[0][3]), e = p.CC(p.FF, 0, e, n, r, i, t[12], l[0][0]), i = p.CC(p.FF, 0, i, e, n, r, t[13], l[0][1]), r = p.CC(p.FF, 0, r, i, e, n, t[14], l[0][2]), n = p.CC(p.FF, 0, n, r, i, e, t[15], l[0][3]), e = p.CC(p.GG, h, e, n, r, i, t[0], l[1][0]), i = p.CC(p.GG, h, i, e, n, r, t[4], l[1][1]), r = p.CC(p.GG, h, r, i, e, n, t[8], l[1][2]), n = p.CC(p.GG, h, n, r, i, e, t[12], l[1][3]), e = p.CC(p.GG, h, e, n, r, i, t[1], l[1][0]), i = p.CC(p.GG, h, i, e, n, r, t[5], l[1][1]), r = p.CC(p.GG, h, r, i, e, n, t[9], l[1][2]), n = p.CC(p.GG, h, n, r, i, e, t[13], l[1][3]), e = p.CC(p.GG, h, e, n, r, i, t[2], l[1][0]), i = p.CC(p.GG, h, i, e, n, r, t[6], l[1][1]), r = p.CC(p.GG, h, r, i, e, n, t[10], l[1][2]), n = p.CC(p.GG, h, n, r, i, e, t[14], l[1][3]), e = p.CC(p.GG, h, e, n, r, i, t[3], l[1][0]), i = p.CC(p.GG, h, i, e, n, r, t[7], l[1][1]), r = p.CC(p.GG, h, r, i, e, n, t[11], l[1][2]), n = p.CC(p.GG, h, n, r, i, e, t[15], l[1][3]), e = p.CC(p.HH, f, e, n, r, i, t[0], l[2][0]), i = p.CC(p.HH, f, i, e, n, r, t[8], l[2][1]), r = p.CC(p.HH, f, r, i, e, n, t[4], l[2][2]), n = p.CC(p.HH, f, n, r, i, e, t[12], l[2][3]), e = p.CC(p.HH, f, e, n, r, i, t[2], l[2][0]), i = p.CC(p.HH, f, i, e, n, r, t[10], l[2][1]), r = p.CC(p.HH, f, r, i, e, n, t[6], l[2][2]), n = p.CC(p.HH, f, n, r, i, e, t[14], l[2][3]), e = p.CC(p.HH, f, e, n, r, i, t[1], l[2][0]), i = p.CC(p.HH, f, i, e, n, r, t[9], l[2][1]), r = p.CC(p.HH, f, r, i, e, n, t[5], l[2][2]), n = p.CC(p.HH, f, n, r, i, e, t[13], l[2][3]), e = p.CC(p.HH, f, e, n, r, i, t[3], l[2][0]), i = p.CC(p.HH, f, i, e, n, r, t[11], l[2][1]), r = p.CC(p.HH, f, r, i, e, n, t[7], l[2][2]), n = p.CC(p.HH, f, n, r, i, e, t[15], l[2][3]), this.state.hash = [this.state.hash[0] + e | 0, this.state.hash[1] + n | 0, this.state.hash[2] + r | 0, this.state.hash[3] + i | 0] } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), o(r, n), p); function p() { return function (t) { if (!(t instanceof p)) throw new TypeError("Cannot call a class as a function") }(this), t = this, !(e = a(p).apply(this, arguments)) || "object" !== i(e) && "function" != typeof e ? function () { if (void 0 !== t) return t; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : e; var t, e } e.a = n }, function (t, e, n) { "use strict"; var r = n(3), u = n(0); function i(t) { return (i = "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 })(t) } function o(t, e, n) { return (o = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { t = function (t, e) { for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = s(t));); return t }(t, e); if (t) { e = Object.getOwnPropertyDescriptor(t, e); return e.get ? e.get.call(n) : e.value } })(t, e, n || t) } function s(t) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function a(t, e) { return (a = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } var c = [1518500249, 1859775393, 2400959708, 3395469782], r = (function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && a(t, e) }(l, r.a), function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(l.prototype, [{ key: "reset", value: function () { o(s(l.prototype), "reset", this).call(this), this.state.hash = [1732584193, -271733879, -1732584194, 271733878, -1009589776] } }, { key: "processBlock", value: function (t) { for (var e = 0 | this.state.hash[0], n = 0 | this.state.hash[1], r = 0 | this.state.hash[2], i = 0 | this.state.hash[3], o = 0 | this.state.hash[4], s = 0; s < this.options.rounds; s++) { this.W[s] = s < 16 ? 0 | t[s] : this.W[s - 3] ^ this.W[s - 8] ^ this.W[s - 14] ^ this.W[s - 16] | 0; var a = Object(u.a)(e, 5) + o + this.W[s] + c[s / 20 >> 0] | 0, a = s < 20 ? a + (n & r | ~n & i) | 0 : !(s < 40) && s < 60 ? a + (n & r | n & i | r & i) | 0 : a + (n ^ r ^ i) | 0, o = i, i = r, r = 0 | Object(u.a)(n, 30), n = e, e = a } this.state.hash[0] = this.state.hash[0] + e | 0, this.state.hash[1] = this.state.hash[1] + n | 0, this.state.hash[2] = this.state.hash[2] + r | 0, this.state.hash[3] = this.state.hash[3] + i | 0, this.state.hash[4] = this.state.hash[4] + o | 0 } }, { key: "finalize", value: function () { return this.addPaddingISO7816(this.state.message.length < 56 ? 56 - this.state.message.length | 0 : 120 - this.state.message.length | 0), this.addLengthBits(), this.process(), this.getStateHash() } }]), l); function l(t) { var e; return function (t) { if (!(t instanceof l)) throw new TypeError("Cannot call a class as a function") }(this), e = this, (t = !(t = s(l).call(this, t)) || "object" !== i(t) && "function" != typeof t ? function () { if (void 0 !== e) return e; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }() : t).options.rounds = t.options.rounds || 80, t.W = new Array(80), t } e.a = r }, function (t, e, n) { "use strict"; function r(t) { for (var e = "", n = new Uint8Array(t), r = 0; r < n.length; r++)e += String.fromCharCode(n[r]); return e } n.d(e, "a", function () { return r }) }, , function (t, e, n) { "use strict"; var r = (function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } }(i.prototype, [{ key: "update", value: function (t) { this.hasher.update(t) } }, { key: "finalize", value: function () { var t = this.hasher.finalize(); return this.hasher.reset(), this.hasher.update(this.oPad), this.hasher.update(t), this.hasher.finalize() } }]), i); function i(t, e) { !function (t) { if (!(t instanceof i)) throw new TypeError("Cannot call a class as a function") }(this), t.length > e.blockSizeInBytes && (e.update(t), t = e.finalize(), e.reset()); for (var n = t.length; n < e.blockSizeInBytes; n++)t += "\0"; this.oPad = ""; for (var r = 0; r < t.length; r++)e.update(String.fromCharCode(54 ^ t.charCodeAt(r))), this.oPad += String.fromCharCode(92 ^ t.charCodeAt(r)); this.hasher = e } e.a = r }, , , , , , , , , function (t, e, n) { "use strict"; n.r(e); var r = n(14), i = n(13), o = n(16), s = n(10), a = n(8), u = n(17), c = n(11), l = n(7), h = n(6), f = n(9), p = n(12), d = n(1), g = n(18), m = n(2), v = n(15), y = n(20); (function (t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } })(b.prototype, [{ key: "getHasher", value: function (t, e) { switch (e = e || {}, t) { case "has160": return new r.a(e); case "md2": return new i.a(e); case "md4": return new o.a(e); case "md5": return new s.a(e); case "ripemd128": return e = Object.assign({}, { length: 128 }, e), new a.a(e); case "ripemd": case "ripemd160": return e = Object.assign({}, { length: 160 }, e), new a.a(e); case "ripemd256": return e = Object.assign({}, { length: 256 }, e), new a.a(e); case "ripemd320": return e = Object.assign({}, { length: 320 }, e), new a.a(e); case "sha0": return new u.a(e); case "sha1": return new c.a(e); case "sha224": return e = Object.assign({}, { length: 224 }, e), new l.a(e); case "sha256": return e = Object.assign({}, { length: 256 }, e), new l.a(e); case "sha384": return e = Object.assign({}, { length: 384 }, e), new h.a(e); case "sha512": return e = Object.assign({}, { length: 512 }, e), new h.a(e); case "sha512/224": return e = Object.assign({}, { length: 224 }, e), new h.a(e); case "sha512/256": return e = Object.assign({}, { length: 256 }, e), new h.a(e); case "snefru": case "snefru128": case "snefru128/8": return e = Object.assign({}, { length: 128 }, e), new f.a(e); case "snefru256": case "snefru256/8": return e = Object.assign({}, { length: 256 }, e), new f.a(e); case "snefru128/2": return e = Object.assign({}, { length: 128, rounds: 2 }, e), new f.a(e); case "snefru256/4": return e = Object.assign({}, { length: 256, rounds: 4 }, e), new f.a(e); case "whirlpool": return new p.a(e); case "whirlpool-0": return e = Object.assign({}, { type: "0" }, e), new p.a(e); case "whirlpool-t": return e = Object.assign({}, { type: "t" }, e), new p.a(e) } } }, { key: "hash", value: function (t, e, n) { n = n || {}; n = this.getHasher(t, n); return n.update(Object(d.a)(e)), Object(m.a)(n.finalize()) } }, { key: "getHmac", value: function (t, e) { return new y.a(t, e) } }, { key: "hmac", value: function (t, e, n) { n = this.getHmac(Object(d.a)(t), n); return n.update(Object(d.a)(e)), Object(m.a)(n.finalize()) } }]), n = b; function b() { !function (t) { if (!(t instanceof b)) throw new TypeError("Cannot call a class as a function") }(this), this.encoder = {}, this.encoder.fromUtf = d.a, this.encoder.fromArrayBuffer = g.a, this.encoder.toHex = m.a, this.encoder.toBase64 = v.a } n = new n, e.default = n }]).default; !function (s) { "use strict"; var n = { page: 1, pageSize: 200, total: 0, showTotal: !1, totalTxt: "共{total}条", noData: !1, showSkip: !1, showPN: !0, prevPage: "上一页", nextPage: "下一页", fastForward: 0, selectOption: [], backFun: function (t) { } }; function e(t, e) { this.element = s(t), this.settings = s.extend({}, n, e), this.pageNum = 1, this.pageList = [], this.pageTatol = 0, this.init() } s.extend(e.prototype, { init: function () { this.element.empty(), this.viewHtml(), this.clickBtn() }, creatHtml: function (t) { t == this.settings.page ? this.pageList.push('<button class="active" data-page=' + t + ">" + t + "</button>") : this.pageList.push("<button data-page=" + t + ">" + t + "</button>") }, viewHtml: function () { var t = this.settings, e = 0, n = []; if (0 < t.total) e = Math.ceil(t.total / t.pageSize); else { if (!t.noData) return; e = 1, t.page = 1, t.total = 0 } if (this.pageTatol = e, this.pageNum = t.page, t.showTotal && n.push('<div class="spage-total">' + t.totalTxt.replace(/\{(\w+)\}/gi, t.total) + "</div>"), n.push('<div class="spage-number">'), this.pageList = [], t.showPN && (1 == t.page ? this.pageList.push('<button class="button-disabled" data-page="prev"><i class="prevBtn"></i></button>') : this.pageList.push('<button data-page="prev"><i class="prevBtn"></i></button>')), e <= 6) for (var r = 1; r < e + 1; r++)this.creatHtml(r); else if (t.page < 3) { for (r = 1; r <= 3; r++)this.creatHtml(r); this.pageList.push('<button data-page="after" class="spage-after">...</button><button data-page=' + e + ">" + e + "</button>") } else if (t.page > e - 3) { this.pageList.push('<button data-page="1">1</button><button data-page="before" class="spage-before">...</button>'); for (r = e - 3; r <= e; r++)this.creatHtml(r) } else { this.pageList.push('<button data-page="1">1</button>'), 3 < t.page && this.pageList.push('<button data-page="before" class="spage-before">...</button>'); for (r = t.page - 1; r <= Number(t.page) + 1; r++)this.creatHtml(r); t.page <= e - 3 && this.pageList.push('<button data-page="after" class="spage-after">...</button>'), this.pageList.push("<button data-page=" + e + ">" + e + "</button>") } if (t.showPN && (t.page == e ? this.pageList.push('<button class="button-disabled" data-page="next"><i class="nextBtn"></i></button>') : this.pageList.push('<button data-page="next"><i class="nextBtn"></i></button>')), n.push(this.pageList.join("")), n.push("</div>"), 0 < t.selectOption.length) { for (var i = '<select class="selectNum" id="selectNum">', o = 0; o <= t.selectOption.length - 1; o++)i += "<option value=" + t.selectOption[o] + " ", t.pageSize === t.selectOption[o] ? i += "selected>" + t.selectOption[o] + "行/页</option>" : i += ">" + t.selectOption[o] + "行/页</option>"; i += "</select>", n.push(i) } t.showSkip && n.push('<div class="spage-skip">跳至&nbsp;<input type="text" class="luckysheet-mousedown-cancel" value="' + t.page + '"/>&nbsp;页&nbsp;&nbsp;</div>'), this.element.html(n.join("")) }, clickBtn: function () { var n = this, r = this.settings, i = this.element, o = this.pageTatol; this.element.on("change", "select", function (t) { var e = parseInt(document.getElementById("selectNum").value); r.pageSize = e, r.page = 1, n.element.empty(), n.viewHtml(), r.backFun(r) }), this.element.off("click", "button"), this.element.on("click", "button", function () { var t = s(this).data("page"); switch (t) { case "prev": r.page = 1 <= r.page - 1 ? r.page - 1 : 1, t = r.page; break; case "next": r.page = Number(r.page) + 1 <= o ? Number(r.page) + 1 : o, t = r.page; break; case "before": r.page = 1 <= r.page - r.fastForward ? r.page - r.fastForward : 1, t = r.page; break; case "after": r.page = Number(r.page) + Number(r.fastForward) <= o ? Number(r.page) + Number(r.fastForward) : o, t = r.page; break; case "go": var e = parseInt(i.find("input").val()); if (!(/^[0-9]*$/.test(e) && 1 <= e && e <= o)) return; t = r.page = e; break; default: r.page = t }t != n.pageNum && (n.pageNum = r.page, n.viewHtml(), r.backFun(r)) }), this.element.off("keyup", "input"), this.element.on("keyup", "input", function (t) { 13 == t.keyCode && (t = parseInt(i.find("input").val()), /^[0-9]*$/.test(t) && 1 <= t && t <= o && t != n.pageNum && (r.page = t, n.pageNum = t, n.viewHtml(), r.backFun(r))) }), 0 < r.fastForward && (i.find(".spage-after").hover(function () { s(this).html("&raquo;") }, function () { s(this).html("...") }), i.find(".spage-before").hover(function () { s(this).html("&laquo;") }, function () { s(this).html("...") })) } }), s.fn.sPage = function (t) { return this.each(function () { new e(this, t) }) } }(jQuery, (window, document));
/**
* luckysheet umd.js cdn code if needed to update then paste the code in this section below the
* latest code from luckysheet cdn i.e umd.js
*/
!function (e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).luckysheet = t() }(this, (function () {
"use strict"; var e = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}; function t(e) { return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e } function a(e, t, a) { return e(a = { path: t, exports: {}, require: function (e, t) { return function () { throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs") }(null == t && a.path) } }, a.exports), a.exports } var n = function (e) { return e && e.Math == Math && e }, l = n("object" == typeof globalThis && globalThis) || n("object" == typeof window && window) || n("object" == typeof self && self) || n("object" == typeof e && e) || Function("return this")(), o = function (e) { try { return !!e() } catch (e) { return !0 } }, s = !o((function () { return 7 != Object.defineProperty({}, 1, { get: function () { return 7 } })[1] })), u = {}.propertyIsEnumerable, d = Object.getOwnPropertyDescriptor, h = { f: d && !u.call({ 1: 2 }, 1) ? function (e) { var t = d(this, e); return !!t && t.enumerable } : u }, m = function (e, t) { return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: t } }, p = {}.toString, f = function (e) { return p.call(e).slice(8, -1) }, g = "".split, v = o((function () { return !Object("z").propertyIsEnumerable(0) })) ? function (e) { return "String" == f(e) ? g.call(e, "") : Object(e) } : Object, y = function (e) { if (null == e) throw TypeError("Can't call method on " + e); return e }, b = function (e) { return v(y(e)) }, k = function (e) { return "object" == typeof e ? null !== e : "function" == typeof e }, x = function (e, t) { if (!k(e)) return e; var a, r; if (t && "function" == typeof (a = e.toString) && !k(r = a.call(e))) return r; if ("function" == typeof (a = e.valueOf) && !k(r = a.call(e))) return r; if (!t && "function" == typeof (a = e.toString) && !k(r = a.call(e))) return r; throw TypeError("Can't convert object to primitive value") }, w = {}.hasOwnProperty, _ = function (e, t) { return w.call(e, t) }, C = l.document, T = k(C) && k(C.createElement), A = function (e) { return T ? C.createElement(e) : {} }, S = !s && !o((function () { return 7 != Object.defineProperty(A("div"), "a", { get: function () { return 7 } }).a })), I = Object.getOwnPropertyDescriptor, R = { f: s ? I : function (e, t) { if (e = b(e), t = x(t, !0), S) try { return I(e, t) } catch (e) { } if (_(e, t)) return m(!h.f.call(e, t), e[t]) } }, q = function (e) { if (!k(e)) throw TypeError(String(e) + " is not an object"); return e }, D = Object.defineProperty, F = { f: s ? D : function (e, t, a) { if (q(e), t = x(t, !0), q(a), S) try { return D(e, t, a) } catch (e) { } if ("get" in a || "set" in a) throw TypeError("Accessors not supported"); return "value" in a && (e[t] = a.value), e } }, E = s ? function (e, t, a) { return F.f(e, t, m(1, a)) } : function (e, t, a) { return e[t] = a, e }, M = function (e, t) { try { E(l, e, t) } catch (a) { l[e] = t } return t }, N = l["__core-js_shared__"] || M("__core-js_shared__", {}), P = Function.toString; "function" != typeof N.inspectSource && (N.inspectSource = function (e) { return P.call(e) }); var z, L, O, B = N.inspectSource, V = l.WeakMap, H = "function" == typeof V && /native code/.test(B(V)), U = a((function (e) { (e.exports = function (e, t) { return N[e] || (N[e] = void 0 !== t ? t : {}) })("versions", []).push({ version: "3.6.5", mode: "global", copyright: "© 2020 Denis Pushkarev (zloirock.ru)" }) })), j = 0, G = Math.random(), W = function (e) { return "Symbol(" + String(void 0 === e ? "" : e) + ")_" + (++j + G).toString(36) }, Y = U("keys"), X = function (e) { return Y[e] || (Y[e] = W(e)) }, K = {}, Z = l.WeakMap; if (H) { var Q = new Z, J = Q.get, ee = Q.has, te = Q.set; z = function (e, t) { return te.call(Q, e, t), t }, L = function (e) { return J.call(Q, e) || {} }, O = function (e) { return ee.call(Q, e) } } else { var ae = X("state"); K[ae] = !0, z = function (e, t) { return E(e, ae, t), t }, L = function (e) { return _(e, ae) ? e[ae] : {} }, O = function (e) { return _(e, ae) } } var re = { set: z, get: L, has: O, enforce: function (e) { return O(e) ? L(e) : z(e, {}) }, getterFor: function (e) { return function (t) { var a; if (!k(t) || (a = L(t)).type !== e) throw TypeError("Incompatible receiver, " + e + " required"); return a } } }, ne = a((function (e) { var t = re.get, a = re.enforce, r = String(String).split("String"); (e.exports = function (e, t, n, i) { var o = !!i && !!i.unsafe, s = !!i && !!i.enumerable, c = !!i && !!i.noTargetGet; "function" == typeof n && ("string" != typeof t || _(n, "name") || E(n, "name", t), a(n).source = r.join("string" == typeof t ? t : "")), e !== l ? (o ? !c && e[t] && (s = !0) : delete e[t], s ? e[t] = n : E(e, t, n)) : s ? e[t] = n : M(t, n) })(Function.prototype, "toString", (function () { return "function" == typeof this && t(this).source || B(this) })) })), le = l, ie = function (e) { return "function" == typeof e ? e : void 0 }, oe = function (e, t) { return arguments.length < 2 ? ie(le[e]) || ie(l[e]) : le[e] && le[e][t] || l[e] && l[e][t] }, se = Math.ceil, ce = Math.floor, ue = function (e) { return isNaN(e = +e) ? 0 : (e > 0 ? ce : se)(e) }, de = Math.min, he = function (e) { return e > 0 ? de(ue(e), 9007199254740991) : 0 }, me = Math.max, pe = Math.min, fe = function (e, t) { var a = ue(e); return a < 0 ? me(a + t, 0) : pe(a, t) }, ge = function (e) { return function (t, a, r) { var n, l = b(t), i = he(l.length), o = fe(r, i); if (e && a != a) { for (; i > o;)if ((n = l[o++]) != n) return !0 } else for (; i > o; o++)if ((e || o in l) && l[o] === a) return e || o || 0; return !e && -1 } }, ve = { includes: ge(!0), indexOf: ge(!1) }, ye = ve.indexOf, be = function (e, t) { var a, r = b(e), n = 0, l = []; for (a in r) !_(K, a) && _(r, a) && l.push(a); for (; t.length > n;)_(r, a = t[n++]) && (~ye(l, a) || l.push(a)); return l }, ke = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"], xe = ke.concat("length", "prototype"), we = { f: Object.getOwnPropertyNames || function (e) { return be(e, xe) } }, _e = { f: Object.getOwnPropertySymbols }, Ce = oe("Reflect", "ownKeys") || function (e) { var t = we.f(q(e)), a = _e.f; return a ? t.concat(a(e)) : t }, Te = function (e, t) { for (var a = Ce(t), r = F.f, n = R.f, l = 0; l < a.length; l++) { var i = a[l]; _(e, i) || r(e, i, n(t, i)) } }, Ae = /#|\.prototype\./, Se = function (e, t) { var a = Re[Ie(e)]; return a == qe || a != $e && ("function" == typeof t ? o(t) : !!t) }, Ie = Se.normalize = function (e) { return String(e).replace(Ae, ".").toLowerCase() }, Re = Se.data = {}, $e = Se.NATIVE = "N", qe = Se.POLYFILL = "P", De = Se, Fe = R.f, Ee = function (e, t) { var a, r, n, i, o, s = e.target, c = e.global, u = e.stat; if (a = c ? l : u ? l[s] || M(s, {}) : (l[s] || {}).prototype) for (r in t) { if (i = t[r], n = e.noTargetGet ? (o = Fe(a, r)) && o.value : a[r], !De(c ? r : s + (u ? "." : "#") + r, e.forced) && void 0 !== n) { if (typeof i == typeof n) continue; Te(i, n) } (e.sham || n && n.sham) && E(i, "sham", !0), ne(a, r, i, e) } }, Me = function (e, t) { var a = [][e]; return !!a && o((function () { a.call(null, t || function () { throw 1 }, 1) })) }, Ne = Object.defineProperty, Pe = {}, ze = function (e) { throw e }, Le = function (e, t) { if (_(Pe, e)) return Pe[e]; t || (t = {}); var a = [][e], r = !!_(t, "ACCESSORS") && t.ACCESSORS, n = _(t, 0) ? t[0] : ze, l = _(t, 1) ? t[1] : void 0; return Pe[e] = !!a && !o((function () { if (r && !s) return !0; var e = { length: -1 }; r ? Ne(e, 1, { enumerable: !0, get: ze }) : e[1] = 1, a.call(e, n, l) })) }, Oe = ve.indexOf, Be = [].indexOf, Ve = !!Be && 1 / [1].indexOf(1, -0) < 0, He = Me("indexOf"), Ue = Le("indexOf", { ACCESSORS: !0, 1: 0 }); Ee({ target: "Array", proto: !0, forced: Ve || !He || !Ue }, { indexOf: function (e) { return Ve ? Be.apply(this, arguments) || 0 : Oe(this, e, arguments.length > 1 ? arguments[1] : void 0) } }); var je, Ge = Object.setPrototypeOf || ("__proto__" in {} ? function () { var e, t = !1, a = {}; try { (e = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set).call(a, []), t = a instanceof Array } catch (e) { } return function (a, r) { return q(a), function (e) { if (!k(e) && null !== e) throw TypeError("Can't set " + String(e) + " as a prototype") }(r), t ? e.call(a, r) : a.__proto__ = r, a } }() : void 0), We = function (e, t, a) { var r, n; return Ge && "function" == typeof (r = t.constructor) && r !== a && k(n = r.prototype) && n !== a.prototype && Ge(e, n), e }, Ye = Object.keys || function (e) { return be(e, ke) }, Xe = s ? Object.defineProperties : function (e, t) { q(e); for (var a, r = Ye(t), n = r.length, l = 0; n > l;)F.f(e, a = r[l++], t[a]); return e }, Ke = oe("document", "documentElement"), Ze = X("IE_PROTO"), Qe = function () { }, Je = function (e) { return "<script>" + e + "<\/script>" }, et = function () { try { je = document.domain && new ActiveXObject("htmlfile") } catch (e) { } var e, t; et = je ? function (e) { e.write(Je("")), e.close(); var t = e.parentWindow.Object; return e = null, t }(je) : ((t = A("iframe")).style.display = "none", Ke.appendChild(t), t.src = String("javascript:"), (e = t.contentWindow.document).open(), e.write(Je("document.F=Object")), e.close(), e.F); for (var a = ke.length; a--;)delete et.prototype[ke[a]]; return et() }; K[Ze] = !0; var tt = Object.create || function (e, t) { var a; return null !== e ? (Qe.prototype = q(e), a = new Qe, Qe.prototype = null, a[Ze] = e) : a = et(), void 0 === t ? a : Xe(a, t) }, at = "\t\n\v\f\r   \u2028\u2029\ufeff", rt = "[" + at + "]", nt = RegExp("^" + rt + rt + "*"), lt = RegExp(rt + rt + "*$"), it = function (e) { return function (t) { var a = String(y(t)); return 1 & e && (a = a.replace(nt, "")), 2 & e && (a = a.replace(lt, "")), a } }, ot = { start: it(1), end: it(2), trim: it(3) }, st = we.f, ct = R.f, ut = F.f, dt = ot.trim, ht = l.Number, mt = ht.prototype, pt = "Number" == f(tt(mt)), ft = function (e) { var t, a, r, n, l, i, o, s, c = x(e, !1); if ("string" == typeof c && c.length > 2) if (43 === (t = (c = dt(c)).charCodeAt(0)) || 45 === t) { if (88 === (a = c.charCodeAt(2)) || 120 === a) return NaN } else if (48 === t) { switch (c.charCodeAt(1)) { case 66: case 98: r = 2, n = 49; break; case 79: case 111: r = 8, n = 55; break; default: return +c }for (i = (l = c.slice(2)).length, o = 0; o < i; o++)if ((s = l.charCodeAt(o)) < 48 || s > n) return NaN; return parseInt(l, r) } return +c }; if (De("Number", !ht(" 0o1") || !ht("0b1") || ht("+0x1"))) { for (var gt, vt = function (e) { var t = arguments.length < 1 ? 0 : e, a = this; return a instanceof vt && (pt ? o((function () { mt.valueOf.call(a) })) : "Number" != f(a)) ? We(new ht(ft(t)), a, vt) : ft(t) }, yt = s ? st(ht) : "MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","), bt = 0; yt.length > bt; bt++)_(ht, gt = yt[bt]) && !_(vt, gt) && ut(vt, gt, ct(ht, gt)); vt.prototype = mt, mt.constructor = vt, ne(l, "Number", vt) } Ee({ target: "Number", stat: !0 }, { isNaN: function (e) { return e != e } }); var kt = "".repeat || function (e) { var t = String(y(this)), a = "", r = ue(e); if (r < 0 || r == 1 / 0) throw RangeError("Wrong number of repetitions"); for (; r > 0; (r >>>= 1) && (t += t))1 & r && (a += t); return a }, xt = 1..toFixed, wt = Math.floor, _t = function (e, t, a) { return 0 === t ? a : t % 2 == 1 ? _t(e, t - 1, a * e) : _t(e * e, t / 2, a) }, Ct = xt && ("0.000" !== 8e-5.toFixed(3) || "1" !== .9.toFixed(0) || "1.25" !== 1.255.toFixed(2) || "1000000000000000128" !== (0xde0b6b3a7640080).toFixed(0)) || !o((function () { xt.call({}) })); Ee({ target: "Number", proto: !0, forced: Ct }, { toFixed: function (e) { var t, a, r, n, l = function (e) { if ("number" != typeof e && "Number" != f(e)) throw TypeError("Incorrect invocation"); return +e }(this), i = ue(e), o = [0, 0, 0, 0, 0, 0], s = "", c = "0", u = function (e, t) { for (var a = -1, r = t; ++a < 6;)r += e * o[a], o[a] = r % 1e7, r = wt(r / 1e7) }, d = function (e) { for (var t = 6, a = 0; --t >= 0;)a += o[t], o[t] = wt(a / e), a = a % e * 1e7 }, h = function () { for (var e = 6, t = ""; --e >= 0;)if ("" !== t || 0 === e || 0 !== o[e]) { var a = String(o[e]); t = "" === t ? a : t + kt.call("0", 7 - a.length) + a } return t }; if (i < 0 || i > 20) throw RangeError("Incorrect fraction digits"); if (l != l) return "NaN"; if (l <= -1e21 || l >= 1e21) return String(l); if (l < 0 && (s = "-", l = -l), l > 1e-21) if (a = (t = function (e) { for (var t = 0, a = e; a >= 4096;)t += 12, a /= 4096; for (; a >= 2;)t += 1, a /= 2; return t }(l * _t(2, 69, 1)) - 69) < 0 ? l * _t(2, -t, 1) : l / _t(2, t, 1), a *= 4503599627370496, (t = 52 - t) > 0) { for (u(0, a), r = i; r >= 7;)u(1e7, 0), r -= 7; for (u(_t(10, r, 1), 0), r = t - 1; r >= 23;)d(1 << 23), r -= 23; d(1 << r), u(1, 1), d(2), c = h() } else u(0, a), u(1 << -t, 0), c = h() + kt.call("0", i); return c = i > 0 ? s + ((n = c.length) <= i ? "0." + kt.call("0", i - n) + c : c.slice(0, n - i) + "." + c.slice(n - i)) : s + c } }); var Tt = !!Object.getOwnPropertySymbols && !o((function () { return !String(Symbol()) })), At = Tt && !Symbol.sham && "symbol" == typeof Symbol.iterator, St = U("wks"), It = l.Symbol, Rt = At ? It : It && It.withoutSetter || W, $t = function (e) { return _(St, e) || (Tt && _(It, e) ? St[e] = It[e] : St[e] = Rt("Symbol." + e)), St[e] }, qt = {}; qt[$t("toStringTag")] = "z"; var Dt = "[object z]" === String(qt), Ft = $t("toStringTag"), Et = "Arguments" == f(function () { return arguments }()), Mt = Dt ? f : function (e) { var t, a, r; return void 0 === e ? "Undefined" : null === e ? "Null" : "string" == typeof (a = function (e, t) { try { return e[t] } catch (e) { } }(t = Object(e), Ft)) ? a : Et ? f(t) : "Object" == (r = f(t)) && "function" == typeof t.callee ? "Arguments" : r }, Nt = Dt ? {}.toString : function () { return "[object " + Mt(this) + "]" }; Dt || ne(Object.prototype, "toString", Nt, { unsafe: !0 }); var Pt = function () { var e = q(this), t = ""; return e.global && (t += "g"), e.ignoreCase && (t += "i"), e.multiline && (t += "m"), e.dotAll && (t += "s"), e.unicode && (t += "u"), e.sticky && (t += "y"), t }; function zt(e, t) { return RegExp(e, t) } var Lt = { UNSUPPORTED_Y: o((function () { var e = zt("a", "y"); return e.lastIndex = 2, null != e.exec("abcd") })), BROKEN_CARET: o((function () { var e = zt("^r", "gy"); return e.lastIndex = 2, null != e.exec("str") })) }, Ot = RegExp.prototype.exec, Bt = String.prototype.replace, Vt = Ot, Ht = function () { var e = /a/, t = /b*/g; return Ot.call(e, "a"), Ot.call(t, "a"), 0 !== e.lastIndex || 0 !== t.lastIndex }(), Ut = Lt.UNSUPPORTED_Y || Lt.BROKEN_CARET, jt = void 0 !== /()??/.exec("")[1]; (Ht || jt || Ut) && (Vt = function (e) { var t, a, r, n, l = this, i = Ut && l.sticky, o = Pt.call(l), s = l.source, c = 0, u = e; return i && (-1 === (o = o.replace("y", "")).indexOf("g") && (o += "g"), u = String(e).slice(l.lastIndex), l.lastIndex > 0 && (!l.multiline || l.multiline && "\n" !== e[l.lastIndex - 1]) && (s = "(?: " + s + ")", u = " " + u, c++), a = new RegExp("^(?:" + s + ")", o)), jt && (a = new RegExp("^" + s + "$(?!\\s)", o)), Ht && (t = l.lastIndex), r = Ot.call(i ? a : l, u), i ? r ? (r.input = r.input.slice(c), r[0] = r[0].slice(c), r.index = l.lastIndex, l.lastIndex += r[0].length) : l.lastIndex = 0 : Ht && r && (l.lastIndex = l.global ? r.index + r[0].length : t), jt && r && r.length > 1 && Bt.call(r[0], a, (function () { for (n = 1; n < arguments.length - 2; n++)void 0 === arguments[n] && (r[n] = void 0) })), r }); var Gt = Vt; Ee({ target: "RegExp", proto: !0, forced: /./.exec !== Gt }, { exec: Gt }); var Wt = RegExp.prototype, Yt = Wt.toString, Xt = o((function () { return "/a/b" != Yt.call({ source: "a", flags: "b" }) })), Kt = "toString" != Yt.name; (Xt || Kt) && ne(RegExp.prototype, "toString", (function () { var e = q(this), t = String(e.source), a = e.flags; return "/" + t + "/" + String(void 0 === a && e instanceof RegExp && !("flags" in Wt) ? Pt.call(e) : a) }), { unsafe: !0 }); var Zt = $t("species"), Qt = !o((function () { var e = /./; return e.exec = function () { var e = []; return e.groups = { a: "7" }, e }, "7" !== "".replace(e, "$<a>") })), Jt = "$0" === "a".replace(/./, "$0"), ea = $t("replace"), ta = !!/./[ea] && "" === /./[ea]("a", "$0"), aa = !o((function () { var e = /(?:)/, t = e.exec; e.exec = function () { return t.apply(this, arguments) }; var a = "ab".split(e); return 2 !== a.length || "a" !== a[0] || "b" !== a[1] })), ra = function (e, t, a, r) { var n = $t(e), l = !o((function () { var t = {}; return t[n] = function () { return 7 }, 7 != ""[e](t) })), i = l && !o((function () { var t = !1, a = /a/; return "split" === e && ((a = {}).constructor = {}, a.constructor[Zt] = function () { return a }, a.flags = "", a[n] = /./[n]), a.exec = function () { return t = !0, null }, a[n](""), !t })); if (!l || !i || "replace" === e && (!Qt || !Jt || ta) || "split" === e && !aa) { var s = /./[n], c = a(n, ""[e], (function (e, t, a, r, n) { return t.exec === Gt ? l && !n ? { done: !0, value: s.call(t, a, r) } : { done: !0, value: e.call(a, t, r) } : { done: !1 } }), { REPLACE_KEEPS_$0: Jt, REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: ta }), u = c[0], d = c[1]; ne(String.prototype, e, u), ne(RegExp.prototype, n, 2 == t ? function (e, t) { return d.call(e, this, t) } : function (e) { return d.call(e, this) }) } r && E(RegExp.prototype[n], "sham", !0) }, na = function (e) { return Object(y(e)) }, la = function (e) { return function (t, a) { var r, n, l = String(y(t)), i = ue(a), o = l.length; return i < 0 || i >= o ? e ? "" : void 0 : (r = l.charCodeAt(i)) < 55296 || r > 56319 || i + 1 === o || (n = l.charCodeAt(i + 1)) < 56320 || n > 57343 ? e ? l.charAt(i) : r : e ? l.slice(i, i + 2) : n - 56320 + (r - 55296 << 10) + 65536 } }, ia = { codeAt: la(!1), charAt: la(!0) }, oa = ia.charAt, sa = function (e, t, a) { return t + (a ? oa(e, t).length : 1) }, ca = function (e, t) { var a = e.exec; if ("function" == typeof a) { var r = a.call(e, t); if ("object" != typeof r) throw TypeError("RegExp exec method returned something other than an Object or null"); return r } if ("RegExp" !== f(e)) throw TypeError("RegExp#exec called on incompatible receiver"); return Gt.call(e, t) }, ua = Math.max, da = Math.min, ha = Math.floor, ma = /\$([$&'`]|\d\d?|<[^>]*>)/g, pa = /\$([$&'`]|\d\d?)/g; ra("replace", 2, (function (e, t, a, r) { var n = r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE, l = r.REPLACE_KEEPS_$0, i = n ? "$" : "$0"; return [function (a, r) { var n = y(this), l = null == a ? void 0 : a[e]; return void 0 !== l ? l.call(a, n, r) : t.call(String(n), a, r) }, function (e, r) { if (!n && l || "string" == typeof r && -1 === r.indexOf(i)) { var s = a(t, e, this, r); if (s.done) return s.value } var c = q(e), u = String(this), d = "function" == typeof r; d || (r = String(r)); var h = c.global; if (h) { var m = c.unicode; c.lastIndex = 0 } for (var p = []; ;) { var f = ca(c, u); if (null === f) break; if (p.push(f), !h) break; "" === String(f[0]) && (c.lastIndex = sa(u, he(c.lastIndex), m)) } for (var g, v = "", y = 0, b = 0; b < p.length; b++) { f = p[b]; for (var k = String(f[0]), x = ua(da(ue(f.index), u.length), 0), w = [], _ = 1; _ < f.length; _++)w.push(void 0 === (g = f[_]) ? g : String(g)); var C = f.groups; if (d) { var T = [k].concat(w, x, u); void 0 !== C && T.push(C); var A = String(r.apply(void 0, T)) } else A = o(k, u, x, w, C, r); x >= y && (v += u.slice(y, x) + A, y = x + k.length) } return v + u.slice(y) }]; function o(e, a, r, n, l, i) { var o = r + e.length, s = n.length, c = pa; return void 0 !== l && (l = na(l), c = ma), t.call(i, c, (function (t, i) { var c; switch (i.charAt(0)) { case "$": return "$"; case "&": return e; case "`": return a.slice(0, r); case "'": return a.slice(o); case "<": c = l[i.slice(1, -1)]; break; default: var u = +i; if (0 === u) return t; if (u > s) { var d = ha(u / 10); return 0 === d ? t : d <= s ? void 0 === n[d - 1] ? i.charAt(1) : n[d - 1] + i.charAt(1) : t } c = n[u - 1] }return void 0 === c ? "" : c })) } })); var fa = { autoFormatw: !1, accuracy: void 0, total: 0, allowCopy: !0, showtoolbar: !0, showinfobar: !0, showsheetbar: !0, showstatisticBar: !0, pointEdit: !1, pointEditUpdate: null, pointEditZoom: 1, userInfo: !1, userMenuItem: [], myFolderUrl: null, functionButton: null, showConfigWindowResize: !0, enableAddRow: !0, enableAddBackTop: !0, enablePage: !0, pageInfo: null, editMode: !1, beforeCreateDom: null, workbookCreateBefore: null, workbookCreateAfter: null, fireMousedown: null, plugins: [], forceCalculation: !1, defaultColWidth: 73, defaultRowHeight: 19, defaultTextColor: "#000", defaultCellColor: "#fff" }, ga = { container: null, luckysheetfile: null, defaultcolumnNum: 60, defaultrowNum: 84, fullscreenmode: !0, devicePixelRatio: 1, currentSheetIndex: 0, calculateSheetIndex: 0, flowdata: [], config: {}, visibledatarow: [], visibledatacolumn: [], ch_width: 0, rh_height: 0, cellmainWidth: 0, cellmainHeight: 0, toolbarHeight: 0, infobarHeight: 0, calculatebarHeight: 0, rowHeaderWidth: 46, columnHeaderHeight: 20, cellMainSrollBarSize: 12, sheetBarHeight: 31, statisticBarHeight: 23, luckysheetTableContentHW: [0, 0], defaultcollen: 73, defaultrowlen: 19, jfcountfuncTimeout: null, jfautoscrollTimeout: null, luckysheet_select_status: !1, luckysheet_select_save: [{ row: [0, 0], column: [0, 0] }], luckysheet_selection_range: [], luckysheet_copy_save: {}, luckysheet_paste_iscut: !1, filterchage: !0, luckysheet_filter_save: { row: [], column: [] }, luckysheet_sheet_move_status: !1, luckysheet_sheet_move_data: [], luckysheet_scroll_status: !1, luckysheetisrefreshdetail: !0, luckysheetisrefreshtheme: !0, luckysheetcurrentisPivotTable: !1, luckysheet_rows_selected_status: !1, luckysheet_cols_selected_status: !1, luckysheet_rows_change_size: !1, luckysheet_rows_change_size_start: [], luckysheet_cols_change_size: !1, luckysheet_cols_change_size_start: [], luckysheet_cols_dbclick_timeout: null, luckysheet_cols_dbclick_times: 0, luckysheetCellUpdate: [], luckysheet_shiftpositon: null, iscopyself: !0, orderbyindex: 0, luckysheet_model_move_state: !1, luckysheet_model_xy: [0, 0], luckysheet_model_move_obj: null, luckysheet_cell_selected_move: !1, luckysheet_cell_selected_move_index: [], luckysheet_cell_selected_extend: !1, luckysheet_cell_selected_extend_index: [], luckysheet_cell_selected_extend_time: null, clearjfundo: !0, jfundo: [], jfredo: [], lang: "en", createChart: "", highlightChart: "", zIndex: 15, chartparam: { luckysheetCurrentChart: null, luckysheetCurrentChartActive: !1, luckysheetCurrentChartMove: null, luckysheetCurrentChartMoveTimeout: null, luckysheetCurrentChartMoveObj: null, luckysheetCurrentChartMoveXy: null, luckysheetCurrentChartMoveWinH: null, luckysheetCurrentChartMoveWinW: null, luckysheetCurrentChartResize: null, luckysheetCurrentChartResizeObj: null, luckysheetCurrentChartResizeXy: null, luckysheetCurrentChartResizeWinH: null, luckysheetCurrentChartResizeWinW: null, luckysheetInsertChartTosheetChange: !0, luckysheetCurrentChartZIndexRank: 100, luckysheet_chart_redo_click: !1, luckysheetCurrentChartMaxState: !1, jfrefreshchartall: "", changeChartCellData: "", renderChart: "", getChartJson: "" }, functionList: null, luckysheet_function: null, chart_selection: {}, currentChart: "", scrollRefreshSwitch: !0, measureTextCache: {}, measureTextCellInfoCache: {}, measureTextCacheTimeOut: null, cellOverflowMapCache: {}, zoomRatio: 1, visibledatacolumn_unique: null, visibledatarow_unique: null, showGridLines: !0, toobarObject: {}, inlineStringEditCache: null, inlineStringEditRange: null, fontList: [], defaultFontSize: 10, currentSheetView: "viewNormal", cooperativeEdit: { usernameTimeout: {}, changeCollaborationSize: [], allDataColumnlen: [], merge_range: {}, checkoutData: [] }, asyncLoad: ["core"] }, va = { v: "#VALUE!", n: "#NAME?", na: "#N/A", r: "#REF!", d: "#DIV/0!", nm: "#NUM!", nl: "#NULL!", sp: "#SPILL!" }; function ya(e) { return null == e || "" == e.toString().replace(/\s/g, "") } function ba(e) { return null != e && "" !== e.toString().replace(/\s/g, "") && ("boolean" != typeof e && !isNaN(e)) } function ka(e) { var t = !1; for (var a in va) if (e == va[a]) { t = !0; break } return t } function xa(e) { return !!/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi.exec(e) } function wa() { return !!fa.editMode } function _a(e, t, a, r, n) { var l = !1; for (var i in ga.config.merge) { var o = e.merge[i]; if (t < o.r) { if (a >= o.r && a < o.r + o.rs - 1) { if (r >= o.c && r <= o.c + o.cs - 1) { l = !0; break } if (n >= o.c && n <= o.c + o.cs - 1) { l = !0; break } if (r < o.c && n > o.c + o.cs - 1) { l = !0; break } } else if (a >= o.r && a == o.r + o.rs - 1) { if (r > o.c && r < o.c + o.cs - 1) { l = !0; break } if (n > o.c && n < o.c + o.cs - 1) { l = !0; break } if (r == o.c && n < o.c + o.cs - 1) { l = !0; break } if (r > o.c && n == o.c + o.cs - 1) { l = !0; break } } else if (a > o.r + o.rs - 1) { if (r > o.c && r <= o.c + o.cs - 1) { l = !0; break } if (n >= o.c && n < o.c + o.cs - 1) { l = !0; break } if (r == o.c && n < o.c + o.cs - 1) { l = !0; break } if (r > o.c && n == o.c + o.cs - 1) { l = !0; break } } } else if (t == o.r) { if (a < o.r + o.rs - 1) { if (r >= o.c && r <= o.c + o.cs - 1) { l = !0; break } if (n >= o.c && n <= o.c + o.cs - 1) { l = !0; break } if (r < o.c && n > o.c + o.cs - 1) { l = !0; break } } else if (a >= o.r + o.rs - 1) { if (r > o.c && r <= o.c + o.cs - 1) { l = !0; break } if (n >= o.c && n < o.c + o.cs - 1) { l = !0; break } if (r == o.c && n < o.c + o.cs - 1) { l = !0; break } if (r > o.c && n == o.c + o.cs - 1) { l = !0; break } } } else if (t <= o.r + o.rs - 1) { if (r >= o.c && r <= o.c + o.cs - 1) { l = !0; break } if (n >= o.c && n <= o.c + o.cs - 1) { l = !0; break } if (r < o.c && n > o.c + o.cs - 1) { l = !0; break } } } return l } function Ca(e) { return Math.ceil(e.charCodeAt().toString(2).length / 8) } function Ta(e) { var t, a = { times: 1, num: 0 }; if (t = e, Math.floor(t) === t) return a.num = e, a; var r = e + "", n = r.indexOf("."), l = r.substr(n + 1).length, i = Math.pow(10, l), o = parseInt(e * i + .5, 10); return a.times = i, a.num = o, a } function Aa(e, t, a) { var r = Ta(e), n = Ta(t), l = r.num, i = n.num, o = r.times, s = n.times, c = o > s ? o : s; switch (a) { case "add": return (o === s ? l + i : o > s ? l + i * (o / s) : l * (s / o) + i) / c; case "subtract": return (o === s ? l - i : o > s ? l - i * (o / s) : l * (s / o) - i) / c; case "multiply": return l * i / (o * s); case "divide": return Aa(l / i, s / o, "multiply") } } function Sa(e) { return (Sa = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e })(e) } function Ia(e, t, a) { return t in e ? Object.defineProperty(e, t, { value: a, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = a, e } function Ra(e, t) { var a = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); t && (r = r.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), a.push.apply(a, r) } return a } function $a(e) { for (var t = 1; t < arguments.length; t++) { var a = null != arguments[t] ? arguments[t] : {}; t % 2 ? Ra(Object(a), !0).forEach((function (t) { Ia(e, t, a[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(a)) : Ra(Object(a)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(a, t)) })) } return e } function qa(e, t) { return function (e) { if (Array.isArray(e)) return e }(e) || function (e, t) { if ("undefined" == typeof Symbol || !(Symbol.iterator in Object(e))) return; var a = [], r = !0, n = !1, l = void 0; try { for (var i, o = e[Symbol.iterator](); !(r = (i = o.next()).done) && (a.push(i.value), !t || a.length !== t); r = !0); } catch (e) { n = !0, l = e } finally { try { r || null == o.return || o.return() } finally { if (n) throw l } } return a }(e, t) || Fa(e, t) || function () { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function Da(e) { return function (e) { if (Array.isArray(e)) return Ea(e) }(e) || function (e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || Fa(e) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function Fa(e, t) { if (e) { if ("string" == typeof e) return Ea(e, t); var a = Object.prototype.toString.call(e).slice(8, -1); return "Object" === a && e.constructor && (a = e.constructor.name), "Map" === a || "Set" === a ? Array.from(e) : "Arguments" === a || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a) ? Ea(e, t) : void 0 } } function Ea(e, t) { (null == t || t > e.length) && (t = e.length); for (var a = 0, r = new Array(t); a < t; a++)r[a] = e[a]; return r } function Ma(e, t) { var a; if ("undefined" == typeof Symbol || null == e[Symbol.iterator]) { if (Array.isArray(e) || (a = Fa(e)) || t && e && "number" == typeof e.length) { a && (e = a); var r = 0, n = function () { }; return { s: n, n: function () { return r >= e.length ? { done: !0 } : { done: !1, value: e[r++] } }, e: function (e) { throw e }, f: n } } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") } var l, i = !0, o = !1; return { s: function () { a = e[Symbol.iterator]() }, n: function () { var e = a.next(); return i = e.done, e }, e: function (e) { o = !0, l = e }, f: function () { try { i || null == a.return || a.return() } finally { if (o) throw l } } } } Number.prototype.add = function (e) { var t = parseFloat(e); if ("number" != typeof t || Number.isNaN(t)) throw new Error("请输入数字或者数字字符串~"); return Aa(this, t, "add") }, Number.prototype.subtract = function (e) { var t = parseFloat(e); if ("number" != typeof t || Number.isNaN(t)) throw new Error("请输入数字或者数字字符串~"); return Aa(this, t, "subtract") }, Number.prototype.multiply = function (e) { var t = parseFloat(e); if ("number" != typeof t || Number.isNaN(t)) throw new Error("请输入数字或者数字字符串~"); return Aa(this, t, "multiply") }, Number.prototype.divide = function (e) { var t = parseFloat(e); if ("number" != typeof t || Number.isNaN(t)) throw new Error("请输入数字或者数字字符串~"); return Aa(this, t, "divide") }, Number.prototype.tofixed = function (e) { var t = parseFloat(e); if ("number" != typeof t || Number.isNaN(t)) throw new Error("请输入数字或者数字字符串~"); return function (e, t) { if (t || (t = 2), !ba(e)) return e; var a = e.toFixed(t), r = a.indexOf("."), n = a.substring(0, r), l = a.substring(r + 1, a.length); if (l) for (var i = l.length - 1; 0 != i && ("0" == l.charAt(i) || i != l.length - 1); i--)l = l.substring(0, i); return Number(n + "." + l) }(this, t) }; var Na, Pa, za = { container: "luckysheet", column: 60, row: 84, allowCopy: !0, showtoolbar: !0, showinfobar: !0, showsheetbar: !0, showstatisticBar: !0, pointEdit: !1, pointEditUpdate: null, pointEditZoom: 1, data: [{ name: "Sheet1", color: "", status: "1", order: "0", data: [], config: {}, index: 0 }, { name: "Sheet2", color: "", status: "0", order: "1", data: [], config: {}, index: 1 }, { name: "Sheet3", color: "", status: "0", order: "2", data: [], config: {}, index: 2 }], title: "Luckysheet Demo", userInfo: !1, userMenuItem: [{ url: "www.baidu.com", icon: '<i class="fa fa-folder" aria-hidden="true"></i>', name: "我的表格" }, { url: "www.baidu.com", icon: '<i class="fa fa-sign-out" aria-hidden="true"></i>', name: "退出登陆" }], myFolderUrl: "www.baidu.com", config: {}, fullscreenmode: !0, devicePixelRatio: window.devicePixelRatio, allowEdit: !0, loadUrl: "", loadSheetUrl: "", gridKey: "", updateUrl: "", updateImageUrl: "", allowUpdate: !1, functionButton: "", showConfigWindowResize: !0, enableAddRow: !0, enableAddBackTop: !0, autoFormatw: !1, accuracy: void 0, pageInfo: { queryExps: "", reportId: "", fields: "", mobile: "", frezon: "", currentPage: "", totalPage: 10, pageUrl: "" }, editMode: !1, beforeCreateDom: null, fireMousedown: null, lang: "en", plugins: [], forceCalculation: !1, rowHeaderWidth: 46, columnHeaderHeight: 20, defaultColWidth: 73, defaultRowHeight: 19, defaultFontSize: 10, limitSheetNameLength: !0, defaultSheetNameMaxLength: 31, sheetFormulaBar: !0, showtoolbarConfig: {}, showsheetbarConfig: {}, showstatisticBarConfig: {}, cellRightClickConfig: {}, sheetRightClickConfig: {} }, La = Array.isArray || function (e) { return "Array" == f(e) }, Oa = function (e, t, a) { var r = x(t); r in e ? F.f(e, r, m(0, a)) : e[r] = a }, Ba = $t("species"), Va = function (e, t) { var a; return La(e) && ("function" != typeof (a = e.constructor) || a !== Array && !La(a.prototype) ? k(a) && null === (a = a[Ba]) && (a = void 0) : a = void 0), new (void 0 === a ? Array : a)(0 === t ? 0 : t) }, Ha = oe("navigator", "userAgent") || "", Ua = l.process, ja = Ua && Ua.versions, Ga = ja && ja.v8; Ga ? Pa = (Na = Ga.split("."))[0] + Na[1] : Ha && (!(Na = Ha.match(/Edge\/(\d+)/)) || Na[1] >= 74) && (Na = Ha.match(/Chrome\/(\d+)/)) && (Pa = Na[1]); var Wa = Pa && +Pa, Ya = $t("species"), Xa = function (e) { return Wa >= 51 || !o((function () { var t = []; return (t.constructor = {})[Ya] = function () { return { foo: 1 } }, 1 !== t[e](Boolean).foo })) }, Ka = $t("isConcatSpreadable"), Za = Wa >= 51 || !o((function () { var e = []; return e[Ka] = !1, e.concat()[0] !== e })), Qa = Xa("concat"), Ja = function (e) { if (!k(e)) return !1; var t = e[Ka]; return void 0 !== t ? !!t : La(e) }; Ee({ target: "Array", proto: !0, forced: !Za || !Qa }, { concat: function (e) { var t, a, r, n, l, i = na(this), o = Va(i, 0), s = 0; for (t = -1, r = arguments.length; t < r; t++)if (Ja(l = -1 === t ? i : arguments[t])) { if (s + (n = he(l.length)) > 9007199254740991) throw TypeError("Maximum allowed index exceeded"); for (a = 0; a < n; a++, s++)a in l && Oa(o, s, l[a]) } else { if (s >= 9007199254740991) throw TypeError("Maximum allowed index exceeded"); Oa(o, s++, l) } return o.length = s, o } }); var er = function (e) { if ("function" != typeof e) throw TypeError(String(e) + " is not a function"); return e }, tr = function (e, t, a) { if (er(e), void 0 === t) return e; switch (a) { case 0: return function () { return e.call(t) }; case 1: return function (a) { return e.call(t, a) }; case 2: return function (a, r) { return e.call(t, a, r) }; case 3: return function (a, r, n) { return e.call(t, a, r, n) } }return function () { return e.apply(t, arguments) } }, ar = [].push, rr = function (e) { var t = 1 == e, a = 2 == e, r = 3 == e, n = 4 == e, l = 6 == e, i = 5 == e || l; return function (o, s, c, u) { for (var d, h, m = na(o), p = v(m), f = tr(s, c, 3), g = he(p.length), y = 0, b = u || Va, k = t ? b(o, g) : a ? b(o, 0) : void 0; g > y; y++)if ((i || y in p) && (h = f(d = p[y], y, m), e)) if (t) k[y] = h; else if (h) switch (e) { case 3: return !0; case 5: return d; case 6: return y; case 2: ar.call(k, d) } else if (n) return !1; return l ? -1 : r || n ? n : k } }, nr = { forEach: rr(0), map: rr(1), filter: rr(2), some: rr(3), every: rr(4), find: rr(5), findIndex: rr(6) }, lr = $t("unscopables"), ir = Array.prototype; null == ir[lr] && F.f(ir, lr, { configurable: !0, value: tt(null) }); var or = function (e) { ir[lr][e] = !0 }, sr = nr.find, cr = !0, ur = Le("find"); "find" in [] && Array(1).find((function () { cr = !1 })), Ee({ target: "Array", proto: !0, forced: cr || !ur }, { find: function (e) { return sr(this, e, arguments.length > 1 ? arguments[1] : void 0) } }), or("find"); var dr = nr.forEach, hr = Me("forEach"), mr = Le("forEach"), pr = hr && mr ? [].forEach : function (e) { return dr(this, e, arguments.length > 1 ? arguments[1] : void 0) }; Ee({ target: "Array", proto: !0, forced: [].forEach != pr }, { forEach: pr }); var fr = [].join, gr = v != Object, vr = Me("join", ","); Ee({ target: "Array", proto: !0, forced: gr || !vr }, { join: function (e) { return fr.call(b(this), void 0 === e ? "," : e) } }); var yr = Xa("slice"), br = Le("slice", { ACCESSORS: !0, 0: 0, 1: 2 }), kr = $t("species"), xr = [].slice, wr = Math.max; Ee({ target: "Array", proto: !0, forced: !yr || !br }, { slice: function (e, t) { var a, r, n, l = b(this), i = he(l.length), o = fe(e, i), s = fe(void 0 === t ? i : t, i); if (La(l) && ("function" != typeof (a = l.constructor) || a !== Array && !La(a.prototype) ? k(a) && null === (a = a[kr]) && (a = void 0) : a = void 0, a === Array || void 0 === a)) return xr.call(l, o, s); for (r = new (void 0 === a ? Array : a)(wr(s - o, 0)), n = 0; o < s; o++, n++)o in l && Oa(r, n, l[o]); return r.length = n, r } }); var _r = nr.some, Cr = Me("some"), Tr = Le("some"); Ee({ target: "Array", proto: !0, forced: !Cr || !Tr }, { some: function (e) { return _r(this, e, arguments.length > 1 ? arguments[1] : void 0) } }); var Ar = Xa("splice"), Sr = Le("splice", { ACCESSORS: !0, 0: 0, 1: 2 }), Ir = Math.max, Rr = Math.min; Ee({ target: "Array", proto: !0, forced: !Ar || !Sr }, { splice: function (e, t) { var a, r, n, l, i, o, s = na(this), c = he(s.length), u = fe(e, c), d = arguments.length; if (0 === d ? a = r = 0 : 1 === d ? (a = 0, r = c - u) : (a = d - 2, r = Rr(Ir(ue(t), 0), c - u)), c + a - r > 9007199254740991) throw TypeError("Maximum allowed length exceeded"); for (n = Va(s, r), l = 0; l < r; l++)(i = u + l) in s && Oa(n, l, s[i]); if (n.length = r, a < r) { for (l = u; l < c - r; l++)o = l + a, (i = l + r) in s ? s[o] = s[i] : delete s[o]; for (l = c; l > c - r + a; l--)delete s[l - 1] } else if (a > r) for (l = c - r; l > u; l--)o = l + a - 1, (i = l + r - 1) in s ? s[o] = s[i] : delete s[o]; for (l = 0; l < a; l++)s[l + u] = arguments[l + 2]; return s.length = c - r + a, n } }); var $r = !o((function () { function e() { } return e.prototype.constructor = null, Object.getPrototypeOf(new e) !== e.prototype })), qr = X("IE_PROTO"), Dr = Object.prototype, Fr = $r ? Object.getPrototypeOf : function (e) { return e = na(e), _(e, qr) ? e[qr] : "function" == typeof e.constructor && e instanceof e.constructor ? e.constructor.prototype : e instanceof Object ? Dr : null }; var Er = o((function () { var e = F.f({}, "a", { configurable: !0 }); return !1 !== Reflect.set(Fr(e), "a", 1, e) })); Ee({ target: "Reflect", stat: !0, forced: Er }, { set: function e(t, a, r) { var n, l, i = arguments.length < 4 ? t : arguments[3], o = R.f(q(t), a); if (!o) { if (k(l = Fr(t))) return e(l, a, r, i); o = m(0) } if (_(o, "value")) { if (!1 === o.writable || !k(i)) return !1; if (n = R.f(i, a)) { if (n.get || n.set || !1 === n.writable) return !1; n.value = r, F.f(i, a, n) } else F.f(i, a, m(0, r)); return !0 } return void 0 !== o.set && (o.set.call(i, r), !0) } }), ra("match", 1, (function (e, t, a) { return [function (t) { var a = y(this), r = null == t ? void 0 : t[e]; return void 0 !== r ? r.call(t, a) : new RegExp(t)[e](String(a)) }, function (e) { var r = a(t, e, this); if (r.done) return r.value; var n = q(e), l = String(this); if (!n.global) return ca(n, l); var i = n.unicode; n.lastIndex = 0; for (var o, s = [], c = 0; null !== (o = ca(n, l));) { var u = String(o[0]); s[c] = u, "" === u && (n.lastIndex = sa(l, he(n.lastIndex), i)), c++ } return 0 === c ? null : s }] })); var Mr = $t("match"), Nr = function (e) { var t; return k(e) && (void 0 !== (t = e[Mr]) ? !!t : "RegExp" == f(e)) }, Pr = $t("species"), zr = function (e, t) { var a, r = q(e).constructor; return void 0 === r || null == (a = q(r)[Pr]) ? t : er(a) }, Lr = [].push, Or = Math.min, Br = !o((function () { return !RegExp(4294967295, "y") })); ra("split", 2, (function (e, t, a) { var r; return r = "c" == "abbc".split(/(b)*/)[1] || 4 != "test".split(/(?:)/, -1).length || 2 != "ab".split(/(?:ab)*/).length || 4 != ".".split(/(.?)(.?)/).length || ".".split(/()()/).length > 1 || "".split(/.?/).length ? function (e, a) { var r = String(y(this)), n = void 0 === a ? 4294967295 : a >>> 0; if (0 === n) return []; if (void 0 === e) return [r]; if (!Nr(e)) return t.call(r, e, n); for (var l, i, o, s = [], c = (e.ignoreCase ? "i" : "") + (e.multiline ? "m" : "") + (e.unicode ? "u" : "") + (e.sticky ? "y" : ""), u = 0, d = new RegExp(e.source, c + "g"); (l = Gt.call(d, r)) && !((i = d.lastIndex) > u && (s.push(r.slice(u, l.index)), l.length > 1 && l.index < r.length && Lr.apply(s, l.slice(1)), o = l[0].length, u = i, s.length >= n));)d.lastIndex === l.index && d.lastIndex++; return u === r.length ? !o && d.test("") || s.push("") : s.push(r.slice(u)), s.length > n ? s.slice(0, n) : s } : "0".split(void 0, 0).length ? function (e, a) { return void 0 === e && 0 === a ? [] : t.call(this, e, a) } : t, [function (t, a) { var n = y(this), l = null == t ? void 0 : t[e]; return void 0 !== l ? l.call(t, n, a) : r.call(String(n), t, a) }, function (e, n) { var l = a(r, e, this, n, r !== t); if (l.done) return l.value; var i = q(e), o = String(this), s = zr(i, RegExp), c = i.unicode, u = (i.ignoreCase ? "i" : "") + (i.multiline ? "m" : "") + (i.unicode ? "u" : "") + (Br ? "y" : "g"), d = new s(Br ? i : "^(?:" + i.source + ")", u), h = void 0 === n ? 4294967295 : n >>> 0; if (0 === h) return []; if (0 === o.length) return null === ca(d, o) ? [o] : []; for (var m = 0, p = 0, f = []; p < o.length;) { d.lastIndex = Br ? p : 0; var g, v = ca(d, Br ? o : o.slice(p)); if (null === v || (g = Or(he(d.lastIndex + (Br ? 0 : p)), o.length)) === m) p = sa(o, p, c); else { if (f.push(o.slice(m, p)), f.length === h) return f; for (var y = 1; y <= v.length - 1; y++)if (f.push(v[y]), f.length === h) return f; p = m = g } } return f.push(o.slice(m)), f }] }), !Br); var Vr = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }; for (var Hr in Vr) { var Ur = l[Hr], jr = Ur && Ur.prototype; if (jr && jr.forEach !== pr) try { E(jr, "forEach", pr) } catch (va) { jr.forEach = pr } } var Gr = nr.every, Wr = Me("every"), Yr = Le("every"); Ee({ target: "Array", proto: !0, forced: !Wr || !Yr }, { every: function (e) { return Gr(this, e, arguments.length > 1 ? arguments[1] : void 0) } }); var Xr = nr.filter, Kr = Xa("filter"), Zr = Le("filter"); Ee({ target: "Array", proto: !0, forced: !Kr || !Zr }, { filter: function (e) { return Xr(this, e, arguments.length > 1 ? arguments[1] : void 0) } }); var Qr = [], Jr = Qr.sort, en = o((function () { Qr.sort(void 0) })), tn = o((function () { Qr.sort(null) })), an = Me("sort"); Ee({ target: "Array", proto: !0, forced: en || !tn || !an }, { sort: function (e) { return void 0 === e ? Jr.call(na(this)) : Jr.call(na(this), er(e)) } }); var rn = Object.assign, nn = Object.defineProperty, ln = !rn || o((function () { if (s && 1 !== rn({ b: 1 }, rn(nn({}, "a", { enumerable: !0, get: function () { nn(this, "b", { value: 3, enumerable: !1 }) } }), { b: 2 })).b) return !0; var e = {}, t = {}, a = Symbol(); return e[a] = 7, "abcdefghijklmnopqrst".split("").forEach((function (e) { t[e] = e })), 7 != rn({}, e)[a] || "abcdefghijklmnopqrst" != Ye(rn({}, t)).join("") })) ? function (e, t) { for (var a = na(e), r = arguments.length, n = 1, l = _e.f, i = h.f; r > n;)for (var o, c = v(arguments[n++]), u = l ? Ye(c).concat(l(c)) : Ye(c), d = u.length, m = 0; d > m;)o = u[m++], s && !i.call(c, o) || (a[o] = c[o]); return a } : rn; Ee({ target: "Object", stat: !0, forced: Object.assign !== ln }, { assign: ln }); var on = h.f, sn = function (e) { return function (t) { for (var a, r = b(t), n = Ye(r), l = n.length, i = 0, o = []; l > i;)a = n[i++], s && !on.call(r, a) || o.push(e ? [a, r[a]] : r[a]); return o } }, cn = { entries: sn(!0), values: sn(!1) }.values; Ee({ target: "Object", stat: !0 }, { values: function (e) { return cn(e) } }); var un = /"/g, dn = function (e, t, a, r) { var n = String(y(e)), l = "<" + t; return "" !== a && (l += " " + a + '="' + String(r).replace(un, "&quot;") + '"'), l + ">" + n + "</" + t + ">" }, hn = function (e) { return o((function () { var t = ""[e]('"'); return t !== t.toLowerCase() || t.split('"').length > 3 })) }; Ee({ target: "String", proto: !0, forced: hn("bold") }, { bold: function () { return dn(this, "b", "", "") } }), Ee({ target: "String", proto: !0, forced: hn("link") }, { link: function (e) { return dn(this, "a", "href", e) } }); var mn, pn, fn = { en: { functionlist: [{ n: "SUMIF", t: 0, d: "Returns a conditional sum across a range.", a: "A conditional sum across a range.", m: [2, 3], p: [{ name: "range", detail: "The range which is tested against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion", detail: "The pattern or test to apply to `range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "sum_range", detail: "The range to be summed, if different from `range`.", example: "B1:B10", require: "o", repeat: "n", type: "range" }] }, { n: "TAN", t: 0, d: "Returns the tangent of an angle provided in radians.", a: "Tangent of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the tangent of, in radians.", example: "45*PI()/180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TANH", t: 0, d: "Returns the hyperbolic tangent of any real number.", a: "Hyperbolic tangent of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic tangent of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CEILING", t: 0, d: "Rounds a number up to the nearest integer multiple of specified significance `factor`.", a: "Rounds number up to nearest multiple of a factor.", m: [2, 2], p: [{ name: "value", detail: "The value to round up to the nearest integer multiple of `factor`.", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN", t: 0, d: "Returns the inverse tangent of a value, in radians.", a: "Inverse tangent of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse tangent.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ASINH", t: 0, d: "Returns the inverse hyperbolic sine of a number.", a: "Inverse hyperbolic sine of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic sine.", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ABS", t: 0, d: "Returns the absolute value of a number.", a: "Absolute value of a number.", m: [1, 1], p: [{ name: "value", detail: "The number of which to return the absolute value.", example: "-2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOS", t: 0, d: "Returns the inverse cosine of a value, in radians.", a: "Inverse cosine of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOSH", t: 0, d: "Returns the inverse hyperbolic cosine of a number.", a: "Inverse hyperbolic cosine of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTINOMIAL", t: 0, d: "Returns the factorial of the sum of values divided by the product of the values' factorials.", a: "Multinomial distribution function.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "ATANH", t: 0, d: "Returns the inverse hyperbolic tangent of a number.", a: "Inverse hyperbolic tangent of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN2", t: 0, d: "Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.", a: "Arctangent of a value.", m: [2, 2], p: [{ name: "x", detail: "The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "y", detail: "The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTBLANK", t: 1, d: "Returns the number of empty values in a list of values and ranges.", a: "Number of empty values.", m: [1, 1], p: [{ name: "value1", detail: "The first value or range in which to count the number of blanks.", example: "A2:C100", require: "m", repeat: "n", type: "range" }] }, { n: "COSH", t: 0, d: "Returns the hyperbolic cosine of any real number.", a: "Hyperbolic cosine of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic cosine of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "INT", t: 0, d: "Rounds a number down to the nearest integer that is less than or equal to it.", a: "Rounds number down to nearest integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round down to the nearest integer.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISEVEN", t: 0, d: "Checks whether the provided value is even.", a: "Whether the provided value is even.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as even.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISODD", t: 0, d: "Checks whether the provided value is odd.", a: "Whether the provided value is odd.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as odd.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LCM", t: 0, d: "Returns the least common multiple of one or more integers.", a: "Least common multiple of one or more integers.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range whose factors to consider in a calculation to find the least common multiple.", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges whose factors to consider to find the least common multiple.", example: "3", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LN", t: 0, d: "Returns the logarithm of a number, base e (Euler's number).", a: "The logarithm of a number, base e (euler's number).", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the logarithm, base e.", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOG", t: 0, d: "Returns the logarithm of a number with respect to a base.", a: "The logarithm of a number with respect to a base.", m: [1, 2], p: [{ name: "value", detail: "The value for which to calculate the logarithm.", example: "128", require: "m", repeat: "n", type: "rangenumber" }, { name: "base", detail: "The base to use for calculation of the logarithm.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "LOG10", t: 0, d: "Returns the logarithm of a number, base 10.", a: "The logarithm of a number, base 10.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the logarithm, base 10.", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MOD", t: 0, d: "Returns the result of the modulo operator, the remainder after a division operation.", a: "Modulo (remainder) operator.", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided to find the remainder.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MROUND", t: 0, d: "Rounds one number to the nearest integer multiple of another.", a: "Rounds a number to the nearest integer multiple.", m: [2, 2], p: [{ name: "value", detail: "The number to round to the nearest integer multiple of another.", example: "21", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ODD", t: 0, d: "Rounds a number up to the nearest odd integer.", a: "Rounds a number up to the nearest odd integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round to the next greatest odd number.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMSQ", t: 0, d: "Returns the sum of the squares of a series of numbers and/or cells.", a: "Sum of squares.", m: [1, 255], p: [{ name: "value1", detail: "The first number or range whose squares to add together.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional numbers or ranges whose squares to add to the square(s) of `value1`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMBIN", t: 0, d: "Returns the number of ways to choose some number of objects from a pool of a given size of objects.", a: "Number of combinations from a set of objects.", m: [2, 2], p: [{ name: "n", detail: "The size of the pool of objects to choose from.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "The number of objects to choose.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUM", t: 0, d: "Returns the sum of a series of numbers and/or cells.", a: "Sum of a series of numbers and/or cells.", m: [1, 255], p: [{ name: "value1", detail: "The first number or range to add together.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional numbers or ranges to add to `value1`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SUBTOTAL", t: 0, d: "Returns a subtotal for a vertical range of cells using a specified aggregation function.", a: "Subtotal for a range using a specific function.", m: [2, 256], p: [{ name: "function_code", detail: "The function to use in subtotal aggregation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "range1", detail: "The first range over which to calculate a subtotal.", example: "A2:A5", require: "m", repeat: "n", type: "range" }, { name: "range2", detail: "Additional ranges over which to calculate subtotals.", example: "B2:B8", require: "o", repeat: "y", type: "range" }] }, { n: "ASIN", t: 0, d: "Returns the inverse sine of a value, in radians.", a: "Inverse sine of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTIF", t: 1, d: "Returns a conditional count across a range.", a: "A conditional count across a range.", m: [2, 2], p: [{ name: "range", detail: "The range that is tested against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion", detail: "The pattern or test to apply to `range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "RADIANS", t: 0, d: "Converts an angle value in degrees to radians.", a: "Converts an angle value in degrees to radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to convert from degrees to radians.", example: "180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RAND", t: 0, d: "Returns a random number between 0 inclusive and 1 exclusive.", a: "A random number between 0 inclusive and 1 exclusive.", m: [0, 0], p: [] }, { n: "COUNTUNIQUE", t: 0, d: "Counts the number of unique values in a list of specified values and ranges.", a: "Counts number of unique values in a range.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider for uniqueness.", example: "A1:C100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider for uniqueness.", example: "1", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DEGREES", t: 0, d: "Converts an angle value in radians to degrees.", a: "Converts an angle value in radians to degrees.", m: [1, 1], p: [{ name: "angle", detail: "The angle to convert from radians to degrees.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ERFC", t: 9, d: "Returns the complementary Gauss error function of a value.", a: "Complementary gauss error function of a value.", m: [1, 1], p: [{ name: "z", detail: "The number for which to calculate the complementary Gauss error function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EVEN", t: 0, d: "Rounds a number up to the nearest even integer.", a: "Rounds a number up to the nearest even integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round to the next greatest even number.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EXP", t: 0, d: "Returns Euler's number, e (~2.718) raised to a power.", a: "Euler's number, e (~2.718) raised to a power.", m: [1, 1], p: [{ name: "exponent", detail: "The exponent to raise e to.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACT", t: 0, d: "Returns the factorial of a number.", a: "Factorial of a number.", m: [1, 1], p: [{ name: "value", detail: "The number or reference to a number whose factorial will be calculated and returned.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACTDOUBLE", t: 0, d: 'Returns the "double factorial" of a number.', a: '"double factorial" of a number.', m: [1, 1], p: [{ name: "value", detail: "The number or reference to a number whose double factorial will be calculated and returned.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PI", t: 0, d: "Returns the value of Pi to 14 decimal places.", a: "The number pi.", m: [0, 0], p: [] }, { n: "FLOOR", t: 0, d: "Rounds a number down to the nearest integer multiple of specified significance `factor`.", a: "Rounds number down to nearest multiple of a factor.", m: [2, 2], p: [{ name: "value", detail: "The value to round down to the nearest integer multiple of `factor`.", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GCD", t: 0, d: "Returns the greatest common divisor of one or more integers.", a: "Greatest common divisor of one or more integers.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range whose factors to consider in a calculation to find the greatest common divisor.", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges whose factors to consider to find the greatest common divisor.", example: "96", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANDBETWEEN", t: 0, d: "Returns a uniformly random integer between two values, inclusive.", a: "Random integer between two values, inclusive.", m: [2, 2], p: [{ name: "low", detail: "The low end of the random range.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "high", detail: "The high end of the random range.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUND", t: 0, d: "Rounds a number to a certain number of decimal places according to standard rules.", a: "Rounds a number according to standard rules.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDDOWN", t: 0, d: "Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.", a: "Rounds down a number.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places, always rounding down.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDUP", t: 0, d: "Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.", a: "Rounds up a number.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places, always rounding up.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SERIESSUM", t: 0, d: "Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a", a: "Sum of a power series.", m: [4, 4], p: [{ name: "x", detail: "The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "The initial power to which to raise `x` in the power series.", example: "0", require: "m", repeat: "n", type: "rangenumber" }, { name: "m", detail: "The additive increment by which to increase `x`.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "a", detail: "The array or range containing the coefficients of the power series.", example: "{FACT(0)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIGN", t: 0, d: "Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.", a: "Sign of a provided number (+/-/0).", m: [1, 1], p: [{ name: "value", detail: "The value whose sign will be evaluated.", example: "-42", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIN", t: 0, d: "Returns the sine of an angle provided in radians.", a: "Sine of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the sine of, in radians.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SINH", t: 0, d: "Returns the hyperbolic sine of any real number.", a: "Hyperbolic sine of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic sine of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRT", t: 0, d: "Returns the positive square root of a positive number.", a: "Positive square root of a positive number.", m: [1, 1], p: [{ name: "value", detail: "The number for which to calculate the positive square root.", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRTPI", t: 0, d: "Returns the positive square root of the product of Pi and the given positive number.", a: "Square root of the product of pi and number.", m: [1, 1], p: [{ name: "value", detail: "The number which will be multiplied by Pi and have the product's square root returned", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GAMMALN", t: 1, d: "Returns the logarithm of a specified Gamma function, base e (Euler's number).", a: "Logarithm of gamma function.", m: [1, 1], p: [{ name: "value", detail: "The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COS", t: 0, d: "Returns the cosine of an angle provided in radians.", a: "Cosine of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the cosine of, in radians.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRUNC", t: 0, d: "Truncates a number to a certain number of significant digits by omitting less significant digits.", a: "Truncates a number.", m: [1, 2], p: [{ name: "value", detail: "The value to be truncated.", example: "3.141592654", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of significant digits to the right of the decimal point to retain.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUOTIENT", t: 0, d: "Returns one number divided by another.", a: "One number divided by another.", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POWER", t: 0, d: "Returns a number raised to a power.", a: "A number raised to a power.", m: [2, 2], p: [{ name: "base", detail: "The number to raise to the `exponent` power.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "exponent", detail: "The exponent to raise `base` to.", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMIFS", t: 0, d: "Returns the sum of a range depending on multiple criteria.", a: "Sums a range depending on multiple criteria.", m: [3, 257], p: [{ name: "sum_range", detail: "The range to sum.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criteria_range1", detail: "The range to check against criterion1.", example: " B1:B10", require: "m", repeat: "n", type: "range" }, { name: "criterion1", detail: "The pattern or test to apply to criteria_range1.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " C1:C10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTIFS", t: 1, d: "Returns the count of a range depending on multiple criteria.", a: "Count values depending on multiple criteria.", m: [2, 256], p: [{ name: "criteria_range1", detail: "The range to check against `criterion1`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion1", detail: "The pattern or test to apply to `criteria_range1`.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " B1:B10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PRODUCT", t: 0, d: "Returns the result of multiplying a series of numbers together.", a: "Result of multiplying a series of numbers together.", m: [1, 255], p: [{ name: "factor1", detail: "The first number or range to calculate for the product.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor2", detail: "More numbers or ranges to calculate for the product.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HARMEAN", t: 1, d: "Calculates the harmonic mean of a dataset.", a: "The harmonic mean of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HYPGEOMDIST", t: 1, d: "Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.", a: "Hypergeometric distribution probability.", m: [5, 5], p: [{ name: "num_successes", detail: "The desired number of successes.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_draws", detail: "The number of permitted draws.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "successes_in_pop", detail: "The total number of successes in the population.", example: "20", require: "m", repeat: "n", type: "rangenumber" }, { name: "pop_size", detail: "The total size of the population", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\n\nif FALSE(), it returns the probability density function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "INTERCEPT", t: 1, d: "Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).", a: "Y-intercept of line derived via linear regression.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "KURT", t: 1, d: 'Calculates the kurtosis of a dataset, which describes the shape, and in particular the "peakedness" of that dataset.', a: "Kurtosis of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LARGE", t: 1, d: "Returns the nth largest element from a data set, where n is user-defined.", a: "Nth largest element from a data set.", m: [2, 2], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "The rank from largest to smallest of the element to return.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STDEVA", t: 1, d: "Calculates the standard deviation based on a sample, setting text to the value `0`.", a: "Standard deviation of sample (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STDEVP", t: 1, d: "Calculates the standard deviation based on an entire population.", a: "Standard deviation of an entire population.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "GEOMEAN", t: 1, d: "Calculates the geometric mean of a dataset.", a: "The geometric mean of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANK_EQ", t: 1, d: "Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.", a: "Top rank of a specified value in a dataset.", m: [2, 3], p: [{ name: "value", detail: "The value whose rank will be determined.", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "is_ascending", detail: "Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANK_AVG", t: 1, d: "Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.", a: "Average rank of a specified value in a dataset.", m: [2, 3], p: [{ name: "value", detail: "The value whose rank will be determined.", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "is_ascending", detail: "Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PERCENTRANK_EXC", t: 1, d: "Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.", a: "Percentage rank (percentile) from 0 to 1 exclusive.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value", detail: "The value whose percentage rank will be determined.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant figures to use in the calculation. Default is 3.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTRANK_INC", t: 1, d: "Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.", a: "Percentage rank (percentile) from 0 to 1 inclusive.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value", detail: "The value whose percentage rank will be determined.", example: " A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant figures to use in the calculation. Default is 3.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FORECAST", t: 1, d: "Calculates the expected y-value for a specified x based on a linear regression of a dataset.", a: "Expected y-value based of linear regression.", m: [3, 3], p: [{ name: "x", detail: "The value on the x-axis to forecast.", example: "A1", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHERINV", t: 1, d: "Returns the inverse Fisher transformation of a specified value.", a: "Inverse fisher transformation of a specified value.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse Fisher transformation.", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHER", t: 1, d: "Returns the Fisher transformation of a specified value.", a: "Fisher transformation of a specified value.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the Fisher transformation.", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MODE_SNGL", t: 1, d: "Returns the most commonly occurring value in a dataset.", a: "Most commonly occurring value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating mode.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating mode.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "WEIBULL_DIST", t: 1, d: "Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.", a: "Weibull distribution function.", m: [4, 4], p: [{ name: "x", detail: "The input to the Weibull distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "shape", detail: "The shape parameter of the Weibull distribution function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "scale", detail: "The scale parameter of the Weibull distribution function.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the cumulative distribution function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "COUNT", t: 1, d: "Returns the number of numeric values in a dataset.", a: "The number of numeric values in dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when counting.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when counting.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTA", t: 1, d: "Returns the number of values in a dataset.", a: "The number of values in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when counting.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when counting.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVEDEV", t: 1, d: "Calculates the average of the magnitudes of deviations of data from a dataset's mean.", a: "Average magnitude of deviations from mean.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "AVERAGE", t: 1, d: "Returns the numerical average value in a dataset, ignoring text.", a: "Numerical average value in a dataset, ignoring text.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the average value.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the average value.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVERAGEA", t: 1, d: "Returns the numerical average value in a dataset.", a: "Numerical average value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the average value.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the average value.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BINOM_DIST", t: 1, d: "Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.", a: "Binomial distribution probability.", m: [4, 4], p: [{ name: "num_successes", detail: "The number of successes for which to calculate the probability in `num_trials` trials.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_trials", detail: "The number of independent trials.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the binomial cumulative distribution.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BINOM_INV", t: 1, d: "Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.", a: "Inverse cumulative binomial distribution function.", m: [3, 3], p: [{ name: "num_trials", detail: "The number of independent trials.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "target_prob", detail: "The desired threshold probability.", example: "0.8", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONFIDENCE_NORM", t: 1, d: "Calculates the width of half the confidence interval for a normal distribution.", a: "Confidence interval for a normal distribution.", m: [3, 3], p: [{ name: "alpha", detail: "One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.", example: "0.05", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation of the population.", example: "1.6", require: "m", repeat: "n", type: "rangenumber" }, { name: "pop_size", detail: "The size of the population.", example: "250", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CORREL", t: 1, d: "Calculates r, the Pearson product-moment correlation coefficient of a dataset.", a: "Pearson Product-Moment Correlation Coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_P", t: 1, d: "Calculates the covariance of a dataset.", a: "The covariance of a dataset.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_S", t: 1, d: "Calculates the sample covariance of a dataset.", a: "The sample covariance of a dataset.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DEVSQ", t: 1, d: "Calculates the sum of squares of deviations based on a sample.", a: "The sum of squares of deviations based on a sample.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "EXPON_DIST", t: 1, d: "Returns the value of the exponential distribution function with a specified lambda at a specified value.", a: "Exponential distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the exponential distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "lambda", detail: "The lambda to specify the exponential distribution function.", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the exponential cumulative distribution.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIF", t: 1, d: "Returns the average of a range depending on criteria.", a: "Average of values depending on criteria.", m: [2, 3], p: [{ name: "criteria_range", detail: "The range to check against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion", detail: "The pattern or test to apply to `criteria_range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "average_range", detail: "The range to average. If not included, `criteria_range` is used for the average instead.", example: "B1:B10", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIFS", t: 1, d: "Returns the average of a range depending on multiple criteria.", a: "Average of values depending on multiple criteria.", m: [2, 255], p: [{ name: "average_range", detail: "The range to average.", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range1", detail: "The range to check against `criterion1`.", example: " B1:B10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion1", detail: "The pattern or test to apply to `criteria_range1`.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " C1:C10", require: "m", repeat: "n", type: "rangeall" }] }, { n: "PERMUT", t: 1, d: "Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.", a: "Number of permutations from a number of objects.", m: [2, 2], p: [{ name: "n", detail: "The size of the pool of objects to choose from.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "The number of objects to choose.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRIMMEAN", t: 1, d: "Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.", a: "Mean of a dataset excluding high/low ends.", m: [2, 2], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "exclude_proportion", detail: "The proportion of the dataset to exclude, from the extremities of the set.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_EXC", t: 1, d: "Returns the value at a given percentile of a dataset exclusive of 0 and 1.", a: "Value at a given percentile of a dataset exclusive of 0 and 1.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "percentile", detail: "The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_INC", t: 1, d: "Returns the value at a given percentile of a dataset.", a: "Value at a given percentile of a dataset.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "percentile", detail: "The percentile whose value within `data` will be calculated and returned.`", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PEARSON", t: 1, d: "Calculates r, the Pearson product-moment correlation coefficient of a dataset.", a: "Pearson Product-Moment Correlation Coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_INV", t: 1, d: "Returns the value of the inverse standard normal distribution function for a specified value.", a: "Inverse standard normal distribution function.", m: [1, 1], p: [{ name: "x", detail: "The input to the inverse standard normal distribution function.", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_DIST", t: 1, d: "Returns the value of the standard normal cumulative distribution function for a specified value.", a: "Standard normal cumulative distribution function.", m: [2, 2], p: [{ name: "x", detail: "The input to the standard normal cumulative distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NORM_INV", t: 1, d: "Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.", a: "Inverse normal distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the inverse normal distribution function.", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the normal distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the normal distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_DIST", t: 1, d: "Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.", a: "Normal distribution function.", m: [4, 4], p: [{ name: "x", detail: "The input to the normal distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the normal distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the normal distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the normal cumulative distribution function rather than the distribution function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NEGBINOM_DIST", t: 1, d: "Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.", a: "Negative binomial distribution probability.", m: [4, 4], p: [{ name: "num_failures", detail: "The number of failures to model.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_successes", detail: "The number of successes to model.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINA", t: 1, d: "Returns the minimum numeric value in a dataset.", a: "Minimum numeric value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the minimum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the minimum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MIN", t: 1, d: "Returns the minimum value in a numeric dataset.", a: "Minimum value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the minimum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the minimum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MEDIAN", t: 1, d: "Returns the median value in a numeric dataset.", a: "Median value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the median value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the median value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAXA", t: 1, d: "Returns the maximum numeric value in a dataset.", a: "Maximum numeric value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the maximum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the maximum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAX", t: 1, d: "Returns the maximum value in a numeric dataset.", a: "Maximum value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the maximum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the maximum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LOGNORM_INV", t: 1, d: "Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.", a: "Inverse log-normal cumulative distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the inverse log-normal cumulative distribution function.", example: "0.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the inverse log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the inverse log-normal cumulative distribution function.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOGNORM_DIST", t: 1, d: "Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.", a: "Log-normal cumulative distribution probability.", m: [4, 4], p: [{ name: "x", detail: "The input to the log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the log-normal cumulative distribution function.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "Z_TEST", t: 1, d: "Returns the one-tailed p-value of a Z-test with standard distribution.", a: "One-tailed p-value of a z-test.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "value", detail: "The test statistic to use in the Z-test.", example: "B2", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.", example: "3", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PROB", t: 1, d: "Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.", a: "Probability values lie in a range.", m: [3, 4], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A3:A6", require: "m", repeat: "n", type: "range" }, { name: "probabilities", detail: "Array or range containing probabilities corresponding to `data`.", example: "2", require: "m", repeat: "n", type: "range" }, { name: "low_limit", detail: "The lower bound on the value range for which to calculate the probability.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "high_limit", detail: "The upper bound on the value range for which to calculate the probability.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_EXC", t: 1, d: "Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.", a: "Value nearest to a specific quartile of a dataset exclusive of 0 and 4.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quartile_number", detail: "Which quartile to return.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_INC", t: 1, d: "Returns a value nearest to a specified quartile of a dataset.", a: "Value nearest to a specific quartile of a dataset.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quartile_number", detail: "Which quartile value to return.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POISSON_DIST", t: 1, d: "Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.", a: "Poisson distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the Poisson distribution function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the Poisson distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the Poisson cumulative distribution function rather than the distribution function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "RSQ", t: 1, d: "Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.", a: "Square of the correlation coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST", t: 1, d: "Calculates the left tail probability for a Student's t-distribution with a given input (x).", a: "The left-tailed Student's t-distribution", m: [3, 3], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "T_DIST_2T", t: 1, d: "Calculates the probability for two tailed Student's t-distribution with a given input (x).", a: "The two tailed Student's t-distribution", m: [2, 2], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST_RT", t: 1, d: "Calculates the right tail probability for a Student's t-distribution with a given input (x).", a: "The right-tailed Student's t-distribution", m: [2, 2], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV", t: 1, d: "Calculates the negative inverse of the one-tailed TDIST function.", a: "T.INV", m: [2, 2], p: [{ name: "probability", detail: "The probability associated with the two-tailed t-distribution.", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV_2T", t: 1, d: "Calculates the inverse of the two-tailed TDIST function.", a: "T.INV.2T", m: [2, 2], p: [{ name: "probability", detail: "The probability associated with the two-tailed t-distribution.", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_TEST", t: 1, d: "t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.", a: "Returns the probability associated with t-test.", m: [4, 4], p: [{ name: "range1", detail: "The first sample of data or group of cells to consider for the t-test.", example: "A1:A4", require: "m", repeat: "n", type: "rangenumber" }, { name: "range2", detail: "The second sample of data or group of cells to consider for the t-test.", example: "B1:B4", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "Specifies the number of distribution tails.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "Specifies the type of t-test.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "F_DIST", t: 1, d: "Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.", a: "F probability distribution (left-tailed).", m: [4, 4], p: [{ name: "x", detail: "The input to the F probability distribution function. The value at which to evaluate the function.", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "The numerator of the number of degrees of freedom.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "The denominator of the number of degrees of freedom.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Logical value that determines the form of the function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "F_DIST_RT", t: 1, d: "Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.", a: "F probability distribution.", m: [3, 3], p: [{ name: "x", detail: "The input to the F probability distribution function. The value at which to evaluate the function.", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "The numerator of the number of degrees of freedom.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "The denominator of the number of degrees of freedom.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "VAR_P", t: 1, d: "Calculates the variance based on an entire population.", a: "Variance of entire population.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VAR_S", t: 1, d: "Calculates the variance based on a sample.", a: "Variance.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARA", t: 1, d: "Calculates the variance based on a sample, setting text to the value `0`.", a: "Variance of sample (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARPA", t: 1, d: "Calculates the variance based on an entire population, setting text to the value `0`.", a: "Variance of entire population (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STEYX", t: 1, d: "Calculates the standard error of the predicted y-value for each x in the regression of a dataset.", a: "Standard error of predicted y-values in regression.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STANDARDIZE", t: 1, d: "Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.", a: "Normalized equivalent of a random variable.", m: [3, 3], p: [{ name: "value", detail: "The value of the random variable to normalize.", example: "96", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean of the distribution.", example: "80", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation of the distribution.", example: "6.7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SMALL", t: 1, d: "Returns the nth smallest element from a data set, where n is user-defined.", a: "Nth smallest element in a data set.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:B100", require: "m", repeat: "n", type: "range" }, { name: "n", detail: "The rank from smallest to largest of the element to return.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SLOPE", t: 1, d: "Calculates the slope of the line resulting from linear regression of a dataset.", a: "Slope of line from linear regression of data.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SKEW", t: 1, d: "Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.", a: "Skewness of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SKEW_P", t: 1, d: "Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.", a: "Skewness of a population's dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "VLOOKUP", t: 2, d: "Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.", a: "Vertical lookup.", m: [3, 4], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.", example: "A2:B26", require: "m", repeat: "n", type: "rangeall" }, { name: "index", detail: "The column index of the value to be returned, where the first column in `range` is numbered 1.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "is_sorted", detail: "Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "HLOOKUP", t: 2, d: "Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.", a: "Horizontal lookup", m: [3, 4], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.", example: "A2:Z6", require: "m", repeat: "n", type: "rangeall" }, { name: "index", detail: "The row index of the value to be returned, where the first row in `range` is numbered 1.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "is_sorted", detail: "Indicates whether the row to be searched (the first row of the specified range) is sorted.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOOKUP", t: 2, d: "Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.", a: "Look up a value.", m: [2, 3], p: [{ name: "search_key", detail: 'The value to search for in the row or column. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "search_range|search_result_array", detail: "One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.", example: "A1:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "result_range", detail: "The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.", example: "B1:B100", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ADDRESS", t: 2, d: "Returns a cell reference as a string.", a: "Cell reference as a string.", m: [2, 5], p: [{ name: "row", detail: "The row number of the cell reference", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "column", detail: "The column number (not name) of the cell reference. `A` is column number `1`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "absolute_relative_mode", detail: "An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).", example: "4", require: "o", repeat: "n", type: "rangenumber" }, { name: "use_a1_notation", detail: "A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }, { name: "sheet", detail: "Text indicating the name of the sheet into which the address points.", example: '"Sheet2"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "INDIRECT", t: 2, d: "Returns a cell reference specified by a string.", a: "A cell reference specified by a string.", m: [1, 2], p: [{ name: "cell_reference_as_string", detail: "A cell reference, written as a string with surrounding quotation marks.", example: '"Sheet2!"&B10', require: "m", repeat: "n", type: "rangeall" }, { name: "is_A1_notation", detail: "Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROW", t: 2, d: "Returns the row number of a specified cell.", a: "Row number of a specified cell.", m: [0, 1], p: [{ name: "cell_reference", detail: "The cell whose row number will be returned.", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROWS", t: 2, d: "Returns the number of rows in a specified array or range.", a: "Number of rows in a specified array or range.", m: [1, 1], p: [{ name: "range", detail: "The range whose row count will be returned.", example: "A9:A62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COLUMN", t: 2, d: "Returns the column number of a specified cell, with `A=1`.", a: "Column number of a specified cell.", m: [0, 1], p: [{ name: "cell_reference", detail: "The cell whose column number will be returned. Column `A` corresponds to `1`.", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNS", t: 2, d: "Returns the number of columns in a specified array or range.", a: "Number of columns in a specified array or range.", m: [1, 1], p: [{ name: "range", detail: "The range whose column count will be returned.", example: "A9:W62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "OFFSET", t: 2, d: "Returns a range reference shifted a specified number of rows and columns from a starting cell reference.", a: "A range reference offset relative to a cell.", m: [3, 5], p: [{ name: "cell_reference", detail: "The starting point from which to count the offset rows and columns.", example: "A2", require: "m", repeat: "n", type: "range" }, { name: "offset_rows", detail: "The number of rows to offset by.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "offset_columns", detail: "The number of columns to offset by.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "height", detail: "The height of the range to return starting at the offset target.", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "width", detail: "The width of the range to return starting at the offset target.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MATCH", t: 2, d: "Returns the relative position of an item in a range that matches a specified value.", a: "Position of item in range that matches value.", m: [2, 3], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: '"Sunday"', require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The one-dimensional array to be searched.", example: "A2:A9", require: "m", repeat: "n", type: "range" }, { name: "search_type", detail: "The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INDEX", t: 2, d: "Returns the content of a cell, specified by row and column offset.", a: "Content of cell specified by row and column offset.", m: [2, 3], p: [{ name: "reference", detail: "The array of cells to be offset into.", example: "A1:C20", require: "m", repeat: "n", type: "range" }, { name: "row", detail: "The number of offset rows.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "column", detail: "The number of offset columns.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GETPIVOTDATA", t: 2, d: "Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.", a: "Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.", m: [2, 254], p: [{ name: "value_name", detail: "The name of the value in the pivot table for which you want to get data.", example: '"SUM of number of units"', require: "m", repeat: "n", type: "rangeall" }, { name: "any_pivot_table_cell", detail: "Any reference to a cell in the desired pivot table (top corner recommended).", example: "'Pivot table'!A1", require: "m", repeat: "n", type: "rangeall" }, { name: "original_column", detail: "The name of the column in the original data set (not the pivot table).", example: '"division"', require: "o", repeat: "y", type: "rangeall" }, { name: "pivot_item", detail: "The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.", example: '"east"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CHOOSE", t: 2, d: "Returns an element from a list of choices based on index.", a: "An element from a list of choices based on index.", m: [2, 255], p: [{ name: "index", detail: "Which choice (of the up to 30 provided) to return.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "choice1", detail: "A potential value to return. Required. May be a reference to a cell or an individual value.", example: '"A"', require: "m", repeat: "n", type: "rangeall" }, { name: "choice2", detail: "Additional values among which to choose.", example: '"B"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "HYPERLINK", t: 2, d: "Creates a hyperlink inside a cell.", a: "Creates a hyperlink inside a cell.", p: [{ name: "url", detail: "The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.", example: '"http://www.luckysheet.com/"', require: "m", repeat: "n", type: "rangeall" }, { name: "link_label", detail: "The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.", example: '"luckysheet"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TIME", t: 6, d: "Converts a provided hour, minute, and second into a time.", a: "Converts hour/minute/second into a time.", m: [3, 3], p: [{ name: "hour", detail: "The hour component of the time.", example: "11", require: "m", repeat: "n", type: "rangenumber" }, { name: "minute", detail: "The minute component of the time.", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "second", detail: "The second component of the time.", example: "59", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TIMEVALUE", t: 6, d: "Returns the fraction of a 24-hour day the time represents.", a: "Converts a time string into its serial number representation.", m: [1, 1], p: [{ name: "time_string", detail: "The string that holds the time representation.", example: '"2:15 PM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EOMONTH", t: 6, d: "Returns a date on the last day of a month that falls a specified number of months before or after another date.", a: "Last day of a month before or after a date.", m: [2, 2], p: [{ name: "start_date", detail: "The date from which to calculate the result.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "The number of months before (negative) or after (positive) 'start_date' to consider.", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EDATE", t: 6, d: "Returns a date a specified number of months before or after another date.", a: "Date a number of months before/after another date.", m: [2, 2], p: [{ name: "start_date", detail: "The date from which to calculate the result.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "The number of months before (negative) or after (positive) 'start_date' to calculate.", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SECOND", t: 6, d: "Returns the second component of a specific time, in numeric format.", a: "Second component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the second component", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINUTE", t: 6, d: "Returns the minute component of a specific time, in numeric format.", a: "Minute component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the minute component.", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "HOUR", t: 6, d: "Returns the hour component of a specific time, in numeric format.", a: "Hour component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the hour component.", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOW", t: 6, d: "Returns the current date and time as a date value.", a: "Current date and time as a date value.", m: [0, 0], p: [] }, { n: "NETWORKDAYS", t: 6, d: "Returns the number of net working days between two provided days.", a: "Net working days between two provided days.", m: [2, 3], p: [{ name: "start_date", detail: "The start date of the period from which to calculate the number of net working days.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date of the period from which to calculate the number of net working days.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the date serial numbers to consider holidays.", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "NETWORKDAYS_INTL", t: 6, d: "Returns the number of net working days between two provided days excluding specified weekend days and holidays.", a: "Net working days between two dates (specifying weekends).", m: [2, 4], p: [{ name: "start_date", detail: "The start date of the period from which to calculate the number of net working days.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date of the period from which to calculate the number of net working days.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "weekend", detail: "A number or string representing which days of the week are considered weekends.", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the dates to consider as holidays.", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ISOWEEKNUM", t: 6, d: "Returns a number representing the ISO week of the year where the provided date falls.", a: "ISO week number of the year.", m: [1, 1], p: [{ name: "date", detail: "The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WEEKNUM", t: 6, d: "Returns a number representing the week of the year where the provided date falls.", a: "Week number of the year.", m: [1, 2], p: [{ name: "date", detail: "The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "type", detail: "A number representing the day that a week starts on. Sunday = 1.", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "WEEKDAY", t: 6, d: "Returns a number representing the day of the week of the date provided.", a: "Day of the week of the date provided (as number).", m: [1, 2], p: [{ name: "date", detail: "The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "type", detail: "A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DAY", t: 6, d: "Returns the day of the month that a specific date falls on, in numeric format.", a: "Day of the month that a specific date falls on.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the day.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS", t: 6, d: "Returns the number of days between two dates.", a: "Number of days between two dates.", m: [2, 2], p: [{ name: "end_date", detail: "The end of the date range.", example: "2011-3-15", require: "m", repeat: "n", type: "rangeall" }, { name: "start_date", detail: "The start of the date range.", example: "2011-2-1", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS360", t: 6, d: "Returns the difference between two days based on the 360 day year used in some financial interest calculations.", a: "Days between two dates on a 360-day year.", m: [2, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "method", detail: "An indicator of what day count method to use.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DATE", t: 6, d: "Converts a provided year, month, and day into a date.", a: "Converts year/month/day into a date.", m: [3, 3], p: [{ name: "year", detail: "The year component of the date.", example: "1969", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "The month component of the date.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "day", detail: "The day component of the date.", example: "20", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DATEVALUE", t: 6, d: "Converts a provided date string in a known format to a date value.", a: "Converts a date string to a date value.", m: [1, 1], p: [{ name: "date_string", detail: "The string representing the date.", example: '"1969-7-20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DATEDIF", t: 6, d: "Calculates the number of days, months, or years between two dates.", a: "Date Difference.", m: [3, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "unit", detail: 'A string abbreviation for unit of time. For example, "M" for month. Accepted values are "Y","M","D","MD","YM","YD".', example: "16)", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY", t: 6, d: "Calculates the date after a number of working days from a specified start date.", a: "Number of working days from start date.", m: [2, 3], p: [{ name: "start_date", detail: "The date from which to begin counting.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "num_days", detail: "The number of working days to advance from `start_date`. If negative, counts backwards.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "holidays", detail: "A range or array constant containing the dates to consider holidays.", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY_INTL", t: 6, d: "Calculates the date after a specified number of workdays excluding specified weekend days and holidays.", a: "Date after a number of workdays (specifying weekends).", m: [2, 4], p: [{ name: "start_date", detail: "The date from which to begin counting.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "num_days", detail: "The number of working days to advance from `start_date`. If negative, counts backwards.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "weekend", detail: "A number or string representing which days of the week are considered weekends.", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the dates to consider holidays.", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "YEAR", t: 6, d: "Returns the year specified by a given date.", a: "Year specified by a given date.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the year.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "YEARFRAC", t: 6, d: "Returns the number of years, including fractional years, between two dates using a specified day count convention.", a: "Exact number of years between two dates.", m: [2, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "16)", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "TODAY", t: 6, d: "Returns the current date as a date value.", a: "Current date as a date value.", m: [0, 0], p: [] }, { n: "MONTH", t: 6, d: "Returns the month of the year a specific date falls in, in numeric format.", a: "Month of the year a specific date falls in.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the month.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EFFECT", t: 8, d: "Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.", a: "Annual effective interest rate.", m: [2, 2], p: [{ name: "nominal_rate", detail: "The nominal interest rate per year.", example: "0.99", require: "m", repeat: "n", type: "rangenumber" }, { name: "periods_per_year", detail: "The number of compounding periods per year.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLAR", t: 12, d: "Formats a number into the currency specific to your spreadsheet locale.", a: "Formats a number as currency specific to your spreadsheet locale.", m: [1, 2], p: [{ name: "number", detail: "The value to be formatted.", example: "1.2351", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_places", detail: "The number of decimal places to display.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARDE", t: 8, d: "Converts a price quotation given as a decimal fraction into a decimal value.", a: "Converts a decimal fraction to decimal value.", m: [2, 2], p: [{ name: "fractional_price", detail: "The price quotation given using fractional decimal conventions.", example: "100.10", require: "m", repeat: "n", type: "rangenumber" }, { name: "unit", detail: "The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARFR", t: 8, d: "Converts a price quotation given as a decimal value into a decimal fraction.", a: "Converts a decimal value to decimal fraction.", m: [2, 2], p: [{ name: "decimal_price", detail: "The price quotation given as a decimal value.", example: "100.125", require: "m", repeat: "n", type: "rangenumber" }, { name: "unit", detail: "The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DB", t: 8, d: "Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.", a: "Depreciation via declining balance method.", m: [4, 5], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "The number of months in the first year of depreciation.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DDB", t: 8, d: "Calculates the depreciation of an asset for a specified period using the double-declining balance method.", a: "Depreciation via double-declining balance method.", m: [4, 5], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The factor by which depreciation decreases.", example: "2.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RATE", t: 8, d: "Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.", a: "Interest rate of an annuity investment.", m: [3, 6], p: [{ name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_per_period", detail: "The amount per period to be paid.", example: "-100", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "rate_guess", detail: "An estimate for what the interest rate will be.", example: "0.1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "CUMPRINC", t: 8, d: "Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Cumulative principal paid over a set of periods.", m: [6, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "first_period", detail: "The number of the payment period to begin the cumulative calculation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "last_period", detail: "The number of the payment period to end the cumulative calculation.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPNUM", t: 8, d: "Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.", a: "Number of coupons between settlement and maturity.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "02", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SYD", t: 8, d: "Calculates the depreciation of an asset for a specified period using the sum of years digits method.", a: "Depreciation via sum of years digits method.", m: [4, 4], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLEQ", t: 8, d: "Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.", a: "Equivalent rate of return for a Treasury bill.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the bill at time of purchase.", example: "2)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLYIELD", t: 8, d: "Calculates the yield of a US Treasury Bill based on price.", a: "The yield of a us treasury bill based on price.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLPRICE", t: 8, d: "Calculates the price of a US Treasury Bill based on discount rate.", a: "Price of US treasury bill.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the bill at time of purchase.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PV", t: 8, d: "Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Present value of an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount per period to be paid.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "D2", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ACCRINT", t: 8, d: "Calculates the accrued interest of a security that has periodic payments.", a: "Accrued interest of security with periodic payments.", m: [6, 8], p: [{ name: "issue", detail: "The date the security was initially issued.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "first_payment", detail: "The first date interest will be paid.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "calc_method", detail: "[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \n\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \n\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ACCRINTM", t: 8, d: "Calculates the accrued interest of a security that pays interest at maturity.", a: "Accrued interest of security paying at maturity.", m: [4, 5], p: [{ name: "issue", detail: "The date the security was initially issued.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity date of the security.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "1000", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYBS", t: 8, d: "Calculates the number of days from the first coupon, or interest payment, until settlement.", a: "Number of days from first coupon to settlement.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYS", t: 8, d: "Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.", a: "Days in coupon period containing settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYSNC", t: 8, d: "Calculates the number of days from the settlement date until the next coupon, or interest payment.", a: "Days from settlement until next coupon.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPNCD", t: 8, d: "Calculates next coupon, or interest payment, date after the settlement date.", a: "Next coupon date after the settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPPCD", t: 8, d: "Calculates last coupon, or interest payment, date before the settlement date.", a: "Last coupon date before settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FV", t: 8, d: "Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Future value of an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount per period to be paid.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FVSCHEDULE", t: 8, d: "Calculates the future value of some principal based on a specified series of potentially varying interest rates.", a: "Future value of principal from series of rates.", m: [2, 2], p: [{ name: "principal", detail: "The amount of initial capital or value to compound against.", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "rate_schedule", detail: "A series of interest rates to compound against the `principal`.", example: "A2:A100", require: "m", repeat: "n", type: "range" }] }, { n: "YIELD", t: 8, d: "Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.", a: "Annual yield of a security paying periodic interest.", m: [6, 7], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "YIELDDISC", t: 8, d: "Calculates the annual yield of a discount (non-interest-bearing) security, based on price.", a: "Annual yield of a discount security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NOMINAL", t: 8, d: "Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.", a: "Annual nominal interest rate.", m: [2, 2], p: [{ name: "effective_rate", detail: "The effective interest rate per year.", example: "0.85", require: "m", repeat: "n", type: "rangenumber" }, { name: "periods_per_year", detail: "The number of compounding periods per year.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "XIRR", t: 8, d: "Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.", a: "Internal rate of return given non-periodic cashflows.", m: [2, 3], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "cashflow_dates", detail: "An array or range with dates corresponding to the cash flows in `cashflow_amounts`.", example: "C2:C25", require: "m", repeat: "n", type: "range" }, { name: "rate_guess", detail: "An estimate for what the internal rate of return will be.", example: "250", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MIRR", t: 8, d: "Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.", a: "Modified internal rate of return.", m: [3, 3], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "financing_rate", detail: "The interest rate paid on funds invested.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "reinvestment_return_rate", detail: "The return (as a percentage) earned on reinvestment of income received from the investment.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IRR", t: 8, d: "Calculates the internal rate of return on an investment based on a series of periodic cash flows.", a: "Internal rate of return given periodic cashflows.", m: [1, 2], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "rate_guess", detail: "An estimate for what the internal rate of return will be.", example: "200", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPV", t: 8, d: "Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.", a: "The net present value of an investment based on a series of periodic cash flows and a discount rate.", m: [2, 255], p: [{ name: "discount", detail: "The discount rate of the investment over one period.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cashflow1", detail: "The first future cash flow.", example: "200", require: "m", repeat: "n", type: "rangeall" }, { name: "cashflow2", detail: "Additional future cash flows.", example: "250", require: "o", repeat: "y", type: "rangeall" }] }, { n: "XNPV", t: 8, d: "Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.", a: "Net present value given non-periodic cashflows.", m: [3, 3], p: [{ name: "discount", detail: "The discount rate of the investment over one period.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "cashflow_amounts", detail: "A range of cells containing the income or payments associated with the investment.", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "cashflow_dates", detail: "A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.", example: "C2:C25", require: "m", repeat: "n", type: "range" }] }, { n: "CUMIPMT", t: 8, d: "Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Cumulative interest paid over a set of periods.", m: [6, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "first_period", detail: "The number of the payment period to begin the cumulative calculation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "last_period", detail: "The number of the payment period to end the cumulative calculation.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PMT", t: 8, d: "Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Periodic payment for an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: " 100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "D2", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IPMT", t: 8, d: "Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Payment on interest for an investment.", m: [4, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The amortization period, in terms of number of periods.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "80000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "E2", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PPMT", t: 8, d: "Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.", a: "Payment on the principal of an investment.", m: [4, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The amortization period, in terms of number of periods.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "3*12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INTRATE", t: 8, d: "Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.", a: "Calculates effective interest rate.", m: [4, 5], p: [{ name: "buy_date", detail: "The date of purchase of the investment.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "sell_date", detail: "The date of sale of the investment.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "buy_price", detail: "The price at which the investment was purchased.", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "sell_price", detail: "The price at which the investment was sold.", example: "101200", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PRICE", t: 8, d: "Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.", a: "Price of a security paying periodic interest.", m: [6, 7], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.065", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEDISC", t: 8, d: "Calculates the price of a discount (non-interest-bearing) security, based on expected yield.", a: "Price of a discount security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the security at time of purchase.", example: "0.0525", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEMAT", t: 8, d: "Calculates the price of a security paying interest at maturity, based on expected yield.", a: "Price of security paying interest at maturity.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "issue", detail: "The date the security was initially issued.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "RECEIVED", t: 8, d: "Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.", a: "Amount received at maturity for a security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "The amount invested (irrespective of face value of each security).", example: "10000000", require: "m", repeat: "n", type: "rangenumber" }, { name: "discount", detail: "The discount rate of the security invested in.", example: "0.0575", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DISC", t: 8, d: "Calculates the discount rate of a security based on price.", a: "The discount rate of a security based on price.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "97.975", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPER", t: 8, d: "Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Number of payment periods for an investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount of each payment made.", example: "500", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "40000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SLN", t: 8, d: "Calculates the depreciation of an asset for one period using the straight-line method.", a: "Depreciation of asset using the straight-line method.", m: [3, 3], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "300000", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "75000", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DURATION", t: 8, d: "Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.", a: "Number of periods for an investment to reach a value.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MDURATION", t: 8, d: "Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.", a: "Modified Macaulay duration.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2DEC", t: 9, d: "Converts a signed binary number to decimal format.", a: "Converts a signed binary number to decimal format.", m: [1, 1], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to decimal, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIN2HEX", t: 9, d: "Converts a signed binary number to signed hexadecimal format.", a: "Converts a binary number to hexadecimal.", m: [1, 2], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to signed hexademical, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2OCT", t: 9, d: "Converts a signed binary number to signed octal format.", a: "Converts a binary number to octal.", m: [1, 2], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to signed octal, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2BIN", t: 9, d: "Converts a decimal number to signed binary format.", a: "Converts a decimal number to signed binary format.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed binary, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2HEX", t: 9, d: "Converts a decimal number to signed hexadecimal format.", a: "Converts a decimal number to hexadecimal.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed hexadecimal, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2OCT", t: 9, d: "Converts a decimal number to signed octal format.", a: "Converts a decimal number to signed octal format.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed octal, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2BIN", t: 9, d: "Converts a signed hexadecimal number to signed binary format.", a: "Converts a hexadecimal number to binary.", m: [1, 2], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2DEC", t: 9, d: "Converts a signed hexadecimal number to decimal format.", a: "Converts a hexadecimal number to decimal.", m: [1, 1], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "HEX2OCT", t: 9, d: "Converts a signed hexadecimal number to signed octal format.", a: "Converts a hexadecimal number to octal.", m: [1, 2], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2BIN", t: 9, d: "Converts a signed octal number to signed binary format.", a: "Converts an octal number to binary.", m: [1, 2], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to signed binary, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2DEC", t: 9, d: "Converts a signed octal number to decimal format.", a: "Converts a signed octal number to decimal format.", m: [1, 1], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to decimal, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }] }, { n: "OCT2HEX", t: 9, d: "Converts a signed octal number to signed hexadecimal format.", a: "Converts an octal number to hexadecimal.", m: [1, 2], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COMPLEX", t: 9, d: "Creates a complex number given real and imaginary coefficients.", a: "Creates a complex number.", m: [2, 3], p: [{ name: "real_part", detail: "The real coefficient.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "imaginary_part", detail: "The imaginary coefficient.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "suffix", detail: "The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.", example: '"j"', require: "o", repeat: "n", type: "rangestring" }] }, { n: "IMREAL", t: 9, d: "Returns the real coefficient of a complex number.", a: "The real coefficient of a complex number.", m: [1, 1], p: [{ name: "complex_number", detail: "The complex number, in the a+bi or a+bj format.", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMAGINARY", t: 9, d: "Returns the imaginary coefficient of a complex number.", a: "The imaginary coefficient of a complex number.", m: [1, 1], p: [{ name: "complex_number", detail: "The complex number, in the a+bi or a+bj format.", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMCONJUGATE", t: 9, d: "Returns the complex conjugate of a number.", a: "The complex conjugate of a number.", m: [1, 1], p: [{ name: "number", detail: "The complex number to calculate the conjugate for.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMABS", t: 9, d: "Returns absolute value (or modulus) of a complex number.", a: "The absolute value of a complex number.", m: [1, 1], p: [{ name: "number", detail: "The complex number to calculate the absolute value of.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DELTA", t: 9, d: "Compare two numeric values, returning 1 if they're equal.", a: "Compare two numeric values.", m: [1, 2], p: [{ name: "number1", detail: "The first number to compare.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number2", detail: "The second number to compare.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "IMSUM", t: 9, d: "Returns the sum of a series of complex numbers.", a: "Sum of a series of complex numbers.", m: [1, 255], p: [{ name: "value1", detail: "The first complex number or range to add together.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional complex numbers or ranges to add to `value1`.", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMSUB", t: 9, d: "Returns the difference between two complex numbers.", a: "The difference between two complex numbers.", m: [2, 2], p: [{ name: "first_number", detail: "The complex number to subtract second_number from.", example: '"6+5i"', require: "m", repeat: "n", type: "rangeall" }, { name: "second_number", detail: "The complex number to subtract from first_number.", example: '"2+3i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMPRODUCT", t: 9, d: "Returns the result of multiplying a series of complex numbers together.", a: "Result of multiplying a series of complex numbers together.", m: [1, 255], p: [{ name: "factor1", detail: "The first number or range to calculate for the product.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "factor2", detail: "Additional complex numbers or ranges to calculate for the product.", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMDIV", t: 9, d: "Returns one complex number divided by another.", a: "One complex number divided by another.", m: [2, 2], p: [{ name: "dividend", detail: "The complex number to be divided.", example: '"11+16i"', require: "m", repeat: "n", type: "rangeall" }, { name: "divisor", detail: "The complex number to divide by.", example: '"3+2i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOT", t: 10, d: "Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.", a: "Returns opposite of provided logical value.", m: [1, 1], p: [{ name: "logical_expression", detail: "An expression or reference to a cell holding an expression that represents some logical value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRUE", t: 10, d: "Returns the logical value `TRUE`.", a: "Logical value `true`.", m: [0, 0], p: [] }, { n: "FALSE", t: 10, d: "Returns the logical value `FALSE`.", a: "Logical value `false`.", m: [0, 0], p: [] }, { n: "AND", t: 10, d: "Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.", a: "Logical `and` operator.", m: [1, 255], p: [{ name: "logical_expression1", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical_expression2", detail: "More expressions that represent logical values.", example: 'A3 = "bar"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IFERROR", t: 10, d: "Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.", a: "Value if it is not an error, otherwise 2nd argument.", m: [2, 2], p: [{ name: "value", detail: "The value to return if `value` itself is not an error.", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_error", detail: "The value the function returns if `value` is an error.", example: '"Error in cell A1"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IF", t: 10, d: "Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.", a: "Returns value depending on logical expression.", m: [2, 3], p: [{ name: "logical_expression", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_true", detail: "The value the function returns if `logical_expression` is `TRUE`.", example: '"A2 is foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_false", detail: "The value the function returns if `logical_expression` is `FALSE`.", example: '"A2 was false"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "OR", t: 10, d: "Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.", a: "Logical `or` operator.", m: [1, 255], p: [{ name: "logical_expression1", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical_expression2", detail: "More expressions that evaluate to logical values.", example: ' A3 = "bar"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NE", t: 11, d: "Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.", a: "Not equal.", m: [2, 2], p: [{ name: "value1", detail: "The first value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to test against `value1` for inequality.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EQ", t: 11, d: "Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.", a: "Equal.", m: [2, 2], p: [{ name: "value1", detail: "The first value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to test against `value1` for equality.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GT", t: 11, d: "Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.", a: "Strictly greater than.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being greater than `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GTE", t: 11, d: "Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.", a: "Greater than or equal to.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being greater than or equal to `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LT", t: 11, d: "Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.", a: "Less than.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being less than `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LTE", t: 11, d: "Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.", a: "Less than or equal to.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being less than or equal to `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ADD", t: 11, d: "Returns the sum of two numbers. Equivalent to the `+` operator.", a: "Sum of two numbers", m: [2, 2], p: [{ name: "value1", detail: "The first addend.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "The second addend.", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINUS", t: 11, d: "Returns the difference of two numbers. Equivalent to the `-` operator.", a: "Difference of two numbers", m: [2, 2], p: [{ name: "value1", detail: "The minuend, or number to be subtracted from.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "The subtrahend, or number to subtract from `value1`.", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTIPLY", t: 11, d: "Returns the product of two numbers. Equivalent to the `*` operator.", a: "Product of two numbers", m: [2, 2], p: [{ name: "factor1", detail: "The first multiplicand.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor2", detail: "The second multiplicand.", example: "B2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DIVIDE", t: 11, d: "Returns one number divided by another. Equivalent to the `/` operator.", a: "One number divided by another", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCAT", t: 11, d: "Returns the concatenation of two values. Equivalent to the `&` operator.", a: "Concatenation of two values", m: [2, 2], p: [{ name: "value1", detail: "The value to which `value2` will be appended.", example: '"de"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to append to `value1`.", example: '"mystify"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UNARY_PERCENT", t: 11, d: "Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.", a: "Value interpreted as a percentage.", m: [1, 1], p: [{ name: "percentage", detail: "The value to interpret as a percentage.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCATENATE", t: 12, d: "Appends strings to one another.", a: "Appends strings to one another.", m: [1, 255], p: [{ name: "string1", detail: "The initial string.", example: '"Super"', require: "m", repeat: "n", type: "rangeall" }, { name: "string2", detail: "More strings to append in sequence.", example: '"calla"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CODE", t: 12, d: "Returns the numeric Unicode map value of the first character in the string provided.", a: "Numeric unicode map value of character.", m: [1, 1], p: [{ name: "string", detail: "The string whose first character's Unicode map value will be returned.", example: '"a"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CHAR", t: 12, d: "Convert a number into a character according to the current Unicode table.", a: "Gets character associated with number.", m: [1, 1], p: [{ name: "table_number", detail: "The number of the character to look up from the current Unicode table in decimal format.", example: "97", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ARABIC", t: 12, d: "Computes the value of a Roman numeral.", a: "Computes the value of a roman numeral.", m: [1, 1], p: [{ name: "roman_numeral", detail: "The Roman numeral to format, whose value must be between 1 and 3999, inclusive.", example: '"XIV"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "ROMAN", t: 12, d: "Formats a number in Roman numerals.", a: "Formats a number in Roman numerals.", m: [1, 1], p: [{ name: "number", detail: "The number to format, between 1 and 3999, inclusive.", example: "499", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "REGEXEXTRACT", t: 12, d: "Extracts matching substrings according to a regular expression.", a: "Extracts matching substrings with regular expression.", m: [2, 2], p: [{ name: "text", detail: "The input text.", example: '"Needle in a haystack"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The first part of `text` that matches this expression will be returned.", example: '".e{2}dle"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXMATCH", t: 12, d: "Whether a piece of text matches a regular expression.", a: "Whether a piece of text matches regular expression.", m: [2, 2], p: [{ name: "text", detail: "The text to be tested against the regular expression.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The regular expression to test the text against.", example: '"S.r"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXREPLACE", t: 12, d: "Replaces part of a text string with a different text string using regular expressions.", a: "Replaces text with regular expressions.", m: [3, 3], p: [{ name: "text", detail: "The text, a part of which will be replaced.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The regular expression. All matching instances in `text` will be replaced.", example: '"S.*d"', require: "m", repeat: "n", type: "rangeall" }, { name: "replacement", detail: "The text which will be inserted into the original text.", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "T", t: 12, d: "Returns string arguments as text, or the empty string if the value is not text.", a: "String arguments as text.", m: [1, 1], p: [{ name: "value", detail: "The argument to be converted to text.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "FIXED", t: 12, d: "Formats a number with a fixed number of decimal places.", a: "Formats number with fixed number of decimal places.", m: [1, 3], p: [{ name: "number", detail: "The number to format.", example: "3.141592653", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_places", detail: "The number of decimal places to display in the result.", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "suppress_separator", detail: "Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FIND", t: 12, d: "Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.", a: "First position of string found in text, case-sensitive.", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "14", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FINDB", t: 12, d: "Returns the position at which a string is first found within text counting each double-character as 2.", a: "Position at which a string is first found within text (binary).", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"new"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: '"new year"', require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "JOIN", t: 12, d: "Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.", a: "Concatenates elements of arrays with delimiter.", m: [2, 255], p: [{ name: "delimiter", detail: "The character or string to place between each concatenated value.", example: '" and-a "', require: "m", repeat: "n", type: "rangeall" }, { name: "value_or_array1", detail: "The value or values to be appended using `delimiter`.", example: "{1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_or_array2", detail: "More values to be appended using `delimiter`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LEFT", t: 12, d: "Returns a substring from the beginning of a specified string.", a: "Substring from beginning of specified string.", m: [1, 2], p: [{ name: "string", detail: "The string from which the left portion will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_characters", detail: "The number of characters to return from the left side of `string`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RIGHT", t: 12, d: "Returns a substring from the end of a specified string.", a: "A substring from the end of a specified string.", m: [1, 2], p: [{ name: "string", detail: "The string from which the right portion will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_characters", detail: "The number of characters to return from the right side of `string`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MID", t: 12, d: "Returns a segment of a string.", a: "A segment of a string.", m: [3, 3], p: [{ name: "string", detail: "The string to extract a segment from.", example: '"get this"', require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "extract_length", detail: "The length of the segment to extract.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LEN", t: 12, d: "Returns the length of a string.", a: "Length of a string.", m: [1, 1], p: [{ name: "text", detail: "The string whose length will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LENB", t: 12, d: "Returns the length of a string in bytes.", a: "Length of a string in bytes.", m: [1, 1], p: [{ name: "text", detail: "The string whose length will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LOWER", t: 12, d: "Converts a specified string to lowercase.", a: "Converts a specified string to lowercase.", m: [1, 1], p: [{ name: "text", detail: "The string to convert to lowercase.", example: '"LOREM IPSUM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UPPER", t: 12, d: "Converts a specified string to uppercase.", a: "Converts a specified string to uppercase.", m: [1, 1], p: [{ name: "text", detail: "The string to convert to uppercase.", example: '"lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EXACT", t: 12, d: "Tests whether two strings are identical.", a: "Tests whether two strings are identical.", m: [2, 2], p: [{ name: "string1", detail: "The first string to compare", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "string2", detail: "The second string to compare", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPLACE", t: 12, d: "Replaces part of a text string with a different text string.", a: "Replaces part of a text string with different text.", m: [4, 4], p: [{ name: "text", detail: "The text, a part of which will be replaced.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "position", detail: "The position where the replacement will begin (starting from 1).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "length", detail: "The number of characters in the text to be replaced.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "new_text", detail: "The text which will be inserted into the original text.", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPT", t: 12, d: "Returns specified text repeated a number of times.", a: "Specified text repeated a number of times.", m: [2, 2], p: [{ name: "text_to_repeat", detail: "The character or string to repeat.", example: '"ha"', require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_repetitions", detail: "The number of times `text_to_repeat` should appear in the value returned.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SEARCH", t: 12, d: "Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.", a: "First position of string found in text, ignoring case.", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUBSTITUTE", t: 12, d: "Replaces existing text with new text in a string.", a: "Replaces existing text with new text in a string.", m: [3, 4], p: [{ name: "text_to_search", detail: "The text within which to search and replace.", example: '"search for it"', require: "m", repeat: "n", type: "rangeall" }, { name: "search_for", detail: "The string to search for within `text_to_search`.", example: '"search for"', require: "m", repeat: "n", type: "rangeall" }, { name: "replace_with", detail: "The string that will replace `search_for`.", example: '"Google"', require: "m", repeat: "n", type: "rangeall" }, { name: "occurrence_number", detail: "The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CLEAN", t: 12, d: "Returns the text with the non-printable ASCII characters removed.", a: "Removes non-printable characters from a piece of text.", m: [1, 1], p: [{ name: "text", detail: "The text whose non-printable characters are to be removed.", example: '"AF"&CHAR(31)', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TEXT", t: 12, d: "Converts a number into text according to a specified format.", a: "Formats a number into text.", m: [2, 2], p: [{ name: "number", detail: "The number, date, or time to format.", example: "1.23", require: "m", repeat: "n", type: "rangenumber" }, { name: "format", detail: "The pattern by which to format the number, enclosed in quotation marks.", example: '"$0.00"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRIM", t: 12, d: "Removes leading, trailing, and repeated spaces in text.", a: "Removes space characters.", m: [1, 1], p: [{ name: "text", detail: "The text or reference to a cell containing text to be trimmed.", example: '" lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "VALUE", t: 12, d: "Converts a string in any of the date, time or number formats that Google Sheets understands into a number.", a: "Converts a date/time/number string into a number.", m: [1, 1], p: [{ name: "text", detail: "The string containing the value to be converted.", example: '"123"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "PROPER", t: 12, d: "Capitalizes each word in a specified string.", a: "Capitalizes each word in a specified string.", m: [1, 1], p: [{ name: "text_to_capitalize", detail: "The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.", example: '"united states"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CONVERT", t: 13, d: "Converts a numeric value to a different unit of measure.", a: "Unit conversion for numbers.", m: [3, 3], p: [{ name: "value", detail: "The numeric value in `start_unit` to convert to `end_unit`.", example: "5.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_unit", detail: "The starting unit, the unit currently assigned to `value`.", example: '"g"', require: "m", repeat: "n", type: "rangeall" }, { name: "end_unit", detail: "The unit of measure into which to convert the argument, `value`.", example: '"kg"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "SUMX2MY2", t: 14, d: "Calculates the sum of the differences of the squares of values in two arrays.", a: "Sum of the differences of squares.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMX2PY2", t: 14, d: "Calculates the sum of the sums of the squares of values in two arrays.", a: "Sum of the sums of squares.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMXMY2", t: 14, d: "Calculates the sum of the squares of differences of values in two arrays.", a: "Sum of the squares of differences.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRANSPOSE", t: 14, d: "Transposes the rows and columns of an array or range of cells.", a: "Transposes the rows and columns of an array.", m: [1, 1], p: [{ name: "array_or_range", detail: "The array or range whose rows and columns will be swapped.", example: "{1,2}", require: "m", repeat: "n", type: "range" }] }, { n: "TREND", t: 14, d: "Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.", a: "Fits points to linear trend derived via least-squares.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_data_x", detail: "The data points to return the `y` values for on the ideal curve fit.", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FREQUENCY", t: 14, d: "Calculates the frequency distribution of a one-column array into specified classes.", a: "The frequency distribution of array.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the values to be counted.", example: "A2:A40", require: "m", repeat: "n", type: "rangenumber" }, { name: "classes", detail: "The array or range containing the set of classes.", example: "B2:B5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GROWTH", t: 14, d: "Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.", a: "Fits points to exponential growth trend.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_data_x", detail: "The data points to return the `y` values for on the ideal curve fit.", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LINEST", t: 14, d: "Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.", a: "Best-fit linear trend via least-squares.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "calculate_b", detail: "Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "verbose", detail: "A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOGEST", t: 14, d: "Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.", a: "Best-fit exponential growth curve.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "verbose", detail: "A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "MDETERM", t: 14, d: "Returns the matrix determinant of a square matrix specified as an array or range.", a: "Matrix determinant of a square matrix.", m: [1, 1], p: [{ name: "square_matrix", detail: "An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINVERSE", t: 14, d: "Returns the multiplicative inverse of a square matrix specified as an array or range.", a: "Multiplicative inverse of square matrix.", m: [1, 1], p: [{ name: "square_matrix", detail: "An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MMULT", t: 14, d: "Calculates the matrix product of two matrices specified as arrays or ranges.", a: "The matrix product of two matrices.", m: [2, 2], p: [{ name: "matrix1", detail: "The first matrix in the matrix multiplication operation, represented as an array or range.", example: "A1:B3", require: "m", repeat: "n", type: "rangenumber" }, { name: "matrix2", detail: "The second matrix in the matrix multiplication operation, represented as an array or range.", example: "C1:F2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMPRODUCT", t: 14, d: "Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.", a: "Sum of products of elements in two arrays.", m: [1, 255], p: [{ name: "array1", detail: "The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.", example: "A2:C5", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.", example: "D2:F5", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "ISFORMULA", t: 15, d: "Checks whether a value is a formula.", a: "Whether a value is a formula.", m: [1, 1], p: [{ name: "cell", detail: "The cell to be verified as containing a formula.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "CELL", t: 15, d: "Returns the requested information about the specified cell.", a: "Gets information about a cell.", m: [2, 2], p: [{ name: "info_type", detail: "The type of information requested (see article for available types)", example: '"type"', require: "m", repeat: "n", type: "rangeall" }, { name: "reference", detail: "The reference to the cell.", example: "C2", require: "m", repeat: "n", type: "range" }] }, { n: "NA", t: 15, d: 'Returns the "value not available" error, `#N/A`.', a: "The `#N/A` error.", m: [0, 0], p: [] }, { n: "ERROR_TYPE", t: 15, d: "Returns a number corresponding to the error value in a different cell.", a: "Error value of cell (as number).", m: [1, 1], p: [{ name: "reference", detail: "The cell to find the error number for although you can also provide the error value directly.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISBLANK", t: 15, d: "Checks whether the referenced cell is empty.", a: "Whether the referenced cell is empty.", m: [1, 1], p: [{ name: "value", detail: "Reference to the cell that will be checked for emptiness.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISERR", t: 15, d: "Checks whether a value is an error other than `#N/A`.", a: "Whether a value is an error other than `#n/a`.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as an error type other than `#N/A`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISERROR", t: 15, d: "Checks whether a value is an error.", a: "Whether a value is an error.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as an error type.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISLOGICAL", t: 15, d: "Checks whether a value is `TRUE` or `FALSE`.", a: "Whether a value is `true` or `false`.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a logical `TRUE` or `FALSE`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNA", t: 15, d: "Checks whether a value is the error `#N/A`.", a: "Whether a value is the error `#n/a`.", m: [1, 1], p: [{ name: "value", detail: "The value to be compared with the error value `#N/A`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNONTEXT", t: 15, d: "Checks whether a value is non-textual.", a: "Whether a value is non-textual.", m: [1, 1], p: [{ name: "value", detail: "The value to be checked.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNUMBER", t: 15, d: "Checks whether a value is a number.", a: "Whether a value is a number.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a number.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISREF", t: 15, d: "Checks whether a value is a valid cell reference.", a: "Whether a value is a valid cell reference.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a cell reference.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISTEXT", t: 15, d: "Checks whether a value is text.", a: "Whether a value is text.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as text.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TYPE", t: 15, d: "Returns a number associated with the type of data passed into the function.", a: "Get the type of a value.", m: [1, 1], p: [{ name: "value", detail: "The value whose type is to be determined.", example: "C4", require: "m", repeat: "n", type: "rangeall" }] }, { n: "N", t: 15, d: "Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.", a: "Argument provided as a number.", m: [1, 1], p: [{ name: "value", detail: "The argument to be converted to a number.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DATE", t: 16, d: "Converts a provided number to a date.", a: "Converts a provided number to a date.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a date.", example: "25405", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PURE_NUMBER", t: 16, d: "Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.", a: "Converts any numeric value to a pure number.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a pure number.", example: "50%", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_TEXT", t: 16, d: "Converts a provided numeric value to a text value.", a: "Converts a provided numeric value to a text value.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to text.", example: "24", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DOLLARS", t: 16, d: "Converts a provided number to a dollar value.", a: "Converts a provided number to a dollar value.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a dollar value.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PERCENT", t: 16, d: "Converts a provided number to a percentage.", a: "Converts a provided number to a percentage.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a percentage.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DGET", t: 17, d: "Returns a single value from a database table-like array or range using a SQL-like query.", a: "Single value from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMAX", t: 17, d: "Returns the maximum value selected from a database table-like array or range using a SQL-like query.", a: "Maximum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMIN", t: 17, d: "Returns the minimum value selected from a database table-like array or range using a SQL-like query.", a: "Minimum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DAVERAGE", t: 17, d: "Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.", a: "Average of a set of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNT", t: 17, d: "Counts numeric values selected from a database table-like array or range using a SQL-like query.", a: "Counts values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNTA", t: 17, d: "Counts values, including text, selected from a database table-like array or range using a SQL-like query.", a: "Counts values and text from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DPRODUCT", t: 17, d: "Returns the product of values selected from a database table-like array or range using a SQL-like query.", a: "Product of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEV", t: 17, d: "Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.", a: "Standard deviation of population sample from table.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEVP", t: 17, d: "Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.", a: "Standard deviation of entire population from table.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSUM", t: 17, d: "Returns the sum of values selected from a database table-like array or range using a SQL-like query.", a: "Sum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVAR", t: 17, d: "Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.", a: "Variance of population sample from table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVARP", t: 17, d: "Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.", a: "Variance of a population from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "AGE_BY_IDCARD", t: "3", d: "Calculate the age based on the Chinese ID number. Support 15 or 18", a: "Get age based on ID number.", m: [1, 2], p: [{ name: "ID number", example: "A1", detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }, { name: "Deadline", example: '"2017-10-01"', detail: "The deadline or range of age calculation. The default is the current day.", require: "o", repeat: "n", type: "rangedatetime" }] }, { n: "SEX_BY_IDCARD", t: "3", d: "Calculate gender based on Chinese ID number. Support 15 or 18", a: "Get gender based on ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIRTHDAY_BY_IDCARD", t: "3", d: "Calculate the birthday based on the Chinese ID number. Support 15 or 18", a: "Get the birthday based on the ID number.", m: [1, 2], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }, { name: "Birthday format", example: "0", detail: "Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PROVINCE_BY_IDCARD", t: "3", d: "Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18", a: "Get the province of birthplace based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "CITY_BY_IDCARD", t: "3", d: "Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18", a: "Get the city of birthplace based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "STAR_BY_IDCARD", t: "3", d: "Calculate the constellation based on the Chinese ID number. Support 15 or 18", a: "Get the constellation based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ANIMAL_BY_IDCARD", t: "3", d: "Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18", a: "Get the zodiac according to the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISIDCARD", t: "3", d: "Verify that the format of the ID card is correct. Support 15 or 18", a: "Verify the correctness of the ID card format.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DM_TEXT_CUTWORD", t: "4", d: "Text segmentation. Split a series of words into a series of individual words", a: "Chinese text segmentation.", m: [1, 2], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Word segmentation mode", example: "0", detail: "The default is 0[precision mode], 1[full mode], 2[search engine mode].", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TFIDF", t: "4", d: "Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text", a: "tf-idf keyword recognition.", m: [1, 3], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Number of keywords", example: "20", detail: "The number of keywords returned by the algorithm, the default is 20", require: "o", repeat: "n", type: "rangenumber" }, { name: "Corpus", example: "1", detail: "Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TEXTRANK", t: "4", d: "Use TextRank algorithm to extract keywords. Identify keywords from a series of text", a: "TextRank keyword recognition.", m: [1, 3], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Number of keywords", example: "20", detail: "The number of keywords returned by the algorithm, the default is 20", require: "o", repeat: "n", type: "rangenumber" }, { name: "Corpus", example: "1", detail: "Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_CLOSE", t: "5", d: "According to the stock code and date, return the corresponding stock closing price of A shares.", a: "Returns the closing price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_OPEN", t: "5", d: "According to the stock code and date, return the opening price of stock.", a: "Return the opening price of a shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MAX", t: "5", d: "According to the stock code and date, return the highest price of stock.", a: "Return the highest price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MIN", t: "5", d: "According to the stock code and date, return the lowest price of stock.", a: "Returns the lowest price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_VOLUMN", t: "5", d: "According to the stock code and date, return the corresponding stock trading volume of A shares.", a: "Returns the corresponding stock trading volume of A shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_AMOUNT", t: "5", d: "According to the stock code and date, return the corresponding stock turnover of A shares.", a: "Returns the corresponding stock turnover of A shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ISDATE", t: "6", d: "Returns whether a value is a date.", a: "Whether a value is a date.", m: [1, 1], p: [{ name: "value", example: '"1990-01-01"', detail: "The value to be verified as a date.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LINESPLINES", t: "3", d: "Generate sparklines embedded in the cell to describe the continuous trend of data", a: "Generate sparklines line chart", m: [1, 8], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Line color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Line thickness", example: "1", detail: "Line thickness of the line graph, the default is 1px", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line", example: "avg", detail: "A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line color", example: "#000", detail: "Color setting of auxiliary line, same as line color configuration, default #000", require: "o", repeat: "n", type: "rangeall" }, { name: "Maximum mark", example: "#fc5c5c", detail: "Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Minimum mark", example: "#fc5c5c", detail: "Identify the minimum value of the line graph, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Mark size", example: "1.5", detail: "The maximum and minimum mark size settings, the default is 1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AREASPLINES", t: "3", d: "Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data", a: "Generate sparklines area chart", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Line color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Fill color", example: "#CCF3F4", detail: "Form an area chart, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Line thickness", example: "1", detail: "Line thickness of the line graph, the default is 1px", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line", example: "avg", detail: "A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line color", example: "#000", detail: "Color setting of auxiliary line, same as line color configuration, default #000", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNSPLINES", t: "3", d: "Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data", a: "Generate sparklines vertical histogram", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKCOLUMNSPLINES", t: "3", d: "Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data", a: "Generate sparklines cumulative vertical histogram", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Stack by column", example: "1", detail: "If you need to stack by row, set this item to false or 0, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BARSPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the size of discrete data", a: "Generate sparklines horizontal bar graph", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKBARSPLINES", t: "3", d: "Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data", a: "Generate sparklines cumulative horizontal bar graph", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Stack by column", example: "1", detail: "If you need to stack by row, set this item to false or 0, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "DISCRETESPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the trend of discrete data", a: "Generate sparklines discrete graph", m: [1, 4], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Segmentation threshold", example: "1", detail: "Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0", require: "o", repeat: "n", type: "rangeall" }, { name: "Above threshold color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Below threshold color", example: "#fc5c5c", detail: "The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }] }, { n: "TRISTATESPLINES", t: "3", d: "Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.", a: "Generate sparklines three-state graph", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Zero value bar color", example: "#999", detail: "Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PIESPLINES", t: "3", d: "Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data", a: "Generate sparklines pie chart", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Rotation angle", example: "0", detail: "The rotation angle of the pie chart, the default is 0", require: "o", repeat: "n", type: "rangeall" }, { name: "border", example: "0", detail: "Pie chart border size, default is none 0", require: "o", repeat: "n", type: "rangeall" }, { name: "Border color", example: "#000", detail: "The border color of the pie chart, the default is #000", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BOXSPLINES", t: "3", d: "Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set", a: "Generate sparklines box plot", m: [1, 4], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Outlier ratio", example: "1.5", detail: "The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times", require: "o", repeat: "n", type: "rangeall" }, { name: "Target value", example: "10", detail: "The target value setting on the box plot, the default is false and does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Point size", example: "1.5", detail: "The radius of the target point and outlier is set, the default is 1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "BULLETSPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the task achievement rate", a: "Generating sparklines bullets", m: [2, 3], p: [{ name: "Target", example: "10", detail: "The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "achieved", example: "8", detail: "Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Contrast", example: "12", detail: "Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMPOSESPLINES", t: "3", d: "Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram", a: "Combine sparklines graphs into one cell", m: [1, 1], p: [{ name: "config", example: "PIESPLINES(A1:A20)", detail: "Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.", require: "m", repeat: "y", type: "rangeall" }] }, { n: "SORT", t: "14", d: "Sorts the rows of a given array or range by the values in one or more columns.", a: "Sorts rows of range by specified column.", m: [1, 4], p: [{ name: "range", detail: "The data to be sorted.", example: "A2:A17", require: "m", repeat: "n", type: "rangenumber" }, { name: "sort_column", detail: "The index of the column in `range` or a range outside of `range` containing the values by which to sort.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "is_ascending", detail: "`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.", example: "-1", require: "o", repeat: "n", type: "rangenumber" }, { name: "sort_column2", detail: "Additional columns.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FILTER", t: "14", d: "Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.", a: "Filters a range based off provided conditions.", m: [2, 3], p: [{ name: "range", detail: "The data to be filtered.", example: "A5:D20", require: "m", repeat: "n", type: "range" }, { name: "condition1", detail: "A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.", example: "1", require: "m", repeat: "n", type: "range" }, { name: "condition2", detail: "Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.", example: '""', require: "o", repeat: "n", type: "rangeall" }] }, { n: "UNIQUE", t: "14", d: "Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.", a: "Unique rows in the provided source range.", m: [1, 3], p: [{ name: "range", detail: "The data to filter by unique entries.", example: "A2:B26", require: "m", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "occurs_once", detail: "[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANDARRAY", t: "14", d: "Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.", a: "Returns a grid of random numbers.", m: [0, 2], p: [{ name: "rows", detail: "The number of rows to populate with a random number.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "columns", detail: "The number of columns to populate with a random number.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SEQUENCE", t: "14", d: "Returns a grid of sequential numbers starting at a specified start value and increasing by a specified step size. By default, the sequence starts at and increases by 1.", a: "Returns a grid of sequential numbers.", m: [1, 4], p: [{ name: "rows", detail: "The number of rows in the function's resulting grid.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "columns", detail: "The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "start", detail: "The number, at which to start the sequence. If omitted, the sequence will start at 1.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "step", detail: "The amount each value in the sequence will differ by. If omitted, each value will differ by 1.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "EVALUATE", t: "3", d: "Evaluate a formula or expression expressed in words and return the result", a: "Evaluate according to literal formula or expression.", m: [1, 1], p: [{ name: "expression", example: '"A1+5*2^2"', detail: "Formula or expression", require: "m", repeat: "n", type: "rangeall" }] }], toolbar: { undo: "Undo", redo: "Redo", paintFormat: "Paint format", currencyFormat: "Format as currency", percentageFormat: "Format as percent", numberDecrease: "Decrease decimal places", numberIncrease: "Increase decimal places", moreFormats: "More formats", font: "Font", fontSize: "Font size", bold: "Bold (Ctrl+B)", italic: "Italic (Ctrl+I)", strikethrough: "Strikethrough (Alt+Shift+5)", underline: "Underline", textColor: "Text color", chooseColor: "choose color", resetColor: "Reset", customColor: "CUSTOM", alternatingColors: "Alternating colors", confirmColor: "OK", cancelColor: "Cancel", collapse: "Collapse", fillColor: "Fill color", border: "Border", borderStyle: "Border style", mergeCell: "Merge cells", chooseMergeType: "Choose merge type", horizontalAlign: "Horizontal align", verticalAlign: "Vertical align", alignment: "Alignment", textWrap: "Text wrap", textWrapMode: "Text wrap mode", textRotate: "Text rotate", textRotateMode: "Text rotate mode", freezeTopRow: "Freeze top row", sortAndFilter: "Sort and filter", findAndReplace: "Find and replace", sum: "SUM", autoSum: "Auto SUM", moreFunction: "More functions", conditionalFormat: "Conditional format", postil: "Comment", pivotTable: "Pivot Table", chart: "Chart", screenshot: "Screenshot", splitColumn: "Split text", insertImage: "Insert image", insertLink: "Insert link", dataVerification: "Data verification", protection: "Protect the sheet", clearText: "Clear color", noColorSelectedText: "No color is selected", toolMore: "More", toolLess: "Less", toolClose: "Close", toolMoreTip: "More features", moreOptions: "More options", cellFormat: "Cell format config", print: "Print" }, alternatingColors: { applyRange: "Apply to range", selectRange: "Select a data range", header: "Header", footer: "Footer", errorInfo: "Cannot perform this operation on multiple selection areas, please select a single area and try again", textTitle: "Format style", custom: "CUSTOM", close: "close", selectionTextColor: "Click to select text color", selectionCellColor: "Click to select cell color", removeColor: "Remove alternating colors", colorShow: "color", currentColor: "Current", tipSelectRange: "Please select the range of alternating colors", errorNoRange: "No range is selected", errorExistColors: "Alternating colors already exist and cannot be edited" }, button: { confirm: "OK", cancel: "Cancel", close: "Close", update: "Update", delete: "Delete", insert: "Insert" }, paint: { start: "Paint format start", end: "ESC", tipSelectRange: "Please select the range to be copied", tipNotMulti: "Cannot perform this operation on multiple selection ranges" }, format: { moreCurrency: "More currency formats", moreDateTime: "More date and time formats", moreNumber: "More number formats", titleCurrency: "Currency formats", decimalPlaces: "Decimal places", titleDateTime: "Date and time formats", titleNumber: "Number formats" }, info: { detailUpdate: "New opened", detailSave: "Local cache restored", row: "", column: "", loading: "Loading", copy: "Copy", return: "Exit", rename: "Rename", tips: "WorkBook rename", noName: "Untitled spreadsheet", wait: "waiting for update", add: "Add", addLast: "more rows at bottom", backTop: "Back to the top", pageInfo: "Total ${total}${totalPage} pagecurrent ${currentPage}", nextPage: "Next", tipInputNumber: "Please enter the number", tipInputNumberLimit: "The increase range is limited to 1-100", tipRowHeightLimit: "Row height must be between 0 ~ 545", tipColumnWidthLimit: "The column width must be between 0 ~ 2038", pageInfoFull: "Total ${total}${totalPage} pageAll data displayed" }, currencyDetail: { RMB: "RMB", USdollar: "US dollar", EUR: "EUR", GBP: "GBP", HK: "HK", JPY: "JPY", AlbanianLek: "Albanian Lek", AlgerianDinar: "Algerian Dinar", Afghani: "Afghani", ArgentinePeso: "Argentine Peso", UnitedArabEmiratesDirham: "United Arab Emirates Dirham", ArubanFlorin: "Aruban Florin", OmaniRial: "Omani Rial", Azerbaijanimanat: "Azerbaijani manat", EgyptianPound: "Egyptian Pound", EthiopianBirr: "Ethiopian Birr", AngolaKwanza: "Angola Kwanza", AustralianDollar: "Australian Dollar", Patacas: "Patacas", BarbadosDollar: "Barbados Dollar", PapuaNewGuineaKina: "Papua New Guinea Kina", BahamianDollar: "Bahamian Dollar", PakistanRupee: "Pakistan Rupee", ParaguayanGuarani: "Paraguayan Guarani", BahrainiDinar: "Bahraini Dinar", PanamanianBalboa: "Panamanian Balboa", Brazilianreal: "Brazilian real", Belarusianruble: "Belarusian ruble", BermudianDollar: "Bermudian Dollar", BulgarianLev: "Bulgarian Lev", IcelandKrona: "Iceland Krona", BosniaHerzegovinaConvertibleMark: "Bosnia-Herzegovina Convertible Mark", PolishZloty: "Polish Zloty", Boliviano: "Boliviano", BelizeDollar: "Belize Dollar", BotswanaPula: "Botswana Pula", NotDannuzhamu: "Not Dannuzhamu", BurundiFranc: "Burundi Franc", NorthKoreanWon: "North Korean Won", DanishKrone: "Danish Krone", EastCaribbeanDollar: "East Caribbean Dollar", DominicaPeso: "Dominica Peso", RussianRuble: "Russian Ruble", EritreanNakfa: "Eritrean Nakfa", CFAfranc: "CFA franc", PhilippinePeso: "Philippine Peso", FijiDollar: "Fiji Dollar", CapeVerdeEscudo: "Cape Verde Escudo", FalklandIslandsPound: "Falkland Islands Pound", GambianDalasi: "Gambian Dalasi", Congolesefranc: "Congolese franc", ColombianPeso: "Colombian Peso", CostaRicanColon: "Costa Rican Colon", CubanPeso: "Cuban Peso", Cubanconvertiblepeso: "Cuban convertible peso", GuyanaDollar: "Guyana Dollar", KazakhstanTenge: "Kazakhstan Tenge", Haitiangourde: "Haitian gourde", won: "won", NetherlandsAntillesGuilder: "Netherlands Antilles Guilder", Honduraslempiras: "Honduras lempiras", DjiboutiFranc: "Djibouti Franc", KyrgyzstanSom: "Kyrgyzstan Som", GuineaFranc: "Guinea Franc", CanadianDollar: "Canadian Dollar", GhanaianCedi: "Ghanaian Cedi", Cambodianriel: "Cambodian riel", CzechKoruna: "Czech Koruna", ZimbabweDollar: "Zimbabwe Dollar", QatariRiyal: "Qatari Riyal", CaymanIslandsDollar: "Cayman Islands Dollar", Comorianfranc: "Comorian franc", KuwaitiDinar: "Kuwaiti Dinar", CroatianKuna: "Croatian Kuna", KenyanShilling: "Kenyan Shilling", LesothoLoti: "Lesotho Loti", LaoKip: "Lao Kip", LebanesePound: "Lebanese Pound", Lithuanianlitas: "Lithuanian litas", LibyanDinar: "Libyan Dinar", LiberianDollar: "Liberian Dollar", RwandaFranc: "Rwanda Franc", RomanianLeu: "Romanian Leu", MalagasyAriary: "Malagasy Ariary", MaldivianRufiyaa: "Maldivian Rufiyaa", MalawiKwacha: "Malawi Kwacha", MalaysianRinggit: "Malaysian Ringgit", MacedoniawearingDinar: "Macedonia wearing Dinar", MauritiusRupee: "Mauritius Rupee", MauritanianOuguiya: "Mauritanian Ouguiya", MongolianTugrik: "Mongolian Tugrik", BangladeshiTaka: "Bangladeshi Taka", PeruvianNuevoSol: "Peruvian Nuevo Sol", MyanmarKyat: "Myanmar Kyat", MoldovanLeu: "Moldovan Leu", MoroccanDirham: "Moroccan Dirham", MozambiqueMetical: "Mozambique Metical", MexicanPeso: "Mexican Peso", NamibianDollar: "Namibian Dollar", SouthAfricanRand: "South African Rand", SouthSudanesePound: "South Sudanese Pound", NicaraguaCordoba: "Nicaragua Cordoba", NepaleseRupee: "Nepalese Rupee", NigerianNaira: "Nigerian Naira", NorwegianKrone: "Norwegian Krone", GeorgianLari: "Georgian Lari", RMBOffshore: "RMB (Offshore)", SwedishKrona: "Swedish Krona", SwissFranc: "Swiss Franc", SerbianDinar: "Serbian Dinar", SierraLeone: "Sierra Leone", SeychellesRupee: "Seychelles Rupee", SaudiRiyal: "Saudi Riyal", SaoTomeDobra: "Sao Tome Dobra", SaintHelenapound: "Saint Helena pound", SriLankaRupee: "Sri Lanka Rupee", SwazilandLilangeni: "Swaziland Lilangeni", SudanesePound: "Sudanese Pound", Surinamesedollar: "Surinamese dollar", SolomonIslandsDollar: "Solomon Islands Dollar", SomaliShilling: "Somali Shilling", TajikistanSomoni: "Tajikistan Somoni", PacificFranc: "Pacific Franc", ThaiBaht: "Thai Baht", TanzanianShilling: "Tanzanian Shilling", TonganPaanga: "Tongan Pa'anga", TrinidadandTobagoDollar: "Trinidad and Tobago Dollar", TunisianDinar: "Tunisian Dinar", TurkishLira: "Turkish Lira", VanuatuVatu: "Vanuatu Vatu", GuatemalanQuetzal: "Guatemalan Quetzal", CommissionBolivar: "Commission Bolivar", BruneiDollar: "Brunei Dollar", UgandanShilling: "Ugandan Shilling", UkrainianHryvnia: "Ukrainian Hryvnia", UruguayanPeso: "Uruguayan Peso", Uzbekistansom: "Uzbekistan som", WesternSamoaTala: "Western Samoa Tala", SingaporeDollar: "Singapore Dollar", NT: "NT", NewZealandDollar: "New Zealand Dollar", HungarianForint: "Hungarian Forint", SyrianPound: "Syrian Pound", JamaicanDollar: "Jamaican Dollar", ArmenianDram: "Armenian Dram", YemeniRial: "Yemeni Rial", IraqiDinar: "Iraqi Dinar", IranianRial: "Iranian Rial", NewIsraeliShekel: "New Israeli Shekel", IndianRupee: "Indian Rupee", IndonesianRupiah: "Indonesian Rupiah", JordanianDinar: "Jordanian Dinar", VND: "VND", ZambianKwacha: "Zambian Kwacha", GibraltarPound: "Gibraltar Pound", ChileanPeso: "Chilean Peso", CFAFrancBEAC: "CFA Franc BEAC" }, defaultFmt: [{ text: "Automatic", value: "General", example: "" }, { text: "Plain text", value: "@", example: "" }, { text: "", value: "split", example: "" }, { text: "Number", value: "##0.00", example: "1000.12" }, { text: "Percent", value: "#0.00%", example: "12.21%" }, { text: "Scientific", value: "0.00E+00", example: "1.01E+5" }, { text: "", value: "split", example: "" }, { text: "Accounting", value: "¥(0.00)", example: "¥(1200.09)" }, { text: "Currency", value: "¥0.00", example: "¥1200.09" }, { text: "", value: "split", example: "" }, { text: "Date", value: "yyyy-MM-dd", example: "2017-11-29" }, { text: "Time", value: "hh:mm AM/PM", example: "3:00 PM" }, { text: "Time 24H", value: "hh:mm", example: "15:00" }, { text: "Date time", value: "yyyy-MM-dd hh:mm AM/PM", example: "2017-11-29 3:00 PM" }, { text: "Date time 24 H", value: "yyyy-MM-dd hh:mm", example: "2017-11-29 15:00" }, { text: "", value: "split", example: "" }, { text: "Custom formats", value: "fmtOtherSelf", example: "more" }], dateFmtList: [{ name: "1930-08-05", value: "yyyy-MM-dd" }, { name: "1930/8/5", value: "yyyy/MM/dd" }, { name: "08-05", value: "MM-dd" }, { name: "8-5", value: "M-d" }, { name: "13:30:30", value: "h:mm:ss" }, { name: "13:30", value: "h:mm" }, { name: "PM 01:30", value: "AM/PM hh:mm" }, { name: "PM 1:30", value: "AM/PM h:mm" }, { name: "PM 1:30:30", value: "AM/PM h:mm:ss" }, { name: "08-05 PM 01:30", value: "MM-dd AM/PM hh:mm" }], fontFamily: { MicrosoftYaHei: "YaHei" }, fontarray: ["Times New Roman", "Arial", "Tahoma", "Verdana"], fontjson: { "times new roman": 0, arial: 1, tahoma: 2, verdana: 3 }, border: { borderTop: "borderTop", borderBottom: "borderBottom", borderLeft: "borderLeft", borderRight: "borderRight", borderNone: "borderNone", borderAll: "borderAll", borderOutside: "borderOutside", borderInside: "borderInside", borderHorizontal: "borderHorizontal", borderVertical: "borderVertical", borderColor: "borderColor", borderSize: "borderSize" }, merge: { mergeAll: "Merge all", mergeV: "Vertically", mergeH: "Horizontally", mergeCancel: "Unmerge", overlappingError: "Cannot merge overlapping areas", partiallyError: "Cannot perform this operation on partially merged cells" }, align: { left: "left", center: "center", right: "right", top: "Top", middle: "Middle", bottom: "Bottom" }, textWrap: { overflow: "Overflow", wrap: "Wrap", clip: "Clip" }, rotation: { none: "None", angleup: "Tilt Up", angledown: "Tilt Down", vertical: "Stack Vertically", rotationUp: "Rotate Up", rotationDown: "Rotate Down" }, freezen: { default: "Freeze", freezenRow: "First Row", freezenColumn: "First Column", freezenRC: "Both", freezenRowRange: "Freezen row range", freezenColumnRange: "Freezen column range", freezenRCRange: "Freezen both range", freezenCancel: "Cancel", noSeletionError: "No Range to be selected" }, sort: { asc: "Ascending ", desc: "Descending ", custom: "Custom sort", hasTitle: "Data has a header row", sortBy: "Sort by", addOthers: "Add another sort column", close: "close", confirm: "sort", columnOperation: "Column", secondaryTitle: "then by", sortTitle: "Sort range", sortRangeTitle: "Sort range from", sortRangeTitleTo: "to", noRangeError: "Cannot perform this operation on multiple selection areas, please select a single range and try again", mergeError: "There are merged cells in the selection, this operation cannot be performed!" }, filter: { filter: "create filter", sortByAsc: "Sort A-Z", sortByDesc: "Sort Z-A", filterByColor: "Filter by color", filterByCondition: "Filter by condition", filterByValues: "Filter by values", filiterInputNone: "None", filiterInputTip: "Enter filter value", filiterRangeStartTip: "Value for formula", filiterRangeEndTip: "Value for formula", filterValueByAllBtn: "Check all", filterValueByClearBtn: "Clear", filterValueByInverseBtn: "Inverse", filterValueByTip: "filter By Values", filterConform: "Confirm", filterCancel: "Cancel", clearFilter: "Clear filter", conditionNone: "None", conditionCellIsNull: "Is empty", conditionCellNotNull: "Is not empty", conditionCellTextContain: "Text contains", conditionCellTextNotContain: "Text does not contain", conditionCellTextStart: "Text starts with", conditionCellTextEnd: "Text ends with", conditionCellTextEqual: "Text is exactly", conditionCellDateEqual: "Date is", conditionCellDateBefore: "Date is before", conditionCellDateAfter: "Date is after", conditionCellGreater: "Greater than", conditionCellGreaterEqual: "Greater than or equal to", conditionCellLess: "Less than", conditionCellLessEqual: "Less than or equal to", conditionCellEqual: "Is equal to", conditionCellNotEqual: "Is not equal to", conditionCellBetween: "Is between", conditionCellNotBetween: "Is not between", filiterMoreDataTip: "Big amount of data! please wait", filiterMonthText: "Month", filiterYearText: "Year", filiterByColorTip: "Filter by cell color", filiterByTextColorTip: "Filter by font color", filterContainerOneColorTip: "This column contains only one color", filterDateFormatTip: "Date format", valueBlank: "(Null)", mergeError: "There are merged cells in the filter selection, this operation cannot be performed!" }, rightclick: { copy: "Copy", copyAs: "Copy as", paste: "Paste", insert: "Insert", delete: "Delete", deleteCell: "Delete cell", deleteSelected: "Delete selected ", hide: "Hide", hideSelected: "Hide selected ", showHide: "Show hidden ", to: "Towards", left: "Left", right: "Right", top: "Top", bottom: "Bottom", moveLeft: "Move left", moveUp: "Move up", add: "Add", row: "Row", column: "Column", width: "Width", height: "Height", number: "Number", confirm: "Confirm", orderAZ: "A-Z order", orderZA: "Z-A order", clearContent: "Clear content", matrix: "Matrix operation", sortSelection: "Sort", filterSelection: "Filter", chartGeneration: "Create chart", firstLineTitle: "first line title", untitled: "untitled", array1: "One-dimensional array", array2: "Two-dimensional array", array3: "Multidimensional Arrays", diagonal: "Diagonal", antiDiagonal: "Anti-diagonal", diagonalOffset: "Diagonal offset", offset: "Offset", boolean: "Boolean", flip: "Flip", upAndDown: "Up and down", leftAndRight: "Left and right", clockwise: "Clockwise", counterclockwise: "Counterclockwise", transpose: "Transpose", matrixCalculation: "Matrix calculation", plus: "Plus", minus: "Minus", multiply: "Multiply", divided: "Divided", power: "Power", root: "Root", log: "Log", delete0: "Delete 0 values at both ends", removeDuplicate: "Remove duplicate values", byRow: "By row", byCol: "By column", generateNewMatrix: "Generate new matrix" }, comment: { insert: "Insert", edit: "Edit", delete: "Delete", showOne: "Show/Hide", showAll: "Show/Hide All" }, screenshot: { screenshotTipNoSelection: "Please select the scope of the screenshot", screenshotTipTitle: "Warning", screenshotTipHasMerge: "This operation cannot be performed on merged cells", screenshotTipHasMulti: "This operation cannot be performed on multiple selection regions", screenshotTipSuccess: "Successful", screenshotImageName: "Screenshot", downLoadClose: "Close", downLoadCopy: "Copy to clipboard", downLoadBtn: "Download", browserNotTip: "not supported by IE browser!", rightclickTip: 'Please right-click "copy" on the picture', successTip: 'Successfully (if pasting fails, please right-click on the image to "copy image")' }, splitText: { splitDelimiters: "Delimiters", splitOther: "Other", splitContinueSymbol: "Consecutive separators are treated as a single", splitDataPreview: "Preview", splitTextTitle: "Split text", splitConfirmToExe: "There is already data here, do you want to replace it?", tipNoMulti: "Cannot perform this operation on multiple selection areas, please select a single area and try again", tipNoMultiColumn: "Only one column of data can be converted at a time. The selected area can have multiple rows but not multiple columns. Please try again after selecting a single column range" }, imageText: { imageSetting: "Image setting", close: "Close", conventional: "Conventional", moveCell1: "Move and resize cells", moveCell2: "Move and do not resize the cell", moveCell3: "Do not move and resize the cell", fixedPos: "Fixed position", border: "Border", width: "Width", radius: "Radius", style: "Style", solid: "Solid", dashed: "Dashed", dotted: "Dotted", double: "Double", color: "Color" }, punctuation: { tab: "Tab", semicolon: "semicolon", comma: "comma", space: "space" }, findAndReplace: { find: "Find", replace: "Replace", goto: "Go to", location: "Location", formula: "Formula", date: "Date", number: "Number", string: "String", error: "Error", condition: "Condition", rowSpan: "Row span", columnSpan: "Column span", locationExample: "Location", lessTwoRowTip: "Please select at least two rows", lessTwoColumnTip: "Please select at least two columns", findTextbox: "Find Content", replaceTextbox: "Replace Content", regexTextbox: "Regular Expression", wholeTextbox: "Whole word", distinguishTextbox: "Case sensitive", allReplaceBtn: "Replace All", replaceBtn: "Replace", allFindBtn: "Find All", findBtn: "Find next", noFindTip: "The content was not found", modeTip: "This operation is not available in this mode", searchTargetSheet: "Sheet", searchTargetCell: "Cell", searchTargetValue: "Value", searchInputTip: "Please enter the search content", noReplceTip: "There is nothing to replace", noMatchTip: "No match found", successTip: "${xlength} items found", locationConstant: "Constant", locationFormula: "Formula", locationDate: "Date", locationDigital: "Number", locationString: "String", locationBool: "Logical", locationError: "Error", locationNull: "Null", locationCondition: "Conditional format", locationRowSpan: "Row span", locationColumnSpan: "Column span", locationTiplessTwoRow: "Please select at least two rows", locationTiplessTwoColumn: "Please select at least two columns", locationTipNotFindCell: "Cell not found" }, sheetconfig: { delete: "Delete", copy: "Copy", rename: "Rename", changeColor: "Change color", hide: "Hide", unhide: "Unhide", moveLeft: "Move left", moveRight: "Move right", resetColor: "Reset color", cancelText: "Cancel", chooseText: "Confirm color", tipNameRepeat: "The name of the tab page cannot be repeated! Please revise", noMoreSheet: "The workbook contains at least one visual worksheet. To delete the selected worksheet, please insert a new worksheet or show a hidden worksheet.", confirmDelete: "Are you sure to delete", redoDelete: "Can be undo by Ctrl+Z", noHide: "Can't hide, at least keep one sheet tag", chartEditNoOpt: "This operation is not allowed in chart editing mode!", sheetNameSpecCharError: "The name cannot contain:[ ] : ? * / ' \"", sheetNamecannotIsEmptyError: "Sheet name cannot be empty" }, conditionformat: { conditionformat_greaterThan: "Conditionformat-GreaterThan", conditionformat_greaterThan_title: "Format cells greater than", conditionformat_lessThan: "Conditionformat-LessThan", conditionformat_lessThan_title: "Format cells smaller than", conditionformat_betweenness: "Conditionformat-Betweenness", conditionformat_betweenness_title: "Format cells with values between", conditionformat_equal: "Conditionformat-Equal", conditionformat_equal_title: "Format cells equal to", conditionformat_textContains: "Conditionformat-TextContains", conditionformat_textContains_title: "Format cells containing the following text", conditionformat_occurrenceDate: "Conditionformat-OccurrenceDate", conditionformat_occurrenceDate_title: "Format cells containing the following dates", conditionformat_duplicateValue: "Conditionformat-DuplicateValue", conditionformat_duplicateValue_title: "Format cells containing the following types of values", conditionformat_top10: "Conditionformat-Top10", conditionformat_top10_percent: "Conditionformat-Top10%", conditionformat_top10_title: "Format the cells with the highest value", conditionformat_last10: "Conditionformat-Last10", conditionformat_last10_percent: "Conditionformat-Last10%", conditionformat_last10_title: "Format the cells with the smallest value", conditionformat_AboveAverage: "Conditionformat-AboveAverage", conditionformat_AboveAverage_title: "Format cells above average", conditionformat_SubAverage: "Conditionformat-SubAverage", conditionformat_SubAverage_title: "Format cells below average", rule: "Rule", newRule: "New rule", editRule: "Edit rule", deleteRule: "Delete rule", deleteCellRule: "Delete cell rule", deleteSheetRule: "Delete sheet rule", manageRules: "Management rules", showRules: "Show its formatting rules", highlightCellRules: "Highlight cell rules", itemSelectionRules: "Item selection rules", conditionformatManageRules: "Conditional Formatting Rule Manager", format: "Format", setFormat: "Set format", setAs: "Set as", setAsByArea: "For the selected area, set to", applyRange: "Apply range", selectRange: "Select application range", selectRange_percent: "Percentage of selected range", selectRange_average: "Average value of selected range", selectRange_value: "Value in the selected range", pleaseSelectRange: "Please select application range", selectDataRange: "Select data range", selectCell: "select cell", pleaseSelectCell: "Please select cell", pleaseSelectADate: "Please select a date", pleaseEnterInteger: "Please enter an integer between 1 and 1000", onlySingleCell: "Only a single cell can be referenced", conditionValueCanOnly: "The condition value can only be a number or a single cell", ruleTypeItem1: "Format all cells based on their respective values", ruleTypeItem2: "Only format cells that contain", ruleTypeItem2_title: "Only for cells that meet the following conditions", ruleTypeItem3: "Format only the top or bottom numbers", ruleTypeItem3_title: "Is the value in the following ranking", ruleTypeItem4: "Format only values above or below the average", ruleTypeItem4_title: "Is a value that satisfies the following conditions", ruleTypeItem5: "Format only unique or repeated values", ruleTypeItem6: "Use formulas to determine which cells to format", formula: "Formula", textColor: "Text color", cellColor: "Cell color", confirm: "Confirm", confirmColor: "Confirm color", cancel: "Cancel", close: "Close", clearColorSelect: "Clear color select", sheet: "Sheet", currentSheet: "Current Sheet", dataBar: "data bar", dataBarColor: "data bar color", gradientDataBar_1: "Blue-white gradient data bar", gradientDataBar_2: "Green-white gradient data bar", gradientDataBar_3: "Red-white gradient data bar", gradientDataBar_4: "Orange-white gradient stripes", gradientDataBar_5: "Light blue-white gradient stripes", gradientDataBar_6: "Purple-white gradient data bar", solidColorDataBar_1: "Blue data bar", solidColorDataBar_2: "Green data bar", solidColorDataBar_3: "Red data bar", solidColorDataBar_4: "Orange data bar", solidColorDataBar_5: "Light blue data bar", solidColorDataBar_6: "Purple data bar", colorGradation: "color gradation", colorGradation_1: "Green-yellow-red color gradation", colorGradation_2: "Red-yellow-green color gradation", colorGradation_3: "Green-white-red color gradation", colorGradation_4: "Red-white-green color gradation", colorGradation_5: "Blue-white-red color gradation", colorGradation_6: "Red-white-blue color gradation", colorGradation_7: "White-red color gradation", colorGradation_8: "Red-white color gradation", colorGradation_9: "Green-white color gradation", colorGradation_10: "White-green color gradation", colorGradation_11: "Green-yellow color gradation", colorGradation_12: "Yellow-green color gradation", icons: "icons", pleaseSelectIcon: "Please click to select a group of icons:", cellValue: "Cell value", specificText: "Specific text", occurrence: "Date", greaterThan: "Greater than", lessThan: "Less than", between: "Between", equal: "Equal", in: "In", between2: "", contain: "Contain", textContains: "Text contains", duplicateValue: "Duplicate value", uniqueValue: "Unique value", top: "Top", top10: "Top 10", top10_percent: "Top 10%", last: "Last", last10: "Last 10", last10_percent: "Last 10%", oneself: "", above: "Above", aboveAverage: "Above average", below: "Below", belowAverage: "Below average", all: "All", yesterday: "YTD", today: "Today", tomorrow: "Tomorrow", lastWeek: "Last week", thisWeek: "This week", lastMonth: "Last month", thisMonth: "This month", lastYear: "Last year", thisYear: "This year", last7days: "Last 7 days", last30days: "Last 30 days", next7days: "Next 7 days", next30days: "Next 30 days", next60days: "Next 60 days", chooseRuleType: "Choose rule type", editRuleDescription: "Edit rule description", newFormatRule: "New format rule", editFormatRule: "Edit format rule", formatStyle: "Style", fillType: "Fill", color: "Color", twocolor: "Two-color", tricolor: "Tricolor", multicolor: "Multi color", grayColor: "Gray color", gradient: "Gradient", solid: "Solid", maxValue: "Max value", medianValue: "Median value", minValue: "Min value", direction: "Direction", threeWayArrow: "Three-way arrow", fourWayArrow: "Four-way arrow", fiveWayArrow: "Five-way arrow", threeTriangles: "Three triangles", shape: "Shape", threeColorTrafficLight: "Three-color traffic light", fourColorTrafficLight: "Four-color traffic light", threeSigns: "Three signs", greenRedBlackGradient: "Green-red-black gradient", rimless: "Rimless", bordered: "Bordered", mark: "Mark", threeSymbols: "Three symbols", tricolorFlag: "Tricolor flag", circled: "Circled", noCircle: "No circle", grade: "Grade", grade4: "4 Grade", grade5: "5 Grade", threeStars: "3 Stars", fiveQuadrantDiagram: "Five-quadrant diagram", fiveBoxes: "5 Boxes" }, insertLink: { linkText: "Text", linkType: "Link type", external: "External link", internal: "Internal link", linkAddress: "Link address", linkSheet: "Worksheet", linkCell: "Cell reference", linkTooltip: "Tooltip", placeholder1: "Please enter the web link address", placeholder2: "Please enter the cell to be quoted, example A1", placeholder3: "Please enter the prompt content", tooltipInfo1: "Please enter a valid link", tooltipInfo2: "Please enter the correct cell reference" }, dataVerification: { cellRange: "Cell range", selectCellRange: "Click to select a cell range", selectCellRange2: "Please select a range of cells", verificationCondition: "Verification condition", dropdown: "drop-down list", checkbox: "Checkbox", number: "Number", number_integer: "Number-integer", number_decimal: "Number-decimal", text_content: "Text-content", text_length: "Text-length", date: "Date", validity: "Effectiveness", placeholder1: "Please enter the options, separated by commas, such as 1,2,3,4,5", placeholder2: "Please enter content", placeholder3: "Numeric value, such as 10", placeholder4: "Please enter the specified text", placeholder5: "Please enter the prompt displayed when the cell is selected", selected: "Selected", notSelected: "Not selected", between: "Between", notBetween: "Not between", equal: "Equal", notEqualTo: "Not equal to", moreThanThe: "More than the", lessThan: "Less than", greaterOrEqualTo: "Greater or equal to", lessThanOrEqualTo: "Less than or equal to", include: "Include", exclude: "Exclude", earlierThan: "Earlier than", noEarlierThan: "No earlier than", laterThan: "Later than", noLaterThan: "No later than", identificationNumber: "Identification number", phoneNumber: "Phone number", remote: "Automatic remote acquisition option", prohibitInput: "Prohibit input when input data is invalid", hintShow: "Show prompt when the cell is selected", deleteVerification: "Delete verification", tooltipInfo1: "The drop-down list option cannot be empty", tooltipInfo2: "Checkbox content cannot be empty", tooltipInfo3: "The value entered is not a numeric type", tooltipInfo4: "The value 2 cannot be less than the value 1", tooltipInfo5: "The text content cannot be empty", tooltipInfo6: "The value entered is not a date type", tooltipInfo7: "Date 2 cannot be less than date 1" }, formula: { sum: "Sum", average: "Average", count: "Count", max: "Max", min: "Min", ifGenerate: "If formula generator", find: "Learn more", tipNotBelongToIf: "This cell function does not belong to the if formula!", tipSelectCell: "Please select the cell to insert the function", ifGenCompareValueTitle: "Comparison value", ifGenSelectCellTitle: "Click to select cell", ifGenRangeTitle: "Range", ifGenRangeTo: "to", ifGenRangeEvaluate: "Range evaluate", ifGenSelectRangeTitle: "Click to select range", ifGenCutWay: "Partition way", ifGenCutSame: "Same Partition value", ifGenCutNpiece: "Partition by N", ifGenCutCustom: "Custom", ifGenCutConfirm: "Confirm", ifGenTipSelectCell: "Select cells", ifGenTipSelectCellPlace: "Please select cells", ifGenTipSelectRange: "Select range", ifGenTipSelectRangePlace: "Please select range", ifGenTipNotNullValue: "The comparison value cannot be empty!", ifGenTipLableTitile: "Label", ifGenTipRangeNotforNull: "The range cannot be empty!", ifGenTipCutValueNotforNull: "The partition value cannot be empty!", ifGenTipNotGenCondition: "No conditions are available for generation!" }, formulaMore: { valueTitle: "Value", tipSelectDataRange: "Select data range", tipDataRangeTile: "Data range", findFunctionTitle: "Search function", tipInputFunctionName: "Function name or brief description of function", Array: "Array", Database: "Database", Date: "Date", Engineering: "Engineering", Filter: "Filter", Financial: "Financial", luckysheet: "Luckysheet", other: "Other", Logical: "Logical", Lookup: "Lookup", Math: "Math", Operator: "Operator", Parser: "Parser", Statistical: "Statistical", Text: "Text", dataMining: "Data Mining", selectFunctionTitle: "Select a function", calculationResult: "Result", tipSuccessText: "Success", tipParamErrorText: "Parameter type error", helpClose: "Close", helpCollapse: "Collapse", helpExample: "Example", helpAbstract: "Abstract", execfunctionError: "Error in the formula", execfunctionSelfError: "The formula cannot refer to its own cell", execfunctionSelfErrorResult: "The formula cannot refer to its own cell, which will lead to inaccurate calculation results", allowRepeatText: "Repeat", allowOptionText: "Option", selectCategory: "Or select a category" }, drag: { noMerge: "Cannot perform this operation on merged cells", affectPivot: "This change cannot be made to the selected cell because it will affect the pivot table!", noMulti: "Cannot perform this operation on multiple selection areas, please select a single area", noPaste: "Unable to paste this content here, please select a cell in the paste area and try to paste again", noPartMerge: "Cannot perform this operation on partially merged cells", inputCorrect: "Please enter the correct value", notLessOne: "The number of rows and columns cannot be less than 1", offsetColumnLessZero: "The offset column cannot be negative!", pasteMustKeybordAlert: "在表格中进行复制粘贴: Ctrl + C 进行复制, Ctrl + V 进行粘贴, Ctrl + X 进行剪切", pasteMustKeybordAlertHTMLTitle: "在表格中进行复制粘贴", pasteMustKeybordAlertHTML: "<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;进行复制<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;进行粘贴<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;进行剪切" }, pivotTable: { title: "Pivot Table", closePannel: "Close", editRange: "Range", tipPivotFieldSelected: "Select the fields", tipClearSelectedField: "Clear all fields", btnClearSelectedField: "Clear", btnFilter: "Filter", titleRow: "Row", titleColumn: "Column", titleValue: "Value", tipShowColumn: "Statistics fields are displayed as columns", tipShowRow: "Statistics fields are displayed as rows", titleSelectionDataRange: "Select range", titleDataRange: "Data range", valueSum: "SUM", valueStatisticsSUM: "Sum", valueStatisticsCOUNT: "Count", valueStatisticsCOUNTA: "Count A", valueStatisticsCOUNTUNIQUE: "Count Unique", valueStatisticsAVERAGE: "Average", valueStatisticsMAX: "Max", valueStatisticsMIN: "Min", valueStatisticsMEDIAN: "Median", valueStatisticsPRODUCT: "Product", valueStatisticsSTDEV: "Stdev", valueStatisticsSTDEVP: "Stdevp", valueStatisticslet: "Var", valueStatisticsVARP: "VarP", errorNotAllowEdit: "This operation is prohibited in non-editing mode!", errorNotAllowMulti: "Cannot perform this operation on multiple selection areas, please select a single range and try again", errorSelectRange: "Please select the range of the new pivot table", errorIsDamage: "The source data of this pivot table is corrupted!", errorNotAllowPivotData: "Cannot select pivot table as source data!", errorSelectionRange: "Selection failed, wrong input range!", errorIncreaseRange: "Please expand the selected range!", titleAddColumn: "Add column to pivot table", titleMoveColumn: "Move the column to the white box below", titleClearColumnFilter: "Clear the filter for this column", titleFilterColumn: "Filter", titleSort: "Sort", titleNoSort: "No sort", titleSortAsc: "ASC", titleSortDesc: "DESC", titleSortBy: "Sort by", titleShowSum: "Show total", titleStasticTrue: "Yes", titleStasticFalse: "No" }, dropCell: { copyCell: "Copy", sequence: "Sequence", onlyFormat: "Only format", noFormat: "Not format", day: "Day", workDay: "Work Day", month: "Month", year: "Year", chineseNumber: "Chinese numbers" }, imageCtrl: { borderTile: "Image border color", borderCur: "Color" }, protection: { protectiontTitle: "Protection", enterPassword: "Enter a password (optional)", enterHintTitle: "Prompt when editing is prohibited (optional)", enterHint: "The cell or chart you are trying to change is in a protected worksheet. If you want to change it, please unprotect the worksheet. You may need to enter a password", swichProtectionTip: "Protect the sheet and contents of locked cells", authorityTitle: "Allow users of this sheet to:", selectLockedCells: "Select locked cells", selectunLockedCells: "Select unlocked cells", formatCells: "Format cells", formatColumns: "Format columns", formatRows: "Format rows", insertColumns: "Insert columns", insertRows: "Insert rows", insertHyperlinks: "Insert hyperlinks", deleteColumns: "Delete columns", deleteRows: "Delete rows", sort: "Sort", filter: "Filter", usePivotTablereports: "Use Pivot Table reports", editObjects: "Edit objects", editScenarios: "Edit scenarios", allowRangeTitle: "Allow users of range to:", allowRangeAdd: "New...", allowRangeAddTitle: "Title", allowRangeAddSqrf: "Reference", selectCellRange: "Click to select a cell range", selectCellRangeHolder: "Cell range", allowRangeAddTitlePassword: "Password", allowRangeAddTitleHint: "Prompt", allowRangeAddTitleHintTitle: "Prompt when a password is set (optional)", allowRangeAddtitleDefault: "Input range name", rangeItemDblclick: "Double click to edit", rangeItemHasPassword: "Has password", rangeItemErrorTitleNull: "Title is null", rangeItemErrorRangeNull: "Reference is null", rangeItemErrorRange: "Reference is error", validationTitle: "Password validation", validationTips: "Need to enter a password to unlock the protection of the worksheet", validationInputHint: "Enter a password", checkPasswordNullalert: "Password is required!", checkPasswordWrongalert: "Incorrect password, please try again!", checkPasswordSucceedalert: "Unlock Succeed!", defaultRangeHintText: "The cell is being password protected.", defaultSheetHintText: "The cell or chart is in a protected worksheet. To make changes, please unprotect the worksheet. You may need to enter a password" }, cellFormat: { cellFormatTitle: "Format cells", protection: "Protection", locked: "Locked", hidden: "Hidden", protectionTips: "To lock cells or hide formulas, protect the worksheet. On the toolbar, Click Protect Sheet Button", tipsPart: "Partial checked", tipsAll: "All checked", selectionIsNullAlert: "Selection is required!", sheetDataIsNullAlert: "error, Data is none!" }, print: { normalBtn: "Normal", layoutBtn: "Page Layout", pageBtn: "Pagebreakpreview", menuItemPrint: "Print (Ctrl+P)", menuItemAreas: "Print areas", menuItemRows: "Print title rows", menuItemColumns: "Print title columns" }, edit: { typing: "typing" }, websocket: { success: "WebSocket connection success", refresh: "An error occurred in the WebSocket connection, please refresh the page!", wait: "An error occurred in the WebSocket connection, please be patient!", close: "WebSocket connection closed", contact: "Server communication error occurred, please refresh the page and try again, if not, please contact the administrator!", support: "The current browser does not support WebSocket" } }, zh: { functionlist: [{ n: "SUMIF", t: 0, d: "对范围中符合指定条件的值求和。", a: "对范围中符合指定条件的值求和。", m: [2, 3], p: [{ name: "范围", detail: "要根据条件进行检测的范围。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "条件", detail: "要应用于范围的模式或测试条件。\n\n如果范围包含的是要检测的文本,则条件必须为字符串。条件可以包含通配符,包括用于匹配单个字符的?或用于匹配零个或连续多个字符的*。要匹配问号星号本身,请在该字符前面加上波浪号(~)前缀(即~?和~*)。字符串条件必须用引号括起来。函数会检查范围中的每个单元格与条件是否相等或匹配(如果使用了通配符)。\n\n如果范围包含的是要检测的数字,则条件可以是字符串也可以是数字。如果给定的条件是一个数字,则检查范围中的每个单元格是否等于条件。另外,条件也可能是包含数字的字符串(也将对其进行相等检测),或者带有以下前缀的数字:=(检查是否相等)、>(检查范围单元格的值是否大于条件值)或<(检查范围单元格的值是否小于条件值)", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "求和范围", detail: "要求和的范围(如果与范围不同)。", example: "B1:B10", require: "o", repeat: "n", type: "range" }] }, { n: "TAN", t: 0, d: "返回已知角度的正切值。", a: "返回已知角度的正切值。", m: [1, 1], p: [{ name: "角度", detail: "要求其正切值的角度,以弧度表示。", example: "45*PI()/180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TANH", t: 0, d: "返回给定实数的双曲正切值。", a: "返回给定实数的双曲正切值。", m: [1, 1], p: [{ name: "值", detail: "要计算其双曲正切值的实数。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CEILING", t: 0, d: "将数值向上取整为最接近的指定因数的倍数。", a: "将数值向上取整为最接近的指定因数的倍数。", m: [2, 2], p: [{ name: "值", detail: "要向上舍入的数值。", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "因数", detail: "要将值舍入到此数的整数倍。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN", t: 0, d: "返回数值的反正切值,以弧度表示。", a: "返回数值的反正切值", m: [1, 1], p: [{ name: "值", detail: "要计算其反正切值的数值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ASINH", t: 0, d: "返回数值的反双曲正弦值。", a: "返回数值的反双曲正弦值。", m: [1, 1], p: [{ name: "值", detail: "要计算其反双曲正弦值的数值。", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ABS", t: 0, d: "返回数值的绝对值。", a: "返回数值的绝对值。", m: [1, 1], p: [{ name: "value", detail: "要返回其绝对值的数。", example: "-2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOS", t: 0, d: "返回数值的反余弦值,以弧度表示。", a: "返回数值的反余弦值", m: [1, 1], p: [{ name: "值", detail: "要计算其反余弦值的数值。必须介于-1和1之间,包括两端值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOSH", t: 0, d: "返回数值的反双曲余弦值。", a: "返回数值的反双曲余弦值。", m: [1, 1], p: [{ name: "值", detail: "要计算其反双曲余弦值的数值。必须大于等于1。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTINOMIAL", t: 0, d: "返回参数和的阶乘除以各参数阶乘的乘积后得到的值。", a: "返回参数和的阶乘除以各参数阶乘的乘积后得到的值。", m: [1, 255], p: [{ name: "值1", detail: "用于计算的第一项数值或范围。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "用于计算的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "ATANH", t: 0, d: "返回数值的反双曲正切值。", a: "返回数值的反双曲正切值。", m: [1, 1], p: [{ name: "值", detail: "要计算其反双曲正切值的数值。必须介于-1和1之间(不包括-1和1)。", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN2", t: 0, d: "以弧度为单位返回 x 轴与从原点 (0,0) 到指定坐标点 (`x`,`y`) 之间连线的夹角。", a: "以弧度为单位返回 x 轴与从原点 (0,0) 到指定坐标点 (`x`,`y`) 之间连线的夹角。", m: [2, 2], p: [{ name: "x", detail: "要计算其与x轴夹角大小的线段的终点x坐标。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "y", detail: "要计算其与x轴夹角大小的线段的终点y坐标。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTBLANK", t: 1, d: "返回给定范围内的空单元格数。", a: "返回给定范围内的空单元格数。", m: [1, 1], p: [{ name: "范围", detail: "要统计空白单元格数量的范围。", example: "A2:C100", require: "m", repeat: "n", type: "range" }] }, { n: "COSH", t: 0, d: "返回给定实数的双曲余弦值。", a: "返回给定实数的双曲余弦值。", m: [1, 1], p: [{ name: "值", detail: "要计算其双曲余弦值的实数值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "INT", t: 0, d: "将数值向下取整为小于或等于该数的最接近的整数。", a: "将数值向下取整为小于或等于该数的最接近的整数。", m: [1, 1], p: [{ name: "值", detail: "要向下取整为最接近的整数的数值。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISEVEN", t: 0, d: "检查所提供的数值是否为偶数。", a: "检查所提供的数值是否为偶数。", m: [1, 1], p: [{ name: "值", detail: "要验证其是否为偶数的数值。\n\n如果值为偶数或指向包含偶数的单元格的引用,ISEVEN将返回TRUE,否则返回FALSE。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISODD", t: 0, d: "检查所提供的数值是否为奇数。", a: "检查所提供的数值是否为奇数。", m: [1, 1], p: [{ name: "值", detail: "要验证其是否为奇数的数值。\n\n如果值为奇数或指向包含奇数的单元格,ISODD将返回TRUE,否则返回FALSE。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LCM", t: 0, d: "返回一个或多个整数的最小公倍数。", a: "返回一个或多个整数的最小公倍数。", m: [1, 255], p: [{ name: "值1", detail: "要在求最小公倍数数的计算中检查其因数的第一项数值或范围。", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可选] - 在求最小公倍数时要考虑其因数的其他数值或范围。", example: "3", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LN", t: 0, d: "返回数值以 e(欧拉数)为底的对数。", a: "返回数值以 e(欧拉数)为底的对数。", m: [1, 1], p: [{ name: "值", detail: "要以 e 为底数计算其对数的值。\n\n值必须为正数。", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOG", t: 0, d: "根据指定底数返回数字的对数。", a: "根据指定底数返回数字的对数。", m: [1, 2], p: [{ name: "值", detail: "想要计算其对数的正实数。", example: "128", require: "m", repeat: "n", type: "rangenumber" }, { name: "底数", detail: "[可选] - 对数的底数。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "LOG10", t: 0, d: "返回数值以10为底的对数。", a: "返回数值以10为底的对数。", m: [1, 1], p: [{ name: "值", detail: "要计算其以10为底的对数的数值。\n\n值必须为正值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MOD", t: 0, d: "返回两数相除的余数, 结果的符号与除数相同。", a: "返回两数相除的余数。", m: [2, 2], p: [{ name: "被除数", detail: "要将其相除以得到余数的数值。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "除数", detail: "用于除其他数的数值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MROUND", t: 0, d: "将数值取整为另一整数最接近的整数倍。", a: "将数值取整为另一整数最接近的整数倍。", m: [2, 2], p: [{ name: "值", detail: "要取整为另一整数最接近的整数倍的数值。", example: "21", require: "m", repeat: "n", type: "rangenumber" }, { name: "因数", detail: "值将取此因数的整数倍。", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ODD", t: 0, d: "将数值向上取整为最接近的奇整数。", a: "将数值向上取整为最接近的奇整数。", m: [1, 1], p: [{ name: "值", detail: "要向上取整的数值,取整值为大于此值的最接近的奇数。\n\n如果值为负数,则将其取整为绝对值大于该值的相邻负奇数。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMSQ", t: 0, d: "返回一组数值和/或单元格的平方总和。", a: "返回一组数值和/或单元格的平方总和。", m: [1, 255], p: [{ name: "值1", detail: "要将其平方相加的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 要将其平方与值1的平方相加的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMBIN", t: 0, d: "给定集合中的对象总数和要选择的对象数量,返回共有多少种不同选择方式。", a: "给定集合中的对象总数和要选择的对象数量", m: [2, 2], p: [{ name: "n", detail: "要从中进行选择的对象集合的大小。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "要选择的对象数量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUM", t: 0, d: "返回一组数值和/或单元格的总和。", a: "返回一组数值和/或单元格的总和。", m: [1, 255], p: [{ name: "值1", detail: "要相加的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可选] - 要相加的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SUBTOTAL", t: 0, d: "使用指定的汇总函数,返回一系列纵向单元格的分类汇总。", a: "使用指定的汇总函数", m: [2, 256], p: [{ name: "函数代码", detail: "用于计算分类汇总的函数。\n\n1代表AVERAGE\n\n2代表COUNT\n\n3代表COUNTA\n\n4代表MAX\n\n5代表MIN\n\n6代表PRODUCT\n\n7代表STDEV\n\n8代表STDEVP\n\n9代表SUM\n\n10代表VAR\n\n11代表VARP\n\n通过在这些2位代码前附加10(对于1位代码)或1(对于2位代码),可以将隐藏值忽略。例如,102代表忽略隐藏单元格的COUNT,而110则代表忽略隐藏值的VAR。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "范围1", detail: "要计算分类汇总的第一个范围。", example: "A2:A5", require: "m", repeat: "n", type: "range" }, { name: "范围2", detail: "[可选] - 要计算分类汇总的其他范围。", example: "B2:B8", require: "o", repeat: "y", type: "range" }] }, { n: "ASIN", t: 0, d: "返回数值的反正弦值,以弧度表示。", a: "返回数值的反正弦值", m: [1, 1], p: [{ name: "值", detail: "要计算其反正弦值的数值。必须介于-1和1之间,包括两端值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTIF", t: 1, d: "返回范围内满足某个条件的单元格的数量。", a: "返回范围内满足某个条件的单元格的数量。", m: [2, 2], p: [{ name: "范围", detail: "要根据条件进行检测的范围。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "条件", detail: "要应用于范围的模式或测试条件。\n\n如果范围包含的是要检测的文本,则条件必须为字符串。条件可以包含通配符,包括用于匹配单个字符的?或用于匹配零个或连续多个字符的*。要匹配问号星号本身,请在该字符前面加上波浪号(~)前缀(即~?和~*)。字符串条件必须用引号括起来。函数会检查范围中的每个单元格与条件是否相等或匹配(如果使用了通配符)。\n\n如果范围包含的是要检测的数字,则条件可以是字符串也可以是数字。如果给定的条件是一个数字,则检查范围中的每个单元格是否等于条件。另外,条件也可能是包含数字的字符串(也将对其进行相等检测),或者带有以下前缀的数字:=、>、>=、<或<=,这些条件将分别用于检查范围中的单元格是否等于、大于、大于等于、小于、小于等于条件值。", example: '">20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "RADIANS", t: 0, d: "将以度表示的角度值转换为弧度。", a: "将以度表示的角度值转换为弧度。", m: [1, 1], p: [{ name: "角度", detail: "要从度转换为弧度的角度。", example: "180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RAND", t: 0, d: "返回一个介于0和1之间(包括0但不包括1)的随机数。", a: "返回一个介于0和1之间(包括0但不包括1)的随机数。", m: [0, 0], p: [] }, { n: "COUNTUNIQUE", t: 0, d: "计算一列指定值和范围中不重复数值的个数。", a: "计算一列指定值和范围中不重复数值的个数。", m: [1, 255], p: [{ name: "值1", detail: "要检查其是否唯一的第一个值或范围。", example: "A1:C100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可选] - 要检查是否唯一的其他值或范围。", example: "1", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DEGREES", t: 0, d: "将以弧度表示的角度值转换为度。", a: "将以弧度表示的角度值转换为度。", m: [1, 1], p: [{ name: "角度", detail: "要从弧度转换为度的角度。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ERFC", t: 9, d: "返回数值的互补高斯误差函数。", a: "返回数值的互补高斯误差函数。", m: [1, 1], p: [{ name: "z", detail: "要为其计算互补高斯误差函数的数值。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EVEN", t: 0, d: "将数值向上取整为最接近的偶整数。", a: "将数值向上取整为最接近的偶整数。", m: [1, 1], p: [{ name: "值", detail: "要向上取整的数值,取整值为大于此值的最接近的偶数。\n\n如果值为负数,则将其取整为绝对值大于该值的相邻负偶数。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EXP", t: 0, d: "返回欧拉数 e (~2.718) 的指定次幂。", a: "返回欧拉数 e (~2.718) 的指定次幂。", m: [1, 1], p: [{ name: "指数", detail: "指定e的自乘幂次值。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACT", t: 0, d: "返回数值的阶乘。", a: "返回数值的阶乘。", m: [1, 1], p: [{ name: "值", detail: "要计算并返回其阶乘的数字或对数字(所在单元格)的引用。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACTDOUBLE", t: 0, d: "返回数值的“双阶乘”。", a: "返回数值的“双阶乘”。", m: [1, 1], p: [{ name: "值", detail: "要计算并返回其双阶乘的数字或对数字(所在单元格)的引用。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PI", t: 0, d: "返回带有14位小数的 PI 值。", a: "返回带有14位小数的 PI 值。", m: [0, 0], p: [] }, { n: "FLOOR", t: 0, d: "将数值向下取整为指定因数的最接近的整数倍。", a: "将数值向下取整为指定因数的最接近的整数倍。", m: [2, 2], p: [{ name: "值", detail: "要向下舍入为因数的最接近整数倍的数值。", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "因数", detail: "要将值舍入到此数的整数倍。\n\n因数不得为0。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GCD", t: 0, d: "返回一个或多个整数的最大公约数。", a: "返回一个或多个整数的最大公约数。", m: [1, 255], p: [{ name: "值1", detail: "要在查找最大公约数的计算中检查其因数的第一项数值或范围。", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可选] - 在求最大公约数时要考虑其因数的其他数值或范围。", example: "96", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANDBETWEEN", t: 0, d: "返回介于两个整数之间(包括这两个整数)的随机数。", a: "返回介于两个整数之间(包括这两个整数)的随机数。", m: [2, 2], p: [{ name: "下界", detail: "随机值范围的下界。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "上界", detail: "随机值范围的上界。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUND", t: 0, d: "将数字四舍五入到指定的位数。", a: "将数字四舍五入到指定的位数。", m: [2, 2], p: [{ name: "值", detail: "要四舍五入的数字。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位数", detail: "要进行四舍五入运算的位数。\n\n位数可以取负值,在这种情况下会将值的小数点左侧部分舍入到指定的位数。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDDOWN", t: 0, d: "朝着零的方向将数字进行向下舍入。", a: "朝着零的方向将数字进行向下舍入。", m: [2, 2], p: [{ name: "值", detail: "需要向下舍入的任意实数。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位数", detail: "要通过舍入达到的小数位数。\n\n位数可以取负值,在这种情况下会将值的小数点左侧部分舍入到指定的位数。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDUP", t: 0, d: "朝着远离 0(零)的方向将数字进行向上舍入。", a: "朝着远离 0(零)的方向将数字进行向上舍入。", m: [2, 2], p: [{ name: "值", detail: "要将其舍入为位数位数字的值,始终向上舍入。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位数", detail: "要通过舍入达到的小数位数。\n\n位数可以取负值,在这种情况下会将值的小数点左侧部分舍入到指定的位数。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SERIESSUM", t: 0, d: "给定参数 x、n、m 和 a,返回幂级数的和 a1xn + a2x(n+m) + ... + aix(n+(i-1)m),其中 i 为范围 a 中的项数。", a: "给定参数 x、n、m 和 a", m: [4, 4], p: [{ name: "x", detail: "幂级数的输入值。随相应的近似类型而变,有可能为角度、指数或其他一些值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "在幂级数中x的初始自乘幂次。", example: "0", require: "m", repeat: "n", type: "rangenumber" }, { name: "m", detail: "x的幂次中的附加增量。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "a", detail: "包含幂级数系数的数组或范围。", example: "{FACT(0)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIGN", t: 0, d: "给定输入数值,如果为负返回-1;如果为正返回1;如果为零则返回0。", a: "给定输入数值", m: [1, 1], p: [{ name: "值", detail: "要返回其符号的数值。", example: "-42", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIN", t: 0, d: "给定角度(以弧度表示),返回其正弦值。", a: "给定角度(以弧度表示)", m: [1, 1], p: [{ name: "角度", detail: "要返回其正弦值的角度,以弧度表示。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SINH", t: 0, d: "返回给定实数的双曲正弦值。", a: "返回给定实数的双曲正弦值。", m: [1, 1], p: [{ name: "值", detail: "要计算其双曲正弦值的实数值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRT", t: 0, d: "返回一个正数的正平方根。", a: "返回一个正数的正平方根。", m: [1, 1], p: [{ name: "值", detail: "要计算其正平方根的数值。\n\n值必须为正数;如果为负,SQRT 将返回 #NUM! 错误。", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRTPI", t: 0, d: "返回 PI 与给定正数乘积的正平方根。", a: "返回 PI 与给定正数乘积的正平方根。", m: [1, 1], p: [{ name: "值", detail: "要将其与 PI 相乘并返回该乘积的平方根的数值\n\n值必须为正数;如果为负数,SQRTPI 将返回 #NUM! 错误。", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GAMMALN", t: 1, d: "返回指定伽玛函数的以 e(欧拉数)为底的对数。", a: "返回指定伽玛函数的以 e(欧拉数)为底的对数。", m: [1, 1], p: [{ name: "值", detail: "伽玛函数的输入值。返回的将是伽玛 (值) 的自然对数。\n\n值必须为正数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COS", t: 0, d: "返回给定角度的余弦值(角度以弧度表示)。", a: "返回给定角度的余弦值(角度以弧度表示)。", m: [1, 1], p: [{ name: "角度", detail: "要取其余弦值的角度,以弧度表示。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRUNC", t: 0, d: "截除指定有效位之外的部分,取数据的指定有效位。", a: "截除指定有效位之外的部分", m: [1, 2], p: [{ name: "值", detail: "要截取的数据。", example: "3.141592654", require: "m", repeat: "n", type: "rangenumber" }, { name: "位数", detail: "[可选 - 默认值为0] - 小数点右侧要保留的有效位数。\n\n如果位数大于值中的有效位数,则将“值”原样返回。\n\n位数可以取负值,在这种情况下会将小数点左侧指定位数的值更改为零。小数点右侧的所有位数都会被舍弃。如果值的所有位都被更改为零,则TRUNC会返回0。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUOTIENT", t: 0, d: "返回以一个数除以另一个数所得的结果,不包含余数。", a: "返回以一个数除以另一个数所得的结果", m: [2, 2], p: [{ name: "被除数", detail: "要被除的数值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "除数", detail: "用于除其他数的数值。\n\n除数不得为0。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POWER", t: 0, d: "返回数值的指定次幂。", a: "返回数值的指定次幂。", m: [2, 2], p: [{ name: "底数", detail: "要计算其指数次幂的数值。\n\n如果底数为负,则指数必须为整数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "指数", detail: "指定底数的自乘幂次值。", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMIFS", t: 0, d: "根据多项条件返回范围之和。", a: "根据多项条件返回范围之和。", m: [3, 257], p: [{ name: "求和范围", detail: "要对其求和的范围。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "条件范围1", detail: "要在哪个范围内检查条件1。", example: " B1:B10", require: "m", repeat: "n", type: "range" }, { name: "条件1", detail: "要应用于条件范围1的模式或测试条件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "条件范围2, 条件2...", detail: "[ 可选 ] - 要检查的其他范围和条件。", example: " C1:C10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTIFS", t: 1, d: "根据多项条件返回范围中的单元格数量。", a: "根据多项条件返回范围中的单元格数量。", m: [2, 256], p: [{ name: "条件范围1", detail: "要在哪个范围内检查条件1。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "条件1", detail: "要应用于条件范围1的模式或测试条件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "条件范围2, 条件2...", detail: "[ 可选 ] - 要检查的其他范围和条件,可重复。", example: " B1:B10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PRODUCT", t: 0, d: "返回将一组数相乘所得的结果。", a: "返回将一组数相乘所得的结果。", m: [1, 255], p: [{ name: "乘数1", detail: "用于计算乘积的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "乘数2 ... 乘数30", detail: "[可选] - 要相乘的其他数值。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HARMEAN", t: 1, d: "计算数据集的调和平均值。", a: "计算数据集的调和平均值。", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HYPGEOMDIST", t: 1, d: "返回超几何分布。 如果已知样本量、总体成功次数和总体大小,则 HYPGEOM.DIST 返回样本取得已知成功次数的概率。", a: "返回超几何分布。", m: [5, 5], p: [{ name: "Sample_s", detail: "样本中成功的次数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "Number_sample", detail: "样本量。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "Population_s", detail: "总体中成功的次数。", example: "20", require: "m", repeat: "n", type: "rangenumber" }, { name: "Number_pop", detail: "总体大小。", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函数形式的逻辑值。\n\n如果 cumulative 为 TRUE(),则 HYPGEOM.DIST 返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "INTERCEPT", t: 1, d: "计算数据集的线性回归方程直线与 Y 轴的相交点 (x=0) 的 y 值。", a: "计算数据集的线性回归方程直线与 Y 轴的相交点 (x=0) 的 y 值。", m: [2, 2], p: [{ name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "KURT", t: 1, d: "计算数据集的峭度,该指标指示数据集(分布)的形态,尤其是该形态的陡峭程度。", a: "计算数据集的峭度", m: [1, 255], p: [{ name: "值1", detail: "数据集中的第一个值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LARGE", t: 1, d: "返回数据集中第 n 个最大元素,n 由用户指定。", a: "返回数据集中第 n 个最大元素", m: [2, 2], p: [{ name: "数据", detail: "包含相关数据集的数组或范围。", example: "A2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "要返回的元素的排行位置(从大到小顺序)。\n\n例如,将n设为4将使LARGE返回数据中排名第4的最大元素。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STDEVA", t: 1, d: "基于样本计算标准偏差,将文本取值为0。", a: "基于样本计算标准偏差", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2,…", detail: "[可选] - 样本中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STDEVP", t: 1, d: "基于样本总体计算标准偏差。", a: "基于样本总体计算标准偏差。", m: [1, 255], p: [{ name: "值1", detail: "数据集中的第一个值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "GEOMEAN", t: 1, d: "计算数据集的几何平均值。", a: "计算数据集的几何平均值。", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANK_EQ", t: 1, d: "返回指定值在数据集中的排名。如果相同的值在数据集中存在多项,则返回其中的最高排名。", a: "返回指定值在数据集中的排名。如果相同的值在数据集中存在多项,则返回其中的最高排名。", m: [2, 3], p: [{ name: "number", detail: "要确定其排名的值。", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "ref", detail: "包含相关数据集的数组或范围。", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "order", detail: "[可选 - 默认为按降序 (FALSE()) ] - 要按升序还是按降序考虑“data”中的值。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANK_AVG", t: 1, d: "返回指定值在数据集中的排名。如果相同的值在数据集中存在多项,则返回这些项排名的平均值。", a: "返回指定值在数据集中的排名。如果相同的值在数据集中存在多项,则返回这些项排名的平均值。", m: [2, 3], p: [{ name: "number", detail: "要确定其排名的值。", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "ref", detail: "包含相关数据集的数组或范围。", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "order", detail: "[可选 - 默认为按降序 (FALSE()) ] - 要按升序还是按降序考虑“data”中的值。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PERCENTRANK_EXC", t: 1, d: "以百分数形式返回指定值在给定数据集中的百分比排名(介于0和1之间,不包括两端值)。", a: "以百分数形式返回指定值在给定数据集中的百分比排名(介于0和1之间,不包括两端值)。", m: [2, 3], p: [{ name: "data", detail: "包含相关数据集的数组或范围。", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "x", detail: "要确定其百分比排位的值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significance", detail: "[可选 - 默认值为 3] - 要在计算中使用的有效位数。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTRANK_INC", t: 1, d: "以百分比形式返回指定值在给定数据集中的百分比排名(介于0和1之间,包括两端值)。", a: "以百分比形式返回指定值在给定数据集中的百分比排名(介于0和1之间,包括两端值)。", m: [2, 3], p: [{ name: "data", detail: "包含相关数据集的数组或范围。", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "x", detail: "要确定其百分比排位的值。", example: " A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significance", detail: "[可选 - 默认值为 3] - 要在计算中使用的有效位数。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FORECAST", t: 1, d: "基于数据集的线性回归,计算指定 x 的预期 y 值。", a: "基于数据集的线性回归", m: [3, 3], p: [{ name: "x", detail: "x轴上用于预测的值。", example: "A1", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHERINV", t: 1, d: "返回指定数值的 Fisher 逆变换。", a: "返回指定数值的 Fisher 逆变换。", m: [1, 1], p: [{ name: "y", detail: "要计算其Fisher逆变换的数值。", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHER", t: 1, d: "返回指定数值的 Fisher 变换。", a: "返回指定数值的 Fisher 变换。", m: [1, 1], p: [{ name: "x", detail: "要计算其Fisher变换的数值。", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MODE_SNGL", t: 1, d: "返回数据集中出现次数最多的值。", a: "返回数据集中出现次数最多的值。", m: [1, 255], p: [{ name: "值1", detail: "计算模式时要检查的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 在计算模式时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "WEIBULL_DIST", t: 1, d: "给定形状和尺度,返回韦伯分布函数(或韦伯累积分布函数)的值。", a: "给定形状和尺度", m: [4, 4], p: [{ name: "x", detail: "WEIBULL 分布函数的输入值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "alpha", detail: "Weibull 分布函数的形状参数。\n\nalpha 值必须大于 0。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "beta", detail: "Weibull 分布函数的尺度参数。\n\nbeta 值必须大于 0。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "TRUE() 表示使用累积分布函数,FALSE() 则表示使用概率密度函数。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "COUNT", t: 1, d: "返回数据集中数值的个数。", a: "返回数据集中数值的个数。", m: [1, 255], p: [{ name: "值1", detail: "计数时要检查的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 在计数时要检查的其他值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTA", t: 1, d: "返回数据集中值的数量。", a: "返回数据集中值的数量。", m: [1, 255], p: [{ name: "值1", detail: "计数时要检查的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 在计数时要检查的其他值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVEDEV", t: 1, d: "计算数据与数据集均值之间的偏差大小的平均值。", a: "计算数据与数据集均值之间的偏差大小的平均值。", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 样本中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "AVERAGE", t: 1, d: "返回数据集的算术平均值,对文本忽略不计。", a: "返回数据集的算术平均值", m: [1, 255], p: [{ name: "值1", detail: "计算平均值时用到的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 在计算平均值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVERAGEA", t: 1, d: "返回数据集的算术平均值。", a: "返回数据集的算术平均值。", m: [1, 255], p: [{ name: "值1", detail: "计算平均值时用到的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 在计算平均值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BINOM_DIST", t: 1, d: "返回一元二项式分布的概率。", a: "返回一元二项式分布的概率。", m: [4, 4], p: [{ name: "number_s", detail: "试验的成功次数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "trials", detail: "独立检验的次数。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一给定检验的成功概率。", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "是否使用二项式累积分布。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BINOM_INV", t: 1, d: "计算累积二项式分布大于或等于指定条件的最小值。", a: "计算累积二项式分布大于或等于指定条件的最小值。", m: [3, 3], p: [{ name: "trials", detail: "贝努利试验次数。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一次给定检验的成功概率。", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "alpha", detail: "期望的临界概率。", example: "0.8", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONFIDENCE_NORM", t: 1, d: "计算正态分布的置信区间的一半宽度。", a: "计算正态分布的置信区间的一半宽度。", m: [3, 3], p: [{ name: "alpha", detail: "用来计算置信水平的显著性水平。\n\n置信水平等于 100*(1 - alpha)%,亦即,如果 alpha 为 0.05,则置信水平为 95%。", example: "0.05", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "数据区域的总体标准偏差。", example: "1.6", require: "m", repeat: "n", type: "rangenumber" }, { name: "size", detail: "样本总量的大小。", example: "250", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CORREL", t: 1, d: "计算给定数据集的皮尔逊积矩相关系数 r。", a: "计算给定数据集的皮尔逊积矩相关系数 r。", m: [2, 2], p: [{ name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_P", t: 1, d: "计算数据集的总体协方差。", a: "计算数据集的总体协方差。", m: [2, 2], p: [{ name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_S", t: 1, d: "计算数据集的样本协方差。", a: "计算数据集的样本协方差。", m: [2, 2], p: [{ name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DEVSQ", t: 1, d: "基于样本计算其偏差的平方和。", a: "基于样本计算其偏差的平方和。", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 样本中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "EXPON_DIST", t: 1, d: "返回带有指定 Lambda 和指定值的指数分布函数的值。", a: "返回带有指定 Lambda 和指定值的指数分布函数的值。", m: [3, 3], p: [{ name: "x", detail: "指数分布函数的输入值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "lambda", detail: "用于指定指数分布函数的 lambda 值。", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "是否使用指数累积分布。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIF", t: 1, d: "根据条件返回范围的平均值。", a: "根据条件返回范围的平均值。", m: [2, 3], p: [{ name: "criteria_range", detail: "要对其检查 criterion 的范围。", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion", detail: '要应用于 criteria_range 的模式或测试条件。\n\n等于:"文本" 或 1 或 "=文本" 或 "=1"\n\n大于:">1"\n\n大于等于:">=1"\n\n小于:"<1"\n\n小于等于:"<=1"\n\n不等于:"<>1"或"<>文本"', example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "average_range", detail: "[可选] - 要计算平均值的范围。如果未提供此参数,则改用 criteria_range 来计算平均值。", example: "B1:B10", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIFS", t: 1, d: "根据多项条件返回范围的平均值。", a: "根据多项条件返回范围的平均值。", m: [2, 255], p: [{ name: "average_range", detail: "要计算平均值的范围。", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range1", detail: "要对其检查 criterion1 的范围。", example: " B1:B10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion1", detail: "要应用于 criteria_range1 的模式或测试条件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2, criterion2, ...", detail: "[可选] - 要检查的其他范围和条件。", example: " C1:C10", require: "m", repeat: "n", type: "rangeall" }] }, { n: "PERMUT", t: 1, d: "返回可从数字对象中选择的给定数目对象的排列数。", a: "返回可从数字对象中选择的给定数目对象的排列数。", m: [2, 2], p: [{ name: "number", detail: "表示对象个数的整数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_chosen", detail: "表示每个排列中对象个数的整数。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRIMMEAN", t: 1, d: "在排除数据集高低两端的部分数据之后计算所得的均值。", a: "在排除数据集高低两端的部分数据之后计算所得的均值。", m: [2, 2], p: [{ name: "数据", detail: "包含相关数据集的数组或范围。", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "排除比例", detail: "要从数据集的极值部分排除的数据占数据集的比例。\n\n排除比例必须大于等于0且小于1。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_EXC", t: 1, d: "返回数组的 K 百分点值,K 介于 0 到 1 之间,不含 0 与 1。", a: "返回数组的 K 百分点值,K 介于 0 到 1 之间,不含 0 与 1。", m: [2, 2], p: [{ name: "array", detail: "定义相对位置的数组或数据区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "0 到 1 之间的百分点值,不包含 0 和 1。", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_INC", t: 1, d: "返回数组的 K 百分点值,K 介于 0 到 1 之间,包含 0 与 1。", a: "返回数组的 K 百分点值,K 介于 0 到 1 之间,包含 0 与 1。", m: [2, 2], p: [{ name: "array", detail: "定义相对位置的数组或数据区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "0 到 1 之间的百分点值,包含 0 和 1。", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PEARSON", t: 1, d: "返回皮尔生(Pearson)乘积矩相关系数 r。", a: "返回皮尔生(Pearson)乘积矩相关系数 r。", m: [2, 2], p: [{ name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_INV", t: 1, d: "返回标准正态累积分布函数的反函数值。 该分布的平均值为 0,标准偏差为 1。", a: "返回标准正态累积分布函数的反函数值。 该分布的平均值为 0,标准偏差为 1。", m: [1, 1], p: [{ name: "probability", detail: "对应于正态分布的概率。", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_DIST", t: 1, d: "返回标准正态分布函数(该分布的平均值为 0,标准偏差为 1)。", a: "返回标准正态分布函数(该分布的平均值为 0,标准偏差为 1)。", m: [2, 2], p: [{ name: "z", detail: "需要计算其分布的数值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函数形式的逻辑值。\n\n如果为 TRUE(),则返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NORM_INV", t: 1, d: "返回指定平均值和标准偏差的正态累积分布函数的反函数值。", a: "返回指定平均值和标准偏差的正态累积分布函数的反函数值。", m: [3, 3], p: [{ name: "probability", detail: "对应于正态分布的概率。", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分布的算术平均值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分布的标准偏差。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_DIST", t: 1, d: "返回指定平均值和标准偏差的正态分布函数。", a: "返回指定平均值和标准偏差的正态分布函数。", m: [4, 4], p: [{ name: "x", detail: "需要计算其分布的数值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分布的算术平均值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分布的标准偏差。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函数形式的逻辑值。\n\n如果为 TRUE(),则返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NEGBINOM_DIST", t: 1, d: "返回负二项式分布。", a: "返回负二项式分布。", m: [4, 4], p: [{ name: "number_f", detail: "要模拟的失败次数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_s", detail: "要模拟的成功次数。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一次给定检验的成功概率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函数形式的逻辑值。\n\n如果为 TRUE(),则返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINA", t: 1, d: "返回数据集中的最小数值。", a: "返回数据集中的最小数值。", m: [1, 255], p: [{ name: "值1", detail: "计算最小值时所用的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可选] - 在计算最小值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MIN", t: 1, d: "返回数值数据集中的最小值。", a: "返回数值数据集中的最小值。", m: [1, 255], p: [{ name: "值1", detail: "计算最小值时所用的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可选] - 在计算最小值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MEDIAN", t: 1, d: "返回数值数据集中的中值。", a: "返回数值数据集中的中值。", m: [1, 255], p: [{ name: "值1", detail: "计算中值时所用的第一个数值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可选] - 在计算中值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAXA", t: 1, d: "返回数据集中的最大数值。", a: "返回数据集中的最大数值。", m: [1, 255], p: [{ name: "值1", detail: "计算最大值时所用的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 在计算最大值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAX", t: 1, d: "返回数值数据集中的最大值。", a: "返回数值数据集中的最大值。", m: [1, 255], p: [{ name: "值1", detail: "计算最大值时所用的第一个值或范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可选] - 在计算最大值时要考虑的其他数值或范围。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LOGNORM_INV", t: 1, d: "返回 x 的对数累积分布函数的反函数值。", a: "返回 x 的对数累积分布函数的反函数值。", m: [3, 3], p: [{ name: "probability", detail: "与对数分布相关的概率,介于 0 与 1 之间(不含 0 与 1)。", example: "0.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "ln(x) 的平均值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "ln(x) 的标准偏差,正数。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOGNORM_DIST", t: 1, d: "返回 x 的对数分布函数。", a: "返回 x 的对数分布函数。", m: [4, 4], p: [{ name: "x", detail: "用来计算函数的值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "ln(x) 的平均值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "ln(x) 的标准偏差,正数。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函数形式的逻辑值。\n\n如果为 TRUE(),则返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "Z_TEST", t: 1, d: "返回 z 检验的单尾 P 值。", a: "返回 z 检验的单尾 P 值。", m: [2, 3], p: [{ name: "array", detail: "用来检验 x 的数组或数据区域。", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "x", detail: "要测试的值。", example: "B2", require: "m", repeat: "n", type: "rangenumber" }, { name: "sigma", detail: "[可选] - 总体(已知)标准偏差。 如果省略,则使用样本标准偏差。", example: "3", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PROB", t: 1, d: "返回区域中的数值落在指定区间内的概率。", a: "返回区域中的数值落在指定区间内的概率。", m: [3, 4], p: [{ name: "x_range", detail: "具有各自相应概率值的 x 数值区域。", example: "A3:A6", require: "m", repeat: "n", type: "range" }, { name: "prob_range", detail: "与 x_range 中的值相关联的一组概率值。", example: "2", require: "m", repeat: "n", type: "range" }, { name: "lower_limit", detail: "要计算其概率的数值下界。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "upper_limit", detail: "[可选 - 默认值为下界] - 要计算其概率的可选数值上界。\n\n如果省略上界,PROB则计算随机选取相应值的次数恰好等于下界的概率。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_EXC", t: 1, d: "基于 0 到 1 之间(不包括 0 和 1)的百分点值返回数据集的四分位数。", a: "基于 0 到 1 之间(不包括 0 和 1)的百分点值返回数据集的四分位数。", m: [2, 2], p: [{ name: "array", detail: "要求得四分位数值的数组或数字型单元格区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quart", detail: "要返回第几个四分位值。\n\n1返回数据中最靠近第一个四分位值的值(25%标记)。\n\n2返回数据中最接近中值的值(50%标记)。\n\n3返回数据中最接近第三个四分位值的值(75%标记)。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_INC", t: 1, d: "根据 0 到 1 之间的百分点值(包含 0 和 1)返回数据集的四分位数。", a: "根据 0 到 1 之间的百分点值(包含 0 和 1)返回数据集的四分位数。", m: [2, 2], p: [{ name: "array", detail: "要求得四分位数值的数组或数字型单元格区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quart", detail: "要返回第几个四分位值。\n\n0返回数据中的最小值(0%标记)。\n\n1返回数据中最靠近第一个四分位值的值(25%标记)。\n\n2返回数据中最接近中值的值(50%标记)。\n\n3返回数据中最接近第三个四分位值的值(75%标记)。\n\n4返回数据中的最大值(100%标记)。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POISSON_DIST", t: 1, d: "返回泊松分布。", a: "返回泊松分布。", m: [3, 3], p: [{ name: "x", detail: "事件数。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "期望值。非负数", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "一逻辑值,确定所返回的概率分布的形式。\n\n如果为 TRUE(),则返回发生的随机事件数在零(含零)和 x(含 x)之间的累积泊松概率;\n\n如果为 FALSE(),则返回发生的事件数正好是 x 的泊松概率密度函数。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "RSQ", t: 1, d: "返回皮尔生(Pearson)乘积矩相关系数 r 的平方。", a: "返回皮尔生(Pearson)乘积矩相关系数 r 的平方。", m: [2, 2], p: [{ name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST", t: 1, d: "返回学生的左尾 t 分布。", a: "返回学生的左尾 t 分布。", m: [3, 3], p: [{ name: "x", detail: "T-分布函数的输入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度数值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "决定函数形式的逻辑值。\n\n如果 cumulative 为 TRUE(),则 HYPGEOM.DIST 返回累积分布函数;\n\n如果为 FALSE(),则返回概率密度函数。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "T_DIST_2T", t: 1, d: "返回学生的双尾 t 分布。", a: "返回学生的双尾 t 分布。", m: [2, 2], p: [{ name: "x", detail: "T-分布函数的输入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度数值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST_RT", t: 1, d: "返回学生的右尾 t 分布。", a: "返回学生的右尾 t 分布。", m: [2, 2], p: [{ name: "x", detail: "T-分布函数的输入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度数值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV", t: 1, d: "返回学生的 t 分布的左尾反函数。", a: "返回学生的 t 分布的左尾反函数。", m: [2, 2], p: [{ name: "probability", detail: "与学生的 t 分布相关的概率。\n\n必须大于 0 且小于 1。", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "deg_freedom", detail: "自由度数值。\n\n如果所提供的参数不是整数,将截取其整数部分。\n\n必须大于等于 1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV_2T", t: 1, d: "返回学生 t 分布的双尾反函数。", a: "返回学生 t 分布的双尾反函数。", m: [2, 2], p: [{ name: "probability", detail: "与学生的 t 分布相关的概率。\n\n必须大于 0 且小于1。", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "deg_freedom", detail: "自由度数值。\n\n如果所提供的参数不是整数,将截取其整数部分。\n\n必须大于等于 1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_TEST", t: 1, d: "返回与t-检验相关的概率。用于判断两个样本是否可能是出自平均值相同的两个样本总体。", a: "返回与t-检验相关的概率。用于判断两个样本是否可能是出自平均值相同的两个样本总体。", m: [4, 4], p: [{ name: "array1", detail: "将用于 t 检验的第一个数据样本或第一组单元格。", example: "A1:A4", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "将用于 t 检验的第二个数据样本或第二组单元格。", example: "B1:B4", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "指定分布的尾数。\n\n如果为 1:使用单尾分布。\n\n如果为 2:使用双尾分布。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定 t 检验的类型。\n\n如果为 1:执行配对检验。\n\n如果为 2:执行双样本等方差(同方差)检验。\n\n如果为3:执行双样本不等方差(异方差)检验。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "F_DIST", t: 1, d: "给定输入值 x,计算两个数据集的左尾 F 概率分布(差异程度)。此分布也称为 Fisher-Snedecor 分布或 Snedecor F 分布。", a: "给定输入值 x", m: [4, 4], p: [{ name: "x", detail: "用来计算函数的值。", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "分子自由度。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "分母自由度。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "用于确定函数形式的逻辑值。默认值为 FALSE。\n\n如果为 TRUE()F.DIST 将返回累积分布函数值。\n\n如果为 FALSE():F.DIST 将返回概率密度函数值。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "F_DIST_RT", t: 1, d: "给定输入x,计算两个数据集的右尾F概率分布(差异程度)。 此分布也称为Fisher-Snedecor分布或Snedecor F分布。", a: "给定输入x", m: [3, 3], p: [{ name: "x", detail: "用来计算函数的值。", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "分子自由度。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "分母自由度。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "VAR_P", t: 1, d: "基于样本总体计算方差。", a: "基于样本总体计算方差。", m: [1, 255], p: [{ name: "值1", detail: "数据集中的第一个值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, …", detail: "[可选] - 数据集中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VAR_S", t: 1, d: "基于样本计算方差。", a: "基于样本计算方差。", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, …", detail: "[可选] - 样本中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARA", t: 1, d: "基于样本计算方差,将文本取值为0。", a: "基于样本计算方差", m: [1, 255], p: [{ name: "value1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2, ...", detail: "[可选] - 样本中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARPA", t: 1, d: "基于样本总体计算方差,将文本取值为0。", a: "基于样本总体计算方差", m: [1, 255], p: [{ name: "值1", detail: "样本中的第一项值或范围。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他数值或范围。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STEYX", t: 1, d: "返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差。", a: "返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差。", m: [2, 2], p: [{ name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STANDARDIZE", t: 1, d: "给定分布的均值和标准偏差,计算一个随机变量正态化的相应值。", a: "给定分布的均值和标准偏差,计算一个随机变量正态化的相应值。", m: [3, 3], p: [{ name: "x", detail: "要正态化的随机变量值。", example: "96", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分布的均值。", example: "80", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分布的标准偏差。", example: "6.7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SMALL", t: 1, d: "返回数据集中的第 k 个最小值。", a: "返回数据集中的第 k 个最小值。", m: [2, 2], p: [{ name: "array", detail: "需要找到第 k 个最小值的数组或数值数据区域。", example: "A2:B100", require: "m", repeat: "n", type: "range" }, { name: "k", detail: "要返回的数据在数组或数据区域里的位置(从小到大)。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SLOPE", t: 1, d: "计算通过数据集的线性回归得到的直线的斜率。", a: "计算通过数据集的线性回归得到的直线的斜率。", m: [2, 2], p: [{ name: "数据_y", detail: "代表因变量数据数组或矩阵的范围。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "数据_x", detail: "代表自变量数据数组或矩阵的范围。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SKEW", t: 1, d: "返回分布的偏斜度。 偏斜度表明分布相对于平均值的不对称程度。 正偏斜度表明分布的不对称尾部趋向于更多正值。 负偏斜度表明分布的不对称尾部趋向于更多负值。", a: "返回分布的偏斜度。", m: [1, 255], p: [{ name: "值1", detail: "数据集中的第一个值或范围。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SKEW_P", t: 1, d: "返回基于样本总体的分布不对称度:表明分布相对于平均值的不对称程度。", a: "返回基于样本总体的分布不对称度:表明分布相对于平均值的不对称程度。", m: [1, 255], p: [{ name: "值1", detail: "数据集中的第一个值或范围。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可选] - 数据集中包含的其他值或范围。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "VLOOKUP", t: 2, d: "纵向查找。在范围的第一列中自上而下搜索某个键值,并返回所找到的行中指定单元格的值。", a: "纵向查找。在范围的第一列中自上而下搜索某个键值", m: [3, 4], p: [{ name: "搜索键值", detail: '要搜索的值,如 42、"Cats" 或 I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "范围", detail: "要进行搜索的范围。VLOOKUP 将在该范围的第一列中搜索搜索键值中指定的键值。", example: "A2:B26", require: "m", repeat: "n", type: "rangeall" }, { name: "索引", detail: "要返回的值的列索引,范围中的第一列编号为 1。\n\n如果索引不是介于 1 和范围中的列数之间,将返回 #VALUE! 。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "已排序", detail: "[默认值为 TRUE() ] - 指示要搜索的列(指定范围的第一列)是否已排序。大多数情况下,建议设为 FALSE()。\n\n建议将已排序设为 FALSE。如果设为 FALSE,将返回完全匹配项。如果存在多个匹配值,将返回找到的第一个值对应的单元格的内容,如果找不到匹配值,则返回 #N/A。\n\n如果将已排序设为 TRUE 或省略,将返回(小于或等于搜索键值的)最接近的匹配项。如果搜索的列中所有的值均大于搜索键值,则返回 #N/A。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "HLOOKUP", t: 2, d: "横向查找。在范围的第一行中搜索某个键值,并返回所找到的列中指定单元格的值。", a: "横向查找。在范围的第一行中搜索某个键值", m: [3, 4], p: [{ name: "搜索键值", detail: '要搜索的值。例如,42、"Cats"或I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "范围", detail: "要进行搜索的范围。将在该范围的第一行中搜索在搜索键值中指定的键值。", example: "A2:Z6", require: "m", repeat: "n", type: "rangeall" }, { name: "索引", detail: "要返回的值的行索引,范围中的第一行编号为1。\n\n如果索引不是介于1和范围中的行数之间,将返回#VALUE!。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "已排序", detail: "[可选 - 默认值为TRUE()] - 指示要搜索的行(指定范围的第一行)是否已排序。\n\n如果将已排序设为TRUE或省略,将返回最接近的匹配值(小于或等于搜索键值)。如果在搜索的行中所有的值均大于搜索键值,则返回#N/A。\n\n如果将已排序设为TRUE或将其省略,而范围的首行并非处于已排序状态,则返回值可能会是错误的。\n\n如果将已排序设为FALSE,则仅返回完全匹配。如果存在多个匹配值,将返回与找到的第一个值对应的单元格的内容,如果找不到匹配值则返回#N/A。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOOKUP", t: 2, d: "在行或列中查找相应键,并将相应单元格的值返回到与搜索行或列所在位置相同的结果范围中。", a: "在行或列中查找相应键", m: [2, 3], p: [{ name: "搜索键值", detail: '要在行或列中搜索的值。例如,42、"Cats" 或 I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "搜索范围 | 搜索结果数组", detail: "使用 LOOKUP 的一种方法是给定单行或单列形式的搜索范围进行搜索查找,这种方式要用到另一个参数结果范围。另一种方式是将这两个参数合并为一个搜索结果数组,其中第一行或第一列用于搜索,并将返回值放在该数组的最后一行或最后一列中。", example: "A1:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "结果范围", detail: "[ 可选 ] - 用于存放返回结果的范围。返回值对应于在搜索范围中找到搜索键值的位置。此范围必须仅为单行或单列,而如果您使用的是搜索结果数组方式,则不应提供此参数。", example: "B1:B100", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ADDRESS", t: 2, d: "返回字符串形式的单元格引用。", a: "返回字符串形式的单元格引用。", m: [2, 5], p: [{ name: "row_num", detail: "一个数值,指定要在单元格引用中使用的行号。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "column_num", detail: "一个数值,指定要在单元格引用中使用的列号(而非名称)。A列的编号为1。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "abs_num", detail: "[可选 - 默认值为1] - 一个数值,指定要返回的引用类型。\n\n1 表示行列均采用绝对值(例如$A$1);\n\n2 表示采用绝对行号,相对列标(例如A$1);\n\n3 表示采用相对行号,绝对列标(例如$A1);\n\n4 表示行列均采用相对值(例如A1)。", example: "4", require: "o", repeat: "n", type: "rangenumber" }, { name: "A1", detail: "[可选 - 默认值为TRUE()] - 一个布尔值,指示采用A1标记形式(TRUE)还是R1C1标记形式(FALSE)。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }, { name: "sheet_text", detail: "[可选 - 默认缺省] - 用于指定地址所指向的工作表名称。", example: '"Sheet2"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "INDIRECT", t: 2, d: "返回以字符串指定的单元格引用。", a: "返回以字符串指定的单元格引用。", m: [1, 2], p: [{ name: "ref_text", detail: "以带引号的字符串形式提供的单元格引用。", example: '"Sheet2!"&B10', require: "m", repeat: "n", type: "rangeall" }, { name: "A1", detail: "[可选 - 默认值为TRUE()] - 一个布尔值,指示采用A1标记形式(TRUE)还是R1C1标记形式(FALSE)。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROW", t: 2, d: "返回指定单元格的行号", a: "返回指定单元格的行号", m: [0, 1], p: [{ name: "reference", detail: "[可选 - 默认为此公式所在的单元格] - 要返回其行号的单元格。\n\n如果单元格引用指向的范围其宽度大于一个单元格,而此公式不是用作数组公式的,这时会仅返回单元格引用中首行的编号值。", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROWS", t: 2, d: "返回指定数组或范围中的行数。", a: "返回指定数组或范围中的行数。", m: [1, 1], p: [{ name: "array", detail: "要返回其行数的范围。", example: "A9:A62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COLUMN", t: 2, d: "按照 `A=1` 的规则返回指定单元格的列号。", a: "按照 `A=1` 的规则返回指定单元格的列号。", m: [0, 1], p: [{ name: "reference", detail: "[可选 - 默认为包含此公式的单元格] - 要返回其列号的单元格。A列对应的编号为1。\n\n如果单元格引用是宽度超过一个单元格的范围,而此公式不是作为数组公式来使用的,因此将返回单元格引用中的第一列的位置。", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNS", t: 2, d: "返回指定数组或范围中的列数。", a: "返回指定数组或范围中的列数。", m: [1, 1], p: [{ name: "array", detail: "要返回其列数的范围。", example: "A9:W62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "OFFSET", t: 2, d: "给定某范围的起始单元格引用以及该范围涵盖的行列数量,返回该范围的引用。", a: "给定某范围的起始单元格引用以及该范围涵盖的行列数量,返回该范围的引用。", m: [3, 5], p: [{ name: "reference", detail: "用于计算行列偏移量的起点。", example: "A2", require: "m", repeat: "n", type: "range" }, { name: "rows", detail: "要偏移的行数。\n\n行偏移量必须是整数,但也可以是负数。如果提供的参数带有小数,小数部分将被截去。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "要偏移的列数。\n\n列偏移量必须是整数,但也可以是负数。如果提供的参数带有小数,小数部分将被截去。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "height", detail: "[可选] - 要从偏移目标开始返回的范围的高度。", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "width", detail: "[可选] - 要从偏移目标开始返回的范围的宽度。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MATCH", t: 2, d: "在单元格中搜索指定项,然后返回该项在单元格区域中的相对位置。", a: "在单元格中搜索指定项,然后返回该项在单元格区域中的相对位置。", m: [2, 3], p: [{ name: "lookup_value", detail: "要在 lookup_array 中匹配的值。", example: '"Sunday"', require: "m", repeat: "n", type: "rangeall" }, { name: "lookup_array", detail: "要搜索的单元格区域。\n\n如果所用的范围的高度和宽度均大于1,MATCH将返回#N/A!。", example: "A2:A9", require: "m", repeat: "n", type: "range" }, { name: "match_type", detail: "[可选 - 默认值为1] - 要采用的搜索方式。\n\n1为默认类型,此时MATCH会假设范围已按升序排序,并返回小于等于搜索键值的最大值。\n\n0表示完全匹配,在范围未排序的情况下需要使用此方式。\n\n-1让MATCH假设范围是按降序排序的,并返回大于等于搜索键值的最小值。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INDEX", t: 2, d: "返回表格或中的元素值,此元素由行号和列号的索引值给定。", a: "返回表格或中的元素值,此元素由行号和列号的索引值给定。", m: [2, 3], p: [{ name: "array", detail: "单元格区域或数组常量。", example: "A1:C20", require: "m", repeat: "n", type: "range" }, { name: "row_num", detail: "选择数组中的某行,函数从该行返回数值。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "column_num", detail: "选择数组中的某列,函数从该列返回数值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GETPIVOTDATA", t: 2, d: "从与指定行和列标题对应的数据透视表中提取汇总值。", a: "从与指定行和列标题对应的数据透视表中提取汇总值。", m: [2, 254], p: [{ name: "data_field", detail: "您想从数据透视表中获取其数据的值名称。\n值名称必须括在引号中或是指向包含相关文本的任何单元格的引用。\n如果有多个值字段,则必须使用数据透视表中显示的确切名称(如“销售总额”)。", example: '"SUM of number of units"', require: "m", repeat: "n", type: "rangeall" }, { name: "pivot_table", detail: "目标数据透视表中的任何单元格的引用(推荐位于顶角的单元格)。", example: "'Pivot table'!A1", require: "m", repeat: "n", type: "rangeall" }, { name: "field1", detail: "[可选] - 源数据集(不是数据透视表)中列的名称。", example: '"division"', require: "o", repeat: "y", type: "rangeall" }, { name: "item1", detail: "[可选] - 数据透视表中显示的与您要检索的字段名称 1 相对应的行或列的名称。", example: '"east"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CHOOSE", t: 2, d: "基于索引返回选项列表中的元素。", a: "基于索引返回选项列表中的元素。", m: [2, 255], p: [{ name: "index_num", detail: "指定要返回哪一项。\n\n如果索引为零、负值或大于提供的选择数量,将返回#VALUE!错误。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value1", detail: "一项可能的返回值。必须提供。可以是单元格引用或单独的值。", example: '"A"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "[可选] - 其他可以选择的值。选择", example: '"B"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "HYPERLINK", t: 2, d: "在单元格内创建一个超链接。", a: "在单元格内创建一个超链接。", p: [{ name: "网址", detail: "以引号括住的链接位置的完整网址,或对包含这种网址的单元格的引用。\n\n仅允许某些链接类型。其中包括:http://、https://、mailto:、aim:、ftp://、gopher://、telnet://和news://,明确禁用使用其他协议。如果指定的是其他协议,将会在单元格中显示链接标签,但该标签不会以链接形式呈现。\n\n如果未指定协议,则假设使用http://,并将其作为网址的前缀。", example: '"http://www.google.com/"', require: "m", repeat: "n", type: "rangeall" }, { name: "链接标签", detail: '[可选 - 默认为网址] - 要在单元格中作为链接显示的文本(用引号括起来的),或者指向包含这种标签的单元格的引用。\n\n如果链接标签是指向某个空单元格的引用,如果网址有效,就将其作为链接显示,否则作为纯文本显示。\n\n如果链接标签为空字符串常量(""),所在单元格显示的内容将为空白,但通过点击该单元格或转入该单元格仍然可以访问链接。', example: '"Google"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TIME", t: 6, d: "将给定的小时、分钟和秒转换为时间。", a: "将给定的小时、分钟和秒转换为时间。", m: [3, 3], p: [{ name: "小时", detail: "0(零)到 32767 之间的数字,代表小时。\n\n任何大于 23 的值都会除以 24,余数将作为小时值。", example: "11", require: "m", repeat: "n", type: "rangenumber" }, { name: "分钟", detail: "0(零)到 32767 之间的数字,代表分钟。\n\n任何大于 59 的值将转换为小时和分钟。", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "秒", detail: "0(零)到 32767 之间的数字,代表秒。\n\n任何大于 59 的值将转换为小时、分钟和秒。", example: "59", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TIMEVALUE", t: 6, d: "按一天24小时返回该时间的分数表示。", a: "按一天24小时返回该时间的分数表示。", m: [1, 1], p: [{ name: "time_text", detail: "用于表示时间的字符串。", example: '"2:15 PM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EOMONTH", t: 6, d: "返回某个月份最后一天的序列号,该月份在另一个日期之前或之后的数个月(月数由参数指定)。", a: "返回某个月份最后一天的序列号", m: [2, 2], p: [{ name: "start_date", detail: "用于计算结果的参照日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "用于计算的起始日期之前(负)或之后(正)的月数。返回的是计算所得月份的最后那天。", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EDATE", t: 6, d: "返回表示某个日期的序列号,该日期在另一个日期的数月之前/之后。", a: "返回表示某个日期的序列号", m: [2, 2], p: [{ name: "start_date", detail: "用于计算结果的参照日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "用于计算的起始日期之前(负)或之后(正)的月数。", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SECOND", t: 6, d: "返回时间值的秒数。 秒数是 0(零)到 59 范围内的整数。", a: "返回时间值的秒数。 秒数是 0(零)到 59 范围内的整数。", m: [1, 1], p: [{ name: "时间", detail: "用于计算秒钟部分的时间。必须为以下值之一:指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINUTE", t: 6, d: "以数字格式返回特定时间的分钟部分。", a: "以数字格式返回特定时间的分钟部分。", m: [1, 1], p: [{ name: "时间", detail: "用于计算分钟部分的时间。必须为以下值之一:指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "HOUR", t: 6, d: "以数字格式返回特定时间的小时部分。", a: "以数字格式返回特定时间的小时部分。", m: [1, 1], p: [{ name: "时间", detail: "用于计算小时部分的时间。必须为以下值之一:指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOW", t: 6, d: "以日期值格式返回当前日期和时间。", a: "以日期值格式返回当前日期和时间。", m: [0, 0], p: [] }, { n: "NETWORKDAYS", t: 6, d: "返回所提供的两个日期之间的净工作日天数。", a: "返回所提供的两个日期之间的净工作日天数。", m: [2, 3], p: [{ name: "start_date", detail: "用于计算净工作日天数的时间段开始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "用于计算净工作日天数的时间段结束日期。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[可选] - 一个范围或数组常量,其中包含作为节假日的日期序号。\n\n在节假日数组中提供的值必须是日期序号值(例如由N所返回的值)或日期值(例如由DATE、DATEVALUE或TO_DATE返回的值)。由范围指定的值应该是标准的日期值或日期序数值。", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "NETWORKDAYS_INTL", t: 6, d: "返回给定的两个日期之间的净工作日天数(排除指定的周末和节假日)。", a: "返回给定的两个日期之间的净工作日天数(排除指定的周末和节假日)。", m: [2, 4], p: [{ name: "start_date", detail: "用于计算净工作日天数的时间段开始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "用于计算净工作日天数的时间段结束日期。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "weekend", detail: "[可选 - 默认值为1] - 用于表示哪些天为周末的数字或字符串。\n字符串方式:可以使用由0和1组成的字符串来指定周末,串中的第一个数字字符代表周一,最后一个则代表周日。零表示这一天是工作日,1表示这一天为周末。例如,“0000011”表示将周六和周日作为周末。\n数字方式:这种方式不使用上述字符串形式,而是使用一个数字。1 =周六/周日为周末,2 =周日/周一为周末,依此类推则7 =周五/周六。11 =周日为唯一周末,12 =周一为唯一周末,依此类推则17 =周六为唯一周末。", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[ 可选 ] - 这是一个范围或数组常量,其中包含作为节假日的日期。\n在节假日数组内提供的值必须为日期序数值(例如N的返回值)或日期值(例如DATE、DATEVALUE或TO_DATE的返回值)。由范围指定的值应该是标准的日期值或日期序数值。", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ISOWEEKNUM", t: 6, d: "返回给定日期在全年中的 ISO 周数。", a: "返回给定日期在全年中的 ISO 周数。", m: [1, 1], p: [{ name: "date", detail: "用于日期和时间计算的日期-时间代码。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WEEKNUM", t: 6, d: "返回特定日期的周数。", a: "返回特定日期的周数。", m: [1, 2], p: [{ name: "serial_number", detail: "要确定其位于第几周的日期,必须是对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "return_type", detail: "[可选 - 默认值为 1 ] - 代表一周起始日的数字,系统也使用该数字来确定一年的第一周(1=周日,2=周一)。", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "WEEKDAY", t: 6, d: "返回一个数字,对应于给定日期所在的星期几。", a: "返回一个数字,对应于给定日期所在的星期几。", m: [1, 2], p: [{ name: "serial_number", detail: "要为其确定星期几的日期。必须是对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "return_type", detail: "[可选 - 默认值为 1] - 以数字指示使用哪种编号顺序来表示星期几。默认情况下,按星期日 (= 1) 开始计算。\n\n如果类型为 1,则星期值将从星期日开始算起,并且星期日的值为 1,因此星期六的值就是 7。\n\n如果类型为 2,则星期值将从星期一开始算起,并且星期一的值为 1,因此星期日的值就是 7。\n\n如果类型为 3,则星期值将从星期一算起,并且星期一的值为 0,因此星期日的值就是 6。", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DAY", t: 6, d: "以数字格式返回特定日期所在的当月几号。", a: "以数字格式返回特定日期所在的当月几号。", m: [1, 1], p: [{ name: "serial_number", detail: "要从中提取具体几号的日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS", t: 6, d: "返回两个日期之间的天数。", a: "返回两个日期之间的天数。", m: [2, 2], p: [{ name: "end_date", detail: "计算中要使用的结束日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "2011-3-15", require: "m", repeat: "n", type: "rangeall" }, { name: "start_date", detail: "计算中要使用的开始日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "2011-2-1", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS360", t: 6, d: "按照每年360天,返回两个日期之间的差(用于计算利息)。", a: "按照每年360天,返回两个日期之间的差(用于计算利息)。", m: [2, 3], p: [{ name: "start_date", detail: "计算中要使用的开始日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "计算中要使用的结束日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "method", detail: "[可选 - 默认为FALSE()] - 指示要使用哪种天数计算方法。\n\nFALSE - 采用美国 (NASD) 方法时,如果起始日期为某月的最后一天,为便于计算,会将起始日期的当月几号更改为30。此外,如果结束日期是所在月份的最后一天,而且起始日期在其所在月的30号之前,则将结束日期更改为结束日期之后那个月的第一天,否则将结束日期更改为该月的30号。\n\nTRUE - 采用欧洲方法时,会将所有日期在31号的起始日期或结束日期更改为当月的30号。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DATE", t: 6, d: "将提供的年、月、日转换为日期。", a: "将提供的年、月、日转换为日期。", m: [3, 3], p: [{ name: "year", detail: "日期的年份部分,包含一到四位数字。\n\n介于 0(零)到 1899 之间,会将该值与 1900 相加来计算年份;\n\n介于 1900 到 9999 之间,将使用该数值作为年份;\n\n小于 0 或大于等于 10000,返回 错误值 #NUM!。", example: "1969", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "日期的月份部分,一个正整数或负整数。\n\n如果 month 大于 12,则 month 会将该月份数与指定年中的第一个月相加。\n\n如果 month 小于 1,month 则从指定年份的一月份开始递减该月份数,然后再加上 1 个月。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "day", detail: "日期的日部分,一个正整数或负整数。\n\n如果 day 大于月中指定的天数,则 day 会将天数与该月中的第一天相加。\n\n如果 day 小于 1,则 day 从指定月份的第一天开始递减该天数,然后再加上 1 天。", example: "20", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DATEVALUE", t: 6, d: "将提供的日期字符串转换为日期的序列号。", a: "将提供的日期字符串转换为日期的序列号。", m: [1, 1], p: [{ name: "date_text", detail: "表示日期的字符串。", example: '"1969-7-20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DATEDIF", t: 6, d: "计算两个日期之间的天数、月数或年数。", a: "计算两个日期之间的天数、月数或年数。", m: [3, 3], p: [{ name: "起始日期", detail: "计算中要使用的开始日期。必须是对包含DATE值的单元格的引用、返回DATE类型的函数或数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "结束日期", detail: "计算中要使用的结束日期。必须是对包含DATE值的单元格的引用、返回DATE类型的函数或数字。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "单位", detail: '时间单位的缩写文字。例如 "M" 代表月。有效值包括:"Y"、"M"、"D"、"MD"、"YM" 和 "YD"。\n\n"Y":返回起始日期和结束日期之间的整年数。\n\n"M":返回起始日期和结束日期之间的整月数。\n\n"D":返回起始日期和结束日期之间的天数。\n\n"MD":返回起始日期和结束日期之间的天数(不计整月数)。\n\n"YM":返回起始日期和结束日期之间的整月数(不计整年数)。\n\n"YD":返回起始日期和结束日期之间的天数(假设起始日期和结束日期的间隔不超过一年)。', example: "16)", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY", t: 6, d: "指定工作日天数,计算结束日期。", a: "指定工作日天数,计算结束日期。", m: [2, 3], p: [{ name: "start_date", detail: "计算的开始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "days", detail: "start_date 之前或之后不含周末及节假日的天数。\n\n为正值将生成未来日期;\n\n为负值生成过去日期。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "holidays", detail: "[可选] - 一个范围或数组常量,其中包含作为节假日的日期序号。\n\n在节假日数组中提供的值必须是日期序号值(例如由N所返回的值)或日期值(例如由DATE、DATEVALUE或TO_DATE返回的值)。由范围指定的值应该是标准的日期值或日期序数值。", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY_INTL", t: 6, d: "返回指定的若干个工作日之前或之后的日期的序列号(使用自定义周末参数)。 ", a: "返回指定的若干个工作日之前或之后的日期的序列号(使用自定义周末参数)。 ", m: [2, 4], p: [{ name: "start_date", detail: "开始日期(将被截尾取整)。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "days", detail: "start_date 之前或之后的工作日的天数。\n\n正值表示未来日期;\n\n负值表示过去日期;\n\n零值表示开始日期。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "weekend", detail: "[可选 - 默认值为1] - 用于表示哪些天为周末的数字或字符串。\n字符串方式:可以使用由0和1组成的字符串来指定周末,串中的第一个数字字符代表周一,最后一个则代表周日。零表示这一天是工作日,1表示这一天为周末。例如,“0000011”表示将周六和周日作为周末。\n数字方式:这种方式不使用上述字符串形式,而是使用一个数字。1 =周六/周日为周末,2 =周日/周一为周末,依此类推则7 =周五/周六。11 =周日为唯一周末,12 =周一为唯一周末,依此类推则17 =周六为唯一周末。", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[ 可选 ] - 这是一个范围或数组常量,其中包含作为节假日的日期。\n在节假日数组内提供的值必须为日期序数值(例如N的返回值)或日期值(例如DATE、DATEVALUE或TO_DATE的返回值)。由范围指定的值应该是标准的日期值或日期序数值。", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "YEAR", t: 6, d: "返回对应于某个日期的年份。 Year 作为 1900 - 9999 之间的整数返回。", a: "返回对应于某个日期的年份。 Year 作为 1900 - 9999 之间的整数返回。", m: [1, 1], p: [{ name: "serial_number", detail: "用于计算年份的日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "YEARFRAC", t: 6, d: "返回 start_date 和 end_date 之间的天数占全年天数的百分比。", a: "返回 start_date 和 end_date 之间的天数占全年天数的百分比。", m: [2, 3], p: [{ name: "start_date", detail: "计算中要使用的开始日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "计算中要使用的结束日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "basis", detail: "[可选 - 默认为0] - 要使用的日计数基准类型。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "16)", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "TODAY", t: 6, d: "以日期值格式返回当前日期。", a: "以日期值格式返回当前日期。", m: [0, 0], p: [] }, { n: "MONTH", t: 6, d: "返回日期(以序列数表示)中的月份。 月份是介于 1(一月)到 12(十二月)之间的整数。", a: "返回日期(以序列数表示)中的月份。 月份是介于 1(一月)到 12(十二月)之间的整数。", m: [1, 1], p: [{ name: "serial_number", detail: "要从中提取月份的日期。必须是以下一种:对包含日期的单元格的引用、返回日期类型的函数或者数字。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EFFECT", t: 8, d: "根据名义利率及每年的复利计息期数来计算实际年利率。", a: "根据名义利率及每年的复利计息期数来计算实际年利率。", m: [2, 2], p: [{ name: "nominal_rate", detail: "每年的名义利率。", example: "0.99", require: "m", repeat: "n", type: "rangenumber" }, { name: "npery", detail: "每年的复利计算期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLAR", t: 12, d: "将数字格式设置为与语言区域相对应的货币格式。", a: "将数字格式设置为与语言区域相对应的货币格式。", m: [1, 2], p: [{ name: "number", detail: "要设置格式的值。", example: "1.2351", require: "m", repeat: "n", type: "rangenumber" }, { name: "decimals", detail: "[可选 - 默认值为 2] - 要显示的小数位数。\n\n如果这是负数,则将数字四舍五入到小数点左侧。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARDE", t: 8, d: "将以整数部分和分数部分转换为以小数部分表示的金额数字", a: "将以整数部分和分数部分转换为以小数部分表示的金额数字", m: [2, 2], p: [{ name: "fractional_dollar", detail: "以整数部份和分数部分表示的数字,用小数点隔开。", example: "100.10", require: "m", repeat: "n", type: "rangenumber" }, { name: "fraction", detail: "用作分数中的分母的整数。", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARFR", t: 8, d: "将小数转换为分数表示的金额数字。", a: "将小数转换为分数表示的金额数字。", m: [2, 2], p: [{ name: "decimal_dollar", detail: "小数。", example: "100.125", require: "m", repeat: "n", type: "rangenumber" }, { name: "fraction", detail: "用作分数中的分母的整数。", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DB", t: 8, d: "使用固定余额递减法,返回指定期间内某项固定资产的折旧值。", a: "使用固定余额递减法,返回指定期间内某项固定资产的折旧值。", m: [4, 5], p: [{ name: "cost", detail: "资产原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折旧末尾时的值(有时也称为资产残值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "资产的折旧期数(有时也称作资产的使用寿命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限内要计算折旧的折旧期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "[可选 - 默认值为12] - 折旧第一年中的月数。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DDB", t: 8, d: "用双倍余额递减法,返回指定期间内某项固定资产的折旧值。", a: "用双倍余额递减法,返回指定期间内某项固定资产的折旧值。", m: [4, 5], p: [{ name: "cost", detail: "资产原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折旧末尾时的值(有时也称为资产残值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "资产的折旧期数(有时也称作资产的使用寿命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限内要计算折旧的折旧期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "[可选 - 默认值为2] - 折旧的递减系数。", example: "2.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RATE", t: 8, d: "返回年金每期的利率。", a: "返回年金每期的利率。", m: [3, 6], p: [{ name: "nper", detail: "年金的付款总期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "每期的付款金额,在年金周期内不能更改。", example: "-100", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值即一系列未来付款当前值的总和。", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选 - 默认值为0] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末\n\n1 表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "guess", detail: "[可选 - 默认值为0.1] - 预期利率。", example: "0.1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "CUMPRINC", t: 8, d: "基于等额分期付款和固定利率,计算投资在多个付款期内的累计本金偿还额。", a: "基于等额分期付款和固定利率,计算投资在多个付款期内的累计本金偿还额。", m: [6, 6], p: [{ name: "rate", detail: "利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "总付款期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "年金的现值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_period", detail: "开始累计计算的付款期序号。\n\n首期必须大于等于1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_period", detail: "结束累计计算的付款期序号。\n\n末期必须大于首期。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPNUM", t: 8, d: "返回在结算日和到期日之间的付息次数,向上舍入到最近的整数。", a: "返回在结算日和到期日之间的付息次数,向上舍入到最近的整数。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。到期日是有价证券有效期截止时的日期。", example: "02", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SYD", t: 8, d: "返回在指定期间内资产按年限总和折旧法计算的折旧。", a: "返回在指定期间内资产按年限总和折旧法计算的折旧。", m: [4, 4], p: [{ name: "cost", detail: "资产原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折旧末尾时的值(有时也称为资产残值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "资产的折旧期数(有时也称作资产的使用寿命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限内要计算折旧的折旧期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLEQ", t: 8, d: "基于贴现率计算美国政府短期债券的等效年化收益率。", a: "基于贴现率计算美国政府短期债券的等效年化收益率。", m: [3, 3], p: [{ name: "settlement", detail: "债券的结算日期,此日期为债券发行后交付给买家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "债券的到期或结束日期,届时可将其以面值或票面价值赎回。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "债券购买时的贴现率。", example: "2)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLYIELD", t: 8, d: "基于价格计算美国政府短期债券的收益率。", a: "基于价格计算美国政府短期债券的收益率。", m: [3, 3], p: [{ name: "settlement", detail: "债券的结算日期,此日期为债券发行后交付给买家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "债券的到期或结束日期,届时可将其以面值或票面价值赎回。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "债券的购买价格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLPRICE", t: 8, d: "基于贴现率计算美国政府短期债券的价格。", a: "基于贴现率计算美国政府短期债券的价格。", m: [3, 3], p: [{ name: "settlement", detail: "债券的结算日期,此日期为债券发行后交付给买家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "债券的到期或结束日期,届时可将其以面值或票面价值赎回。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "债券购买时的贴现率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PV", t: 8, d: "基于等额分期付款和固定利率,计算年金投资的现值。", a: "基于等额分期付款和固定利率,计算年金投资的现值。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款总期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "每期的付款金额,在年金周期内不能更改。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "D2", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ACCRINT", t: 8, d: "返回定期付息证券的应计利息。", a: "返回定期付息证券的应计利息。", m: [6, 8], p: [{ name: "issue", detail: "有价证券的发行日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "first_interest", detail: "有价证券的首次计息日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有价证券的年息票利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "par", detail: "证券的票面值。", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示““欧洲30/360”方法” - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "calc_method", detail: "[可选 - 默认为TRUE()] - 一个逻辑值,指定当结算日期晚于首次计息日期时用于计算总应计利息的方法。\n\n如果值为 TRUE,则返回从发行日到结算日的总应计利息。\n\n如果值为 FALSE,则返回从首次计息日到结算日的应计利息。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ACCRINTM", t: 8, d: "返回在到期日支付利息的有价证券的应计利息。", a: "返回在到期日支付利息的有价证券的应计利息。", m: [4, 5], p: [{ name: "issue", detail: "有价证券的发行日。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "有价证券的到期日。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有价证券的年息票利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "par", detail: "证券的票面值。", example: "1000", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYBS", t: 8, d: "返回从付息期开始到结算日的天数。", a: "返回从付息期开始到结算日的天数。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYS", t: 8, d: "返回结算日所在的付息期的天数。", a: "返回结算日所在的付息期的天数。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYSNC", t: 8, d: "返回从结算日到下一票息支付日之间的天数。", a: "返回从结算日到下一票息支付日之间的天数。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPNCD", t: 8, d: "计算结算日之后的下一票息或利息派发日期。", a: "计算结算日之后的下一票息或利息派发日期。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPPCD", t: 8, d: "计算结算日之前的最后一个票息或利息支付日。", a: "计算结算日之前的最后一个票息或利息支付日。", m: [3, 4], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FV", t: 8, d: "基于等额分期付款和固定利率,计算年金投资的未来价值。", a: "基于等额分期付款和固定利率,计算年金投资的未来价值。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款总期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "各期所应支付的金额,在整个年金期间保持不变。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "[可选 - 默认值为 0 ] - 现值,或一系列未来付款的当前值的累积和。", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为 0 ] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FVSCHEDULE", t: 8, d: "返回应用一系列复利率计算的初始本金的未来值。", a: "返回应用一系列复利率计算的初始本金的未来值。", m: [2, 2], p: [{ name: "principal", detail: "现值。", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "schedule", detail: "用于计算本金复利的一组利率。\n\n利率表必须是范围或数组,其中包含要用于计算复利的一组利率。这些利率值应该以十进制小数形式表示,或者使用UNARY_PERCENT以百分比形式表示,即表示为0.09或UNARY_PERCENT(9),而不要表示为9。", example: "A2:A100", require: "m", repeat: "n", type: "range" }] }, { n: "YIELD", t: 8, d: "返回定期支付利息的债券的收益率。", a: "返回定期支付利息的债券的收益率。", m: [6, 7], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有价证券的年息票利率。", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "pr", detail: "有价证券的价格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有价证券的清偿价值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "YIELDDISC", t: 8, d: "基于价格计算折价发行的(不带息)债券的年收益率。", a: "基于价格计算折价发行的(不带息)债券的年收益率。", m: [4, 5], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "有价证券的价格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有价证券的清偿价值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NOMINAL", t: 8, d: "基于给定的实际利率和年复利期数,返回名义年利率。", a: "基于给定的实际利率和年复利期数,返回名义年利率。", m: [2, 2], p: [{ name: "effect_rate", detail: "每年的实际利率。", example: "0.85", require: "m", repeat: "n", type: "rangenumber" }, { name: "npery", detail: "每年的复利期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "XIRR", t: 8, d: "返回一组不一定定期发生的现金流的内部收益率。", a: "返回一组不一定定期发生的现金流的内部收益率。", m: [2, 3], p: [{ name: "values", detail: "其中含有投资相关收益或支出的数组或范围。\n\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "dates", detail: "与现金流数额参数中的现金流对应的日期数组或范围。", example: "C2:C25", require: "m", repeat: "n", type: "range" }, { name: "guess", detail: "[可选 - 默认值为0.1] - 对内部回报率的估算值。", example: "250", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MIRR", t: 8, d: "返回一系列定期现金流的修改后内部收益率。", a: "返回一系列定期现金流的修改后内部收益率。", m: [3, 3], p: [{ name: "values", detail: "其中含有投资相关收益或支出的数组或范围。\n\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "finance_rate", detail: "现金流中使用的资金支付的利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "reinvest_rate", detail: "将现金流再投资的收益率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IRR", t: 8, d: "返回由值中的数字表示的一系列现金流的内部收益率。 ", a: "返回由值中的数字表示的一系列现金流的内部收益率。 ", m: [1, 2], p: [{ name: "values", detail: "其中含有投资相关收益或支出的数组或范围。\n\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "guess", detail: "[可选 - 默认为 0.1] - 内部收益率的估值。", example: "200", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPV", t: 8, d: "使用贴现率和一系列未来支出(负值)和收益(正值)来计算一项投资的净现值。", a: "使用贴现率和一系列未来支出(负值)和收益(正值)来计算一项投资的净现值。", m: [2, 255], p: [{ name: "rate", detail: "某一期间的贴现率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value1", detail: "第一笔支出(负值)和收益(正值)。", example: "200", require: "m", repeat: "n", type: "rangeall" }, { name: "value2, ...", detail: "[可选] - 其他支出(负值)和收益(正值)。", example: "250", require: "o", repeat: "y", type: "rangeall" }] }, { n: "XNPV", t: 8, d: "返回一组现金流的净现值,这些现金流不一定定期发生。", a: "返回一组现金流的净现值,这些现金流不一定定期发生。", m: [3, 3], p: [{ name: "rate", detail: "应用于现金流的贴现率。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "values", detail: "与 dates 中的支付时间相对应的一系列现金流。", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "dates", detail: "与现金流支付相对应的支付日期表。", example: "C2:C25", require: "m", repeat: "n", type: "range" }] }, { n: "CUMIPMT", t: 8, d: "基于等额分期付款和固定利率,计算投资在一系列付款期内的累计利息。", a: "基于等额分期付款和固定利率,计算投资在一系列付款期内的累计利息。", m: [6, 6], p: [{ name: "rate", detail: "利息率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "总付款期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_period", detail: "开始累计计算的付款期序号。\n\n首期必须大于等于1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_period", detail: "结束累计计算的付款期序号。\n\n末期必须大于首期。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PMT", t: 8, d: "用于根据固定付款额和固定利率计算贷款的付款额。", a: "用于根据固定付款额和固定利率计算贷款的付款额。", m: [3, 5], p: [{ name: "rate", detail: "贷款利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "该项贷款的付款总数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值,或一系列未来付款额现在所值的总额,也叫本金。", example: " 100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选 - 默认值为 0] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "D2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IPMT", t: 8, d: "基于固定利率及等额分期付款方式,返回给定期数内对投资的利息偿还额。", a: "基于固定利率及等额分期付款方式,返回给定期数内对投资的利息偿还额。", m: [4, 6], p: [{ name: "rate", detail: "各期利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "per", detail: "用于计算其利息数额的期数,必须在 1 到 nper 之间。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款总期数。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值,或一系列未来付款的当前值的累积和。", example: "80000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选 - 默认值为 0] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "E2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PPMT", t: 8, d: "返回根据定期固定付款和固定利率而定的投资在已知期间内的本金偿付额。", a: "返回根据定期固定付款和固定利率而定的投资在已知期间内的本金偿付额。", m: [4, 6], p: [{ name: "rate", detail: "各期利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "per", detail: "指定期数,该值必须在 1 到 nper 范围内。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款总期数。", example: "3*12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值即一系列未来付款当前值的总和。", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选 - 默认值为 0] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INTRATE", t: 8, d: "返回完全投资型证券的利率。", a: "返回完全投资型证券的利率。", m: [4, 5], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "有价证券的投资额。", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有价证券到期时的兑换值。", example: "101200", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PRICE", t: 8, d: "返回定期付息的面值 ¥100 的有价证券的价格。", a: "返回定期付息的面值 ¥100 的有价证券的价格。", m: [6, 7], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有价证券的年息票利率。", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有价证券的年收益率。", example: "0.065", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值 ¥100 的有价证券的清偿价值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEDISC", t: 8, d: "返回折价发行的面值 ¥100 的有价证券的价格。", a: "返回折价发行的面值 ¥100 的有价证券的价格。", m: [4, 5], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "有价证券的贴现率。", example: "0.0525", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值 ¥100 的有价证券的清偿价值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEMAT", t: 8, d: "返回到期付息的面值 ¥100 的有价证券的价格。", a: "返回到期付息的面值 ¥100 的有价证券的价格。", m: [5, 6], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "issue", detail: "有价证券的发行日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有价证券在发行日的利率。", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有价证券的年收益率。", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "RECEIVED", t: 8, d: "返回一次性付息的有价证券到期收回的金额。", a: "返回一次性付息的有价证券到期收回的金额。", m: [4, 5], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "有价证券的投资额。", example: "10000000", require: "m", repeat: "n", type: "rangenumber" }, { name: "discount", detail: "有价证券的贴现率。", example: "0.0575", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DISC", t: 8, d: "返回有价证券的贴现率。", a: "返回有价证券的贴现率。", m: [4, 5], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "有价证券的价格(按面值为 ¥100 计算)。", example: "97.975", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值 ¥100 的有价证券的清偿价值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPER", t: 8, d: "基于固定利率及等额分期付款方式,返回某项投资的总期数。", a: "基于固定利率及等额分期付款方式,返回某项投资的总期数。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "各期所应支付的金额,在整个年金期间保持不变。", example: "500", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "现值,或一系列未来付款的当前值的累积和。", example: "40000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可选 - 默认值为0] - 未来值,或在最后一次付款后希望得到的现金余额。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\n\n0 表示期末;\n\n1 表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SLN", t: 8, d: "返回一个期间内的资产的直线折旧。", a: "返回一个期间内的资产的直线折旧。", m: [3, 3], p: [{ name: "cost", detail: "资产原值。", example: "300000", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折旧末尾时的值(有时也称为资产残值)。", example: "75000", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "资产的折旧期数(有时也称作资产的使用寿命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DURATION", t: 8, d: "返回假设面值 ¥100 的定期付息有价证券的修正期限。", a: "返回假设面值 ¥100 的定期付息有价证券的修正期限。", m: [5, 6], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "coupon", detail: "有价证券的年息票利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有价证券的年收益率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MDURATION", t: 8, d: "返回假设面值 ¥100 的有价证券的 Macauley 修正期限。", a: "返回假设面值 ¥100 的有价证券的 Macauley 修正期限。", m: [5, 6], p: [{ name: "settlement", detail: "有价证券的结算日。 有价证券结算日是在发行日之后,有价证券卖给购买者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有价证券的到期日。 到期日是有价证券有效期截止时的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "coupon", detail: "有价证券的年息票利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有价证券的年收益率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次数。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: "[可选 - 默认为0] - 指示要使用哪种天数计算方法。\n\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准,假设每月30天、每年360天,并对所输入的月末日期进行具体调整。\n\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券,也是在非财经用途方面使用最多的方法。\n\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为360天。\n\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算,但假定每年为365天。\n\n4表示“欧洲30/360”方法 - 类似于0,此方法基于每月30天、每年360天进行计算,但按照欧洲金融惯例对月末日期进行调整。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2DEC", t: 9, d: "将二进制数转换为十进制数。", a: "将二进制数转换为十进制数。", m: [1, 1], p: [{ name: "number", detail: '要转换为十进制数的带符号的10位二进制数值(以字符串形式提供)。\n\n带符号的二进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n对于此函数,最大的正数输入值为0111111111,最小的负数输入值为1000000000。\n\n如果所提供的带符号的二进制数是有效的二进制数,会自动将其转换为相应的字符串输入。例如,BIN2DEC(100)和BIN2DEC("100")得出的结果相同,均为4。', example: "101", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIN2HEX", t: 9, d: "将二进制数转换为十六进制数。", a: "将二进制数转换为十六进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的十六进制数的带符号的10位二进制数值(以字符串形式提供)。\n\n带符号的二进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n对于此函数,最大的正数输入值为0111111111,最小的负数输入值为1000000000。\n\n如果所提供的带符号的二进制数是有效的二进制数,会自动将其转换为相应的字符串输入。例如,BIN2HEX(11111)和BIN2HEX("11111")得出 的结果相同,均为1F。', example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: '[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。例如,BIN2HEX("11111",8)所得的结果值为0000001F。\n\n如果带符号的二进制数的最高位为1,则忽略此值;即当提供的带符号的二进制数大于等于1000000000时忽略此值。', example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2OCT", t: 9, d: "将二进制数转换为八进制数。", a: "将二进制数转换为八进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的八进制数的带符号的10位二进制数值(以字符串形式提供)。\n\n带符号的二进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n对于此函数,最大的正数输入值为0111111111,最小的负数输入值为1000000000。\n\n如果所提供的带符号的二进制数是有效的二进制数,会自动将其转换为相应的字符串输入。例如,BIN2OCT(11111)和BIN2OCT("11111")得出的结果相同,均为37。', example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: '[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。例如,BIN2OCT("11111")得到的结果值为00000037。\n\n如果带符号的二进制数的最高位为1,则忽略此值;即当提供的带符号的二进制数大于等于1000000000时忽略此值。', example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2BIN", t: 9, d: "将十进制数转换为二进制数。", a: "将十进制数转换为二进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的二进制数的十进制数值(以字符串形式提供)。\n\n对于此函数,最大的正数输入值为511,最小的负数输入值为-512。\n\n如果所提供的十进制数是有效的十进制数,会自动将其转换为相应的字符串输入。例如,DEC2BIN(199)和DEC2BIN("199")得出的结果相同,均为11000111。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果十进制数为负数,则忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2HEX", t: 9, d: "将十进制数转换为十六进制数。", a: "将十进制数转换为十六进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的十六进制数的十进制数值(以字符串形式提供)。\n\n此函数可接受的最大正数值为549755813887,最小负数值为-549755814888。\n\n如果所提供的十进制数是有效的十进制数,会自动将其转换为相应的字符串输入。例如,DEC2HEX(100)和DEC2HEX("100")得出的结果相同,均为64。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果十进制数为负数,则忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2OCT", t: 9, d: "将十进制数转换为八进制数。", a: "将十进制数转换为八进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的八进制数的十进制数值(以字符串形式提供)。\n\n此函数可接受的最大正数值为536870911,最小负数值为-53687092。\n\n如果所提供的十进制数是有效的十进制数,会自动将其转换为相应的字符串输入。例如,DEC2OCT(199)和DEC2OCT("199")得出的结果相同,均为307。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果十进制数为负数,则忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2BIN", t: 9, d: "将十六进制数转换为二进制数。", a: "将十六进制数转换为二进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的二进制数的带符号的40位十六进制数值(以字符串形式提供)。\n\n带符号的十六进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为1FF,最小负数值为FFFFFFFE00。\n\n如果所提供的带符号的十六进制数是有效的十六进制数,函数会自动将其转换为相应的字符串输入。例如,HEX2BIN(199)和HEX2BIN("199")得出的结果相同,均为110011001。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果带符号的十六进制数的最高位为1,则忽略此值;即当提供的带符号的十六进制数大于等于8000000000时忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2DEC", t: 9, d: "将十六进制数转换为十进制数。", a: "将十六进制数转换为十进制数。", m: [1, 1], p: [{ name: "number", detail: '要转换为十进制数的带符号的40位十六进制数值(以字符串形式提供)。\n\n带符号的十六进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为7fffffffff,最小负数值为8000000000。\n\n如果所提供的带符号的十六进制数是有效的十六进制数,函数会自动将其转换为相应的字符串输入。例如,HEX2DEC(199)和HEX2DEC("199")得出的结果相同,均为409。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "HEX2OCT", t: 9, d: "将十六进制数转换为八进制数。", a: "将十六进制数转换为八进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的八进制数的带符号的40位十六进制数值(以字符串形式提供)。\n\n带符号的十六进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为1FFFFFFF,最小负数值为FFE0000000。\n\n如果所提供的带符号的十六进制数是有效的十六进制数,函数会自动将其转换为相应的字符串输入。例如,HEX2OCT(199)和HEX2OCT("199")得出的结果相同,均为631。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果带符号的十六进制数的最高位为1,则忽略此值;即当给定的带符号的十六进制数大于等于8000000000时忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2BIN", t: 9, d: "将八进制数转换为二进制数。", a: "将八进制数转换为二进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的二进制数的带符号的30位八进制数值(以字符串形式提供)。\n\n带符号的八进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为777,最小负数值为7777777000。\n\n如果所提供的带符号的八进制数是有效的八进制数,函数会自动将其转换为相应的字符串输入。例如,OCT2BIN(177)和OCT2BIN("177")得出的结果相同,均为1111111。', example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果带符号的八进制数的最高位为1,则忽略此值;即当给定的带符号的八进制数大于等于4000000000时忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2DEC", t: 9, d: "将八进制数转换为十进制数。", a: "将八进制数转换为十进制数。", m: [1, 1], p: [{ name: "number", detail: '要转换为十进制数的带符号的30位八进制数值(以字符串形式提供)。\n\n带符号的ba进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为3777777777,最小负数值为4000000000。\n\n如果所提供的带符号的八进制数是有效的八进制数,函数会自动将其转换为相应的字符串输入。例如,OCT2DEC(177)和OCT2DEC("177")得出的结果相同,均为127。', example: "37", require: "m", repeat: "n", type: "rangeall" }] }, { n: "OCT2HEX", t: 9, d: "将八进制数转换为十六进制数。", a: "将八进制数转换为十六进制数。", m: [1, 2], p: [{ name: "number", detail: '要转换为带符号的十六进制数的带符号的30位八进制数值(以字符串形式提供)。\n\n带符号的ba进制数的最高位是符号位;也就是说,负数是以二的补码形式表示的。\n\n此函数可接受的最大正数值为3777777777,最小负数值为4000000000。\n\n如果所提供的带符号的八进制数是有效的八进制数,函数会自动将其转换为相应的字符串输入。例如,OCT2HEX(177)和OCT2HEX("177")得出的结果相同,均为7F。', example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可选 ] - 结果中要确保的有效位数。\n\n如果设置的有效位数大于结果中的有效位数,则在结果的左侧填充0,使总有效位数达到有效位数。\n\n如果带符号的八进制数的最高位为1,则忽略此值;即当给定的带符号的八进制数大于等于4000000000时忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COMPLEX", t: 9, d: "将实系数及虚系数转换为 x+yi 或 x+yj 形式的复数。", a: "将实系数及虚系数转换为 x+yi 或 x+yj 形式的复数。", m: [2, 3], p: [{ name: "real_num", detail: "复数的实系数。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "i_num", detail: "复数的虚系数。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "suffix", detail: '[可选 - 默认为 "i"] - 复数中虚系数的后缀。', example: '"j"', require: "o", repeat: "n", type: "rangestring" }] }, { n: "IMREAL", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的复数的实系数。", a: "返回以 x+yi 或 x+yj 文本格式表示的复数的实系数。", m: [1, 1], p: [{ name: "inumber", detail: "需要计算其实系数的复数。", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMAGINARY", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的复数的虚系数。", a: "返回以 x+yi 或 x+yj 文本格式表示的复数的虚系数。", m: [1, 1], p: [{ name: "inumber", detail: "需要计算其虚系数的复数。", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMCONJUGATE", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的复数的共轭复数。", a: "返回以 x+yi 或 x+yj 文本格式表示的复数的共轭复数。", m: [1, 1], p: [{ name: "inumber", detail: "需要计算其共轭数的复数。", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMABS", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的复数的绝对值(模)。", a: "返回以 x+yi 或 x+yj 文本格式表示的复数的绝对值(模)。", m: [1, 1], p: [{ name: "inumber", detail: "要计算其绝对值的复数。", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DELTA", t: 9, d: "检验两个值是否相等。 如果 number1=number2,则返回 1;否则返回 0。", a: "检验两个值是否相等。 如果 number1=number2,则返回 1;否则返回 0。", m: [1, 2], p: [{ name: "number1", detail: "第一个数字。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number2", detail: "[可选 - 默认为 0] - 第二个数字。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "IMSUM", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的和。", a: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的和。", m: [1, 255], p: [{ name: "inumber1", detail: "要相加的第一个复数", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2, …", detail: "[可选] - 要与值1 相加的其他复数", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMSUB", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的两个复数的差。", a: "返回以 x+yi 或 x+yj 文本格式表示的两个复数的差。", m: [2, 2], p: [{ name: "inumber1", detail: "从(复)数中减去 inumber2。", example: '"6+5i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2", detail: "从 inumber1 中减(复)数。", example: '"2+3i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMPRODUCT", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的乘积。", a: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的乘积。", m: [1, 255], p: [{ name: "inumber1", detail: "用于计算乘积的第一个复数", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2, …", detail: "[可选] - 要相乘的其他复数。", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMDIV", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的两个复数的商。", a: "返回以 x+yi 或 x+yj 文本格式表示的两个复数的商。", m: [2, 2], p: [{ name: "inumber1", detail: "复数分子或被除数。", example: '"11+16i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2", detail: "复数分母或除数。", example: '"3+2i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOT", t: 10, d: "返回某个逻辑值的相反值 - “NOT(TRUE())”将返回 FALSE;“NOT(FALSE())”将返回 TRUE。", a: "返回某个逻辑值的相反值 - “NOT(TRUE())”将返回 FALSE;“NOT(FALSE())”将返回 TRUE。", m: [1, 1], p: [{ name: "logical", detail: "计算结果为 TRUE 或 FALSE 的任何值或表达式。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRUE", t: 10, d: "返回逻辑值 TRUE。", a: "返回逻辑值 TRUE。", m: [0, 0], p: [] }, { n: "FALSE", t: 10, d: "返回逻辑值 FALSE。", a: "返回逻辑值 FALSE。", m: [0, 0], p: [] }, { n: "AND", t: 10, d: "所有参数的计算结果为 TRUE 时,返回 TRUE;只要有一个参数的计算结果为 FALSE,即返回 FALSE。", a: "所有参数的计算结果为 TRUE 时,返回 TRUE;只要有一个参数的计算结果为 FALSE,即返回 FALSE。", m: [1, 255], p: [{ name: "logical1", detail: "要测试的第一个条件,其计算结果可以为 TRUE 或 FALSE。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical2,...", detail: "[可选] - 要测试的其他条件,其计算结果可以为 TRUE 或 FALSE,最多可包含 255 个条件。", example: 'A3 = "bar"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IFERROR", t: 10, d: "如果第一个参数不是错误值,就返回第一个参数;否则,返回第二个参数。", a: "如果第一个参数不是错误值", m: [2, 2], p: [{ name: "value", detail: "检查是否存在错误的参数。", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_error", detail: "公式的计算结果错误时返回的值。 计算以下错误类型:#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME? 或 #NULL!。", example: '"Error in cell A1"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IF", t: 10, d: "当逻辑表达式的值为 TRUE 时返回一个值,而当其为 FALSE 时返回另一个值。", a: "当逻辑表达式的值为 TRUE 时返回一个值,而当其为 FALSE 时返回另一个值。", m: [2, 3], p: [{ name: "logical_test", detail: "一个表达式或对包含表达式的单元格的引用,该表达式代表某种逻辑值(即TRUE或FALSE)。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_true", detail: "当逻辑表达式为TRUE时的返回值。", example: '"A2 is foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_false", detail: "[可选 - 默认为空白] - 当逻辑表达式等于FALSE时的函数返回值。", example: '"A2 was false"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "OR", t: 10, d: "只要有一个参数的计算结果为 TRUE 时,返回 TRUE;所有参数的计算结果为 FALSE,即返回 FALSE。", a: "只要有一个参数的计算结果为 TRUE 时,返回 TRUE;所有参数的计算结果为 FALSE,即返回 FALSE。", m: [1, 255], p: [{ name: "logical1", detail: "要测试的第一个条件,其计算结果可以为 TRUE 或 FALSE。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "逻辑表达式2", detail: "[可选] - 其他表达式或对包含表达式的单元格的引用,这些表达式代表某种逻辑值(即TRUE或FALSE)或者可以强制转换为逻辑值。", example: ' A3 = "bar"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NE", t: 11, d: "如果指定的值不相等,则返回“TRUE”;否则返回“FALSE”。相当于“<>”运算符。", a: "如果指定的值不相等,则返回“TRUE”;否则返回“FALSE”。相当于“<>”运算符。", m: [2, 2], p: [{ name: "value1", detail: "第一个值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要检查是否与 value1 不相等的值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EQ", t: 11, d: "如果指定的值相等,则返回“TRUE”;否则返回“FALSE”。相当于“=”运算符。", a: "如果指定的值相等,则返回“TRUE”;否则返回“FALSE”。相当于“=”运算符。", m: [2, 2], p: [{ name: "value1", detail: "第一个值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要检查是否与 value1 相等的值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GT", t: 11, d: "如果第一个参数严格大于第二个,则返回 TRUE;否则返回 FALSE。相当于“>”运算符。", a: "如果第一个参数严格大于第二个,则返回 TRUE;否则返回 FALSE。相当于“>”运算符。", m: [2, 2], p: [{ name: "value1", detail: "要测试其是否大于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二个值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GTE", t: 11, d: "如果第一个参数大于或等于第二个,则返回 TRUE;否则返回 FALSE。相当于“>=”运算符。", a: "如果第一个参数大于或等于第二个,则返回 TRUE;否则返回 FALSE。相当于“>=”运算符。", m: [2, 2], p: [{ name: "value1", detail: "要测试其是否大于等于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二个值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LT", t: 11, d: "如果第一个参数严格小于第二个,则返回 TRUE;否则返回 FALSE。相当于“<”运算符。", a: "如果第一个参数严格小于第二个,则返回 TRUE;否则返回 FALSE。相当于“<”运算符。", m: [2, 2], p: [{ name: "value1", detail: "要测试其是否小于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二个值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LTE", t: 11, d: "如果第一个参数小于或等于第二个,则返回 TRUE;否则返回 FALSE。相当于“<=”运算符。", a: "如果第一个参数小于或等于第二个,则返回 TRUE;否则返回 FALSE。相当于“<=”运算符。", m: [2, 2], p: [{ name: "value1", detail: "要测试其是否小于等于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二个值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ADD", t: 11, d: "返回两个数值之和。相当于 `+` 运算符。", a: "返回两个数值之和。相当于 `+` 运算符。", m: [2, 2], p: [{ name: "value1", detail: "第一个加数。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "第二个加数。", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINUS", t: 11, d: "返回两个数值之差。相当于“-”运算符。", a: "返回两个数值之差。相当于“-”运算符。", m: [2, 2], p: [{ name: "value1", detail: "被减数,即要对其计减的数值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "减数,即要从 value1 中减除的数值。", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTIPLY", t: 11, d: "返回两个数的乘积。相当于“*”运算符。", a: "返回两个数的乘积。相当于“*”运算符。", m: [2, 2], p: [{ name: "value1", detail: "第一个乘数。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "第二个乘数。", example: "B2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DIVIDE", t: 11, d: "返回两个参数相除所得的结果。相当于 `/` 运算符。", a: "返回两个参数相除所得的结果。相当于 `/` 运算符。", m: [2, 2], p: [{ name: "value1", detail: "要被除的数值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "用于除其他数的数值。\n\n除数不得为0。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCAT", t: 11, d: "返回两个值的串联。相当于 `&` 运算符。", a: "返回两个值的串联。相当于 `&` 运算符。", m: [2, 2], p: [{ name: "value1", detail: "value2 将附于其后的值。", example: '"de"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要附于 value1 之后的值。", example: '"mystify"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UNARY_PERCENT", t: 11, d: "返回按百分比解释的数值。例如,“UNARY_PERCENT(100)”等于1。", a: "返回按百分比解释的数值。例如,“UNARY_PERCENT(100)”等于1。", m: [1, 1], p: [{ name: "number", detail: "要作为百分比解释的数值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCATENATE", t: 12, d: "将两个或多个文本字符串联接为一个字符串。", a: "将两个或多个文本字符串联接为一个字符串。", m: [1, 255], p: [{ name: "text1", detail: "初始字符串。", example: '"Super"', require: "m", repeat: "n", type: "rangeall" }, { name: "text2 ...", detail: "[可选] - 要按顺序连接在一起的其他字符串。", example: '"calla"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CODE", t: 12, d: "返回所提供的字符串中首字符的 Unicode 映射值。", a: "返回所提供的字符串中首字符的 Unicode 映射值。", m: [1, 1], p: [{ name: "text", detail: "要返回其首字符的Unicode映射值的字符串。", example: '"a"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CHAR", t: 12, d: "按照当前 Unicode 编码表,将数字转换为对应的字符。", a: "按照当前 Unicode 编码表,将数字转换为对应的字符。", m: [1, 1], p: [{ name: "number", detail: "介于 1 到 255 之间的数字。", example: "97", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ARABIC", t: 12, d: "将罗马数字转换为阿拉伯数字。", a: "将罗马数字转换为阿拉伯数字。", m: [1, 1], p: [{ name: "text", detail: "要转换格式的罗马数字", example: '"XIV"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "ROMAN", t: 12, d: "将数字格式设置为罗马数字形式。", a: "将数字格式设置为罗马数字形式。", m: [1, 1], p: [{ name: "number", detail: "要设置格式的数字,介于1到3999之间(包括这两个数字)。", example: "499", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "REGEXEXTRACT", t: 12, d: "按照正则表达式提取匹配的子串。", a: "按照正则表达式提取匹配的子串。", m: [2, 2], p: [{ name: "text", detail: "输入文本。", example: '"Needle in a haystack"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "此函数将返回文本中符合此表达式的第一个子串。", example: '".e{2}dle"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXMATCH", t: 12, d: "判断一段文本是否与正则表达式相匹配。", a: "判断一段文本是否与正则表达式相匹配。", m: [2, 2], p: [{ name: "text", detail: "要用正则表达式测试的文本。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "用来测试文本的正则表达式。", example: '"S.r"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXREPLACE", t: 12, d: "使用正则表达式将文本字符串中的一部分替换为其他文本字符串。", a: "使用正则表达式将文本字符串中的一部分替换为其他文本字符串。", m: [3, 3], p: [{ name: "text", detail: "要对其局部进行替换操作的文本。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "正则表达式。 text 中所有匹配的实例都将被替换。", example: '"S.*d"', require: "m", repeat: "n", type: "rangeall" }, { name: "replacement", detail: "要插入到原有文本中的文本。", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "T", t: 12, d: "返回文本格式的字符串参数。", a: "返回文本格式的字符串参数。", m: [1, 1], p: [{ name: "value", detail: "要转换为文本的参数。\n\n如果值为文本,T将返回值本身。\n\n如果值为指向包含文本的单元格的引用,T将返回值中的内容。\n\n如果值为错误值或包含错误值的单元格,T将返回该错误值。\n\n对于所有其他情况,T将返回空串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "FIXED", t: 12, d: "以固定的小数位数设置数字的格式。", a: "以固定的小数位数设置数字的格式。", m: [1, 3], p: [{ name: "number", detail: "要进行舍入并转换为文本的数字。", example: "3.141592653", require: "m", repeat: "n", type: "rangenumber" }, { name: "decimals", detail: "[可选 - 默认值为2] - 结果中要显示的小数位数。\n\n如果数值的有效位数小于小数位数,将以零填充。如果数值的有效位数大于小数位数,则将其舍入到所需的小数位数而不是将其截断。", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "no_commas", detail: "[可选 - 默认值为FALSE()] - 一个逻辑值,如果为 TRUE(),则会禁止 FIXED 在返回的文本中包含逗号。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FIND", t: 12, d: "返回字符串在文本中首次出现的位置(区分大小写)。", a: "返回字符串在文本中首次出现的位置(区分大小写)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要搜索的文本中查找的字符串。", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中搜索搜索字符串的首次出现位置的文本。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[可选 - 默认值为1] - 要在要搜索的文本中开始搜索的字符位置。", example: "14", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FINDB", t: 12, d: "返回某个字符串在文本中首次出现的位置(每个双字节字符占两个位置)。", a: "返回某个字符串在文本中首次出现的位置(每个双字节字符占两个位置)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要搜索的文本中查找的字符串。", example: '"新"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中搜索搜索字符串的首次出现位置的文本。", example: '"农历新年"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[可选 - 默认值为 1] - 要在要搜索的文本中开始搜索的字符位置。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "JOIN", t: 12, d: "将一个或多个使用指定定界符的一维数组的元素连接到一起。", a: "将一个或多个使用指定定界符的一维数组的元素连接到一起。", m: [2, 255], p: [{ name: "separator", detail: "置于相互连接的值之间的字符或字符串。\n\n定界符可以为空,例如JOIN(,{1,2,3})。", example: '" and-a "', require: "m", repeat: "n", type: "rangeall" }, { name: "array1", detail: "要使用定界符连接的一个或多个值。", example: "{1", require: "m", repeat: "n", type: "rangeall" }, { name: "array2, ...", detail: "[可选] - 要使用定界符连接的其他值或数组。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LEFT", t: 12, d: "从文本字符串的第一个字符开始返回指定个数的字符。", a: "从文本字符串的第一个字符开始返回指定个数的字符。", m: [1, 2], p: [{ name: "text", detail: "包含要提取的字符的文本字符串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "num_chars", detail: "[可选 - 默认值为1] - 指定要由 LEFT 提取的字符的数量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RIGHT", t: 12, d: "根据所指定的字符数返回文本字符串中最后一个或多个字符。", a: "根据所指定的字符数返回文本字符串中最后一个或多个字符。", m: [1, 2], p: [{ name: "text", detail: "包含要提取的字符的文本字符串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "num_chars", detail: "[可选 - 默认值为1] - 指定要由 RIGHT 提取的字符的数量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MID", t: 12, d: "返回文本字符串中从指定位置开始的特定数目的字符。", a: "返回文本字符串中从指定位置开始的特定数目的字符。", m: [3, 3], p: [{ name: "text", detail: "包含要提取的字符的文本字符串。", example: '"get this"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "要从字符串中开始提取的位置。字符串中第一个字符的索引为1。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_chars", detail: "指定要由 MID 提取的字符的数量。\n\n如果提取的字符数尚不足提取长度个字符时就到达了字符串尾部,则MID返回从开始位置到字符串尾部的字符。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LEN", t: 12, d: "返回给定字符串的长度。", a: "返回给定字符串的长度。", m: [1, 1], p: [{ name: "text", detail: "要返回其长度的字符串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LENB", t: 12, d: "返回文本中所包含的字符数。与双字节字符集(DBCS)一起使用。", a: "返回文本中所包含的字符数。与双字节字符集(DBCS)一起使用。", m: [1, 1], p: [{ name: "text", detail: "要返回其字节数的字符串。(一个汉字为两个字节数)", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LOWER", t: 12, d: "将指定字符串中的字母转换为小写。", a: "将指定字符串中的字母转换为小写。", m: [1, 1], p: [{ name: "text", detail: "要转换为小写的字符串。", example: '"LOREM IPSUM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UPPER", t: 12, d: "将指定字符串中的字母转换为大写。", a: "将指定字符串中的字母转换为大写。", m: [1, 1], p: [{ name: "text", detail: "要转换为大写的字符串。", example: '"lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EXACT", t: 12, d: "比较两个字符串是否相同。", a: "比较两个字符串是否相同。", m: [2, 2], p: [{ name: "text1", detail: "要比较的第一个字符串。", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "text2", detail: "要比较的第二个字符串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPLACE", t: 12, d: "将文本字符串的一部分替换为其他文本字符串。", a: "将文本字符串的一部分替换为其他文本字符串。", m: [4, 4], p: [{ name: "old_text", detail: "要对其局部进行替换操作的文本。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "开始进行替换操作的位置(文本开头位置为 1)。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_chars", detail: "要在文本中替换的字符个数。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "new_text", detail: "要插入到原有文本中的文本。", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPT", t: 12, d: "返回指定文本的多次重复。", a: "返回指定文本的多次重复。", m: [2, 2], p: [{ name: "text", detail: "要重复的字符或字符串。", example: '"ha"', require: "m", repeat: "n", type: "rangeall" }, { name: "number_times", detail: "要重复的文本要在返回值中出现的次数。\n\n最大重复次数为100。即使重复次数大于100,REPT也仅将相应文本重复100次。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SEARCH", t: 12, d: "返回字符串在文本中首次出现的位置(不区分大小写)。", a: "返回字符串在文本中首次出现的位置(不区分大小写)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要搜索的文本中查找的字符串。", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中搜索搜索字符串的首次出现位置的文本。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[ 可选 - 默认值为1 ] - 要在要搜索的文本中开始搜索的字符位置。", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUBSTITUTE", t: 12, d: "在文本字符串中用 new_text 替换 old_text。", a: "在文本字符串中用 new_text 替换 old_text。", m: [3, 4], p: [{ name: "text", detail: "需要替换其中字符的文本,或对含有文本(需要替换其中字符)的单元格的引用。", example: '"search for it"', require: "m", repeat: "n", type: "rangeall" }, { name: "old_text", detail: "需要替换的文本。", example: '"search for"', require: "m", repeat: "n", type: "rangeall" }, { name: "new_text", detail: "用于替换 old_text 的文本。", example: '"Google"', require: "m", repeat: "n", type: "rangeall" }, { name: "instance_num", detail: "[ 可选 ] - 指定要用 new_text 替换 old_text 的事件。 如果指定了 instance_num,则只有满足要求的 old_text 被替换。 否则,文本中出现的所有 old_text 都会更改为 new_text。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CLEAN", t: 12, d: "移除文本中的不可打印 ASCII 字符后将其返回。", a: "移除文本中的不可打印 ASCII 字符后将其返回。", m: [1, 1], p: [{ name: "text", detail: "要移除其中不可打印字符的文本。", example: '"AF"&CHAR(31)', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TEXT", t: 12, d: "按照指定格式将数字转换为文本。", a: "按照指定格式将数字转换为文本。", m: [2, 2], p: [{ name: "value", detail: "要设置格式的数字、日期或时间。", example: "1.23", require: "m", repeat: "n", type: "rangenumber" }, { name: "format_text", detail: '以括号括起来的模式串,将按该模式设置数字的格式。\n\n0表示在数值位数少于格式指定的位数时必定以零填充。例如,TEXT(12.3,"000.00")将返回012.30。当数值的小数位数超过模式指定的小数位数时,四舍五入为指定的小数位数。例如,TEXT(12.305,"00.00")将返回12.31。\n\n#类似于0,但并不是在小数点的两侧都以零填充。例如,TEXT(12.3,"###.##")将返回12.3。', example: '"$0.00"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRIM", t: 12, d: "删除指定字符串前后的空格。", a: "删除指定字符串前后的空格。", m: [1, 1], p: [{ name: "text", detail: "要修剪的字符串或指向包含该字符串的单元格的引用。", example: '" lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "VALUE", t: 12, d: "将可识别的任何日期、时间或数字格式的字符串转换为数字。", a: "将可识别的任何日期、时间或数字格式的字符串转换为数字。", m: [1, 1], p: [{ name: "text", detail: "包含要转换的值的字符串。", example: '"123"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "PROPER", t: 12, d: "将指定字符串中每个单词的首字母转为大写。", a: "将指定字符串中每个单词的首字母转为大写。", m: [1, 1], p: [{ name: "text", detail: "要转换的文本,其中每个单词的首字母都将转为大写,所有其他字母则转为小写。", example: '"united states"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CONVERT", t: 13, d: "将数字从一种度量系统转换为另一种度量系统。", a: "将数字从一种度量系统转换为另一种度量系统。", m: [3, 3], p: [{ name: "number", detail: "是以 from_unit 为单位的需要进行转换的数值。", example: "5.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "from_unit", detail: "是数值的单位。", example: '"g"', require: "m", repeat: "n", type: "rangeall" }, { name: "to_unit", detail: "是结果的单位。", example: '"kg"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "SUMX2MY2", t: 14, d: "返回两数组中对应数值的平方差之和。", a: "返回两数组中对应数值的平方差之和。", m: [2, 2], p: [{ name: "array_x", detail: "第一个数组或数值区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二个数组或数值区域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMX2PY2", t: 14, d: "返回两数组中对应数值的平方和之和。", a: "返回两数组中对应数值的平方和之和。", m: [2, 2], p: [{ name: "array_x", detail: "第一个数组或数值区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二个数组或数值区域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMXMY2", t: 14, d: "返回两数组中对应数值之差的平方和。", a: "返回两数组中对应数值之差的平方和。", m: [2, 2], p: [{ name: "array_x", detail: "第一个数组或数值区域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二个数组或数值区域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRANSPOSE", t: 14, d: "将数组或单元格范围的行列转置。", a: "将数组或单元格范围的行列转置。", m: [1, 1], p: [{ name: "array", detail: "要将其行列互换的数组或范围。", example: "{1,2}", require: "m", repeat: "n", type: "range" }] }, { n: "TREND", t: 14, d: "返回线性趋势值。", a: "返回线性趋势值。", m: [1, 4], p: [{ name: "known_y", detail: "关系表达式 y = mx + b 中已知的 y 值集合。\n\n如果 known_y 为二维数组或范围,则 known_x 的维数必须与之相同,或者省略此参数。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_x", detail: "[可选 - 默认与 known_x 相同] - 需要函数 TREND 返回对应 y 值的新 x 值。", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可选 - 默认值为TRUE()] - 一个逻辑值,用于指定是否将常量 b 强制设为 0。\n\nTRUE() 表示 b 将按正常计算;\n\nFALSE() 表示 b 将被设为 0(零),m 将被调整以使 y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FREQUENCY", t: 14, d: "计算数值在某个区域内的出现频率,然后返回一个垂直数组。", a: "计算数值在某个区域内的出现频率,然后返回一个垂直数组。", m: [2, 2], p: [{ name: "data_array", detail: "要对其频率进行计数的一组数值或对这组数值的引用。", example: "A2:A40", require: "m", repeat: "n", type: "rangenumber" }, { name: "bins_array", detail: "要将 data_array 中的值插入到的间隔数组或对间隔的引用。\n\n为清晰起见,应将类别排序,但如果未排序,FREQUENCY会在内部对这些指定的值进行排序并返回正确结果。", example: "B2:B5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GROWTH", t: 14, d: "使用现有数据计算预测的指数等比。", a: "使用现有数据计算预测的指数等比。", m: [1, 4], p: [{ name: "known_y", detail: "关系表达式 y = b*m^x 中已知的 y 值集合。\n\n如果已知数据_y为二维数组或范围,则已知数据_x的维数必须与之相同,或者省略此参数。\n\n如果已知数据_y为一维数组或范围,已知数据_x则可代表二维数组或范围中的多个自变量。也就是说,如果已知数据_y为单行,则将已知数据_x中的每行解释为各自独立的值,类似情况也适用于已知数据_y为单列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = b*m^x 中已知的可选 x 值集合。\n\n如果已知数据_y为一维数组或范围,已知数据_x则可代表二维数组或范围中的多个自变量。也就是说,如果已知数据_y为单行,则将已知数据_x中的每行解释为各自独立的值,类似情况也适用于已知数据_y为单列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_x", detail: "[可选 - 默认与 known_x 相同] - 需要函数 GROWTH 返回对应 y 值的新 x 值。", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可选 - 默认值为TRUE()] -一个逻辑值,用于指定是否将常量 b 强制设为 1。\n\nTRUE() 表示 b 将按正常计算;\n\nFALSE() 表示 b 将被设为 1m 将被调整以使 y = m^x。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LINEST", t: 14, d: "可通过使用最小二乘法计算与现有数据最佳拟合的直线,来计算某直线的统计值,然后返回描述此直线的数组。", a: "可通过使用最小二乘法计算与现有数据最佳拟合的直线,来计算某直线的统计值,然后返回描述此直线的数组。", m: [1, 4], p: [{ name: "known_y", detail: "关系表达式 y = mx + b 中已知的 y 值集合。\n\n如果 known_y 为二维数组或范围,则 known_x 的维数必须与之相同,或者省略此参数。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可选 - 默认值为TRUE()] - 一个逻辑值,用于指定是否将常量 b 强制设为 0。\n\nTRUE() 表示 b 将按正常计算;\n\nFALSE() 表示 b 将被设为 0(零),m 将被调整以使 y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "stats", detail: "[可选 - 默认值为FALSE()] - 一个逻辑值,用于指定是否返回附加回归统计值。\n\n如果详细为TRUE,除了对应于每个自变量的一组线性系数和y截距之外,LINEST还返回以下信息:\n\n每项系数和截距的标准误差、\n\n限定系数(介于0和1之间,1表示完全相关)、\n\n因变量值的标准误差、\n\nF统计或F观测值,指示所观测到的因变量和自变量变量之间的关系是随机的还是线性的、\n\n自由度,用于在参照表中查找F统计值以估算可信度、\n\n回归平方和,以及\n\n残差平方和。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOGEST", t: 14, d: "在回归分析中,计算最符合数据的指数回归拟合曲线,并返回描述该曲线的数值数组。", a: "在回归分析中,计算最符合数据的指数回归拟合曲线,并返回描述该曲线的数值数组。", m: [1, 4], p: [{ name: "known_y", detail: "关系表达式 y = mx + b 中已知的 y 值集合。\n\n如果 known_y 为二维数组或范围,则 known_x 的维数必须与之相同,或者省略此参数。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\n\n如果 known_y 为一维数组或范围,known_x 则可代表二维数组或范围中的多个自变量。也就是说,如果 known_y 为单行,则将 known_x 中的每行解释为各自独立的值,类似情况也适用于 known_y 为单列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可选 - 默认值为TRUE()] - 一个逻辑值,用于指定是否将常量 b 强制设为 0。\n\nTRUE() 表示 b 将按正常计算;\n\nFALSE() 表示 b 将被设为 0(零),m 将被调整以使 y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "stats", detail: "[可选 - 默认值为FALSE()] - 一个逻辑值,用于指定是否返回附加回归统计值。\n\n如果详细为TRUE,则除了为每个自变量和系数 b 返回一组指数值之外,LOGEST 还将返回以下数据:\n\n每项指数和系数的标准误差、\n\n限定系数(介于 0 和 1 之间,1 表示完全相关)、\n\n因变量值的标准误差、\n\nF 统计或 F 观测值,指示所观测到的因变量和自变量之间的关系是随机的还是指数的、\n\n自由度 - 用于在参照表中查找 F 统计值以估算可信度、\n\n回归平方和,以及\n\n残差平方和。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "MDETERM", t: 14, d: "返回一个数组的矩阵行列式的值。", a: "返回一个数组的矩阵行列式的值。", m: [1, 1], p: [{ name: "array", detail: "行数和列数相等的数值数组。", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINVERSE", t: 14, d: "返回数组中存储的矩阵的逆矩阵。", a: "返回数组中存储的矩阵的逆矩阵。", m: [1, 1], p: [{ name: "array", detail: "行数和列数相等的数值数组。", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MMULT", t: 14, d: "返回两个数组的矩阵乘积。结果矩阵的行数与 array1 的行数相同,矩阵的列数与 array2 的列数相同。", a: "返回两个数组的矩阵乘积。结果矩阵的行数与 array1 的行数相同,矩阵的列数与 array2 的列数相同。", m: [2, 2], p: [{ name: "array1", detail: "要进行矩阵乘法运算的第一个矩阵数组。\n\narray1 列数必须与 array2 的行数相同", example: "A1:B3", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "要进行矩阵乘法运算的第二个矩阵数组。\n\narray2 的行数必须与 array1 列数相同", example: "C1:F2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMPRODUCT", t: 14, d: "在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。", a: "在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。", m: [1, 255], p: [{ name: "array1", detail: "其相应元素需要进行相乘并求和的第一个数组参数。", example: "A2:C5", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "[可选] - 其相应元素需要进行相乘并求和的其它数组参数。", example: "D2:F5", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "ISFORMULA", t: 15, d: "检查公式是否位于引用的单元格中。", a: "检查公式是否位于引用的单元格中。", m: [1, 1], p: [{ name: "cell", detail: "要检查是否存在公式的单元格。\n\n如果 cell 为包含公式的单元格,则 ISFORMULA 将返回 TRUE。如果 cell 为相应单元格范围,则当该范围内的首个单元格包含公式时,系统会返回 TRUE。如果是任何其他值,系统都将返回 FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "CELL", t: 15, d: "返回有关单元格的格式、位置或内容的信息。", a: "返回有关单元格的格式、位置或内容的信息。", m: [2, 2], p: [{ name: "info_type", detail: "一个文本值,指定要返回的单元格信息的类型。", example: '"type"', require: "m", repeat: "n", type: "rangeall" }, { name: "reference", detail: "需要其相关信息的单元格。", example: "C2", require: "m", repeat: "n", type: "range" }] }, { n: "NA", t: 15, d: "返回错误值 #N/A。", a: "返回错误值 #N/A。", m: [0, 0], p: [] }, { n: "ERROR_TYPE", t: 15, d: "返回与其他单元格中的错误值相对应的数字。", a: "返回与其他单元格中的错误值相对应的数字。", m: [1, 1], p: [{ name: "error_val", detail: "用于查找错误号的单元格,虽然您也可以直接提供错误值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISBLANK", t: 15, d: "检查所引用的单元格是否为空。", a: "检查所引用的单元格是否为空。", m: [1, 1], p: [{ name: "value", detail: "对要检查其是否为空的单元格的引用。\n\n如果是空单元格,则 TRUE;否则返回 FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISERR", t: 15, d: "检查某个值是否为 #N/A 以外的错误值。", a: "检查某个值是否为 #N/A 以外的错误值。", m: [1, 1], p: [{ name: "value", detail: "要验证其是否为#N/A以外的错误类型的值。\n\n如果值是除#N/A之外的任何错误(包括#DIV/0!、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!),ISERR将返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISERROR", t: 15, d: "检查某个值是否为错误值。", a: "检查某个值是否为错误值。", m: [1, 1], p: [{ name: "value", detail: "要验证其是否为错误类型的值。\n\n只要值是某种错误值(包括#DIV/0!、#N/A、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!),ISERROR就会返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISLOGICAL", t: 15, d: "检查某个值是 TRUE 还是 FALSE。", a: "检查某个值是 TRUE 还是 FALSE。", m: [1, 1], p: [{ name: "value", detail: "要验证其为逻辑TRUE还是逻辑FALSE的值。\n\n*如果值为TRUE或FALSE,或为指向值为TRUE或FALSE的单元格的引用,ISLOGICAL将返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNA", t: 15, d: "检查某个值是否为错误值 #N/A。", a: "检查某个值是否为错误值 #N/A。", m: [1, 1], p: [{ name: "value", detail: "要与错误值#N/A进行比较的值。\n\n*如果值为#N/A或指向包含#N/A的单元格的引用,则ISNA将返回TRUE,否则返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNONTEXT", t: 15, d: "检查某个值是否为非文本。", a: "检查某个值是否为非文本。", m: [1, 1], p: [{ name: "value", detail: "要检查的文本。\n\n*如果参数为文本值或指向包含文本的单元格的引用,ISNONTEXT将返回FALSE,否则返回TRUE。\n\n当值为指向空单元格的引用时,ISNONTEXT会返回TRUE。\n\n当值为空字符串时,ISNONTEXT将返回FALSE,因为空串被视作文本。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNUMBER", t: 15, d: "检查某个值是否为数字。", a: "检查某个值是否为数字。", m: [1, 1], p: [{ name: "value", detail: "要验证其是否为数字的值。\n\n*如果参数为数字或指向内容为数字值的单元格的引用,ISNUMBER将返回TRUE,否则返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISREF", t: 15, d: "检查某个值是否为有效的单元格引用。", a: "检查某个值是否为有效的单元格引用。", m: [1, 1], p: [{ name: "value", detail: "要验证其是否为单元格引用的值。\n\n*如果参数是有效的单元格引用,ISREF将返回TRUE,否则返回FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISTEXT", t: 15, d: "检查某个值是否为文本。", a: "检查某个值是否为文本。", m: [1, 1], p: [{ name: "value", detail: "要验证其是否为文本的值。\n\n如果参数为文本值或指向包含文本值的单元格的引用,ISTEXT将返回TRUE,否则返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TYPE", t: 15, d: "返回数值的类型。", a: "返回数值的类型。", m: [1, 1], p: [{ name: "value", detail: "要确定其类型的数据。\n\n数字 返回 1;\n\n文本 返回 2;\n\n逻辑值 返回 4;\n\n错误值 返回 16;\n\n数组 返回 64;", example: "C4", require: "m", repeat: "n", type: "rangeall" }] }, { n: "N", t: 15, d: "返回转化为数值后的值。", a: "返回转化为数值后的值。", m: [1, 1], p: [{ name: "value", detail: "要转换为数字的参数。\n\n如果值为数字,则返回该数字。\n\n如果值为日期,则返回该日期的序列号。\n\n如果值为TRUE,则返回1。\n\n如果值为FALSE,则返回0。\n\n如果值为错误值,则返回错误值。\n\n如果值为其他值,则返回0。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DATE", t: 16, d: "将指定的数字转换为日期。", a: "将指定的数字转换为日期。", m: [1, 1], p: [{ name: "value", detail: "要转换为日期的参数或其单元格引用。\n\n如果值为数字或指向内容为数值的单元格的引用,TO_DATE会将值转换为相应的日期并返回,值代表从十二月30日到对应的日期之间的天数,\n\n负值表示对应的日期在十二月30日之前,而小数值则代表一天中从午夜算起的时间。\n如果值不是数字或指向内容为数值的单元格的引用,则TO_DATE将在不做任何修改的情况下返回值。", example: "25405", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PURE_NUMBER", t: 16, d: "将给定的日期/时间、百分比、货币金额或其他格式的数值转换为不带格式的纯数字。", a: "将给定的日期/时间、百分比、货币金额或其他格式的数值转换为不带格式的纯数字。", m: [1, 1], p: [{ name: "value", detail: "要转换为纯数字的参数或其单元格引用。\n\n如果值为数字或指向包含数值的单元格的引用,TO_PURE_NUMBER将以不带任何格式与解释的形式返回值。\n\n如果值不是数字或指向内容为数值的单元格的引用,则TO_PERCENT将在不做任何修改的情况下返回值。", example: "50%", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_TEXT", t: 16, d: "将给定的数字值转换为文本格式。", a: "将给定的数字值转换为文本格式。", m: [1, 1], p: [{ name: "value", detail: "要转换为文本的参数或其单元格引用。\n\n如果值为数字或指向包含数值的单元格的引用,TO_TEXT将返回字符串形式的值,并保持现有格式。即原为货币的仍为货币,原为十进制数的仍为十进制数,原为百分比的仍为百分比,原为日期的仍为日期。\n\n如果值不是数字或指向内容为数值的单元格的引用,则TO_TEXT将在不做任何修改的情况下返回值。", example: "24", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DOLLARS", t: 16, d: "将指定的数字转换为美元金额。", a: "将指定的数字转换为美元金额。", m: [1, 1], p: [{ name: "value", detail: "要转换为美元金额的参数或其单元格引用。\n\n如果值不是数字或指向内容为数值的单元格的引用,则 TO_DOLLARS 将在不做任何修改的情况下返回值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PERCENT", t: 16, d: "将指定的数字转换为百分比。", a: "将指定的数字转换为百分比。", m: [1, 1], p: [{ name: "value", detail: "要转换为百分比的参数或其单元格引用。\n\n如果值为数字或指向包含数值的单元格的引用,TO_PERCENT会以1 = 100%为标准,将值转换为百分比。\n\n如果值不是数字或指向内容为数值的单元格的引用,则TO_PERCENT将在不做任何修改的情况下返回值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DGET", t: 17, d: "使用 SQL 式查询,从列表或数据库的列中提取符合指定条件的单个值。", a: "使用 SQL 式查询,从列表或数据库的列中提取符合指定条件的单个值。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMAX", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的最大数字。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的最大数字。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMIN", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的最小数字。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的最小数字。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DAVERAGE", t: 17, d: "使用 SQL 式查询,对列表或数据库中满足指定条件的记录字段(列)中的数值求平均值。", a: "使用 SQL 式查询,对列表或数据库中满足指定条件的记录字段(列)中的数值求平均值。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNT", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中包含数字的单元格的个数。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中包含数字的单元格的个数。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNTA", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的非空单元格的个数。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的非空单元格的个数。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DPRODUCT", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的数值的乘积。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的数值的乘积。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEV", t: 17, d: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为一个样本估算出的总体标准偏差。", a: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为一个样本估算出的总体标准偏差。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEVP", t: 17, d: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为样本总体计算出的总体标准偏差。", a: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为样本总体计算出的总体标准偏差。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSUM", t: 17, d: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的数字之和。", a: "使用 SQL 式查询,返回列表或数据库中满足指定条件的记录字段(列)中的数字之和。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVAR", t: 17, d: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为一个样本估算出的总体方差。", a: "使用 SQL 式查询,返回利用列表或数据库中满足指定条件的记录字段(列)中的数字作为一个样本估算出的总体方差。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVARP", t: 17, d: "使用 SQL 式查询,通过使用列表或数据库中满足指定条件的记录字段(列)中的数字计算样本总体的样本总体方差。", a: "使用 SQL 式查询,通过使用列表或数据库中满足指定条件的记录字段(列)中的数字计算样本总体的样本总体方差。", m: [3, 3], p: [{ name: "database", detail: "构成列表或数据库的单元格区域,列表的第一行包含每一列的标签。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定 database 中的哪一列包含要提取和用于计算的值。\n\nfield 可以是与 database 第一行中某个列标题对应的文本标签,也可以是指定相关列的数字索引,第一列的索引值为 1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "AGE_BY_IDCARD", t: "3", d: "根据中国身份证号计算出年龄。支持15位或18位身份证", a: "根据身份证号得到年龄。", m: [1, 2], p: [{ name: "身份证号", example: "A1", detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }, { name: "截止日期", example: '"2017-10-01"', detail: "年龄计算的截止日期或范围,默认为当日。", require: "o", repeat: "n", type: "rangedatetime" }] }, { n: "SEX_BY_IDCARD", t: "3", d: "根据中国身份证号计算出性别。支持15位或18位身份证", a: "根据身份证号得到性别。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIRTHDAY_BY_IDCARD", t: "3", d: "根据中国身份证号计算出生日。支持15位或18位身份证", a: "根据身份证号得到生日。", m: [1, 2], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }, { name: "生日格式", example: "0", detail: "日期类型,默认0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PROVINCE_BY_IDCARD", t: "3", d: "根据中国身份证号计算出籍贯的省份。支持15位或18位身份证", a: "根据身份证号得到籍贯的省份。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "CITY_BY_IDCARD", t: "3", d: "根据中国身份证号计算出籍贯的城市。支持15位或18位身份证", a: "根据身份证号得到籍贯的城市。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "STAR_BY_IDCARD", t: "3", d: "根据中国身份证号计算出星座。支持15位或18位身份证", a: "根据身份证号得到星座。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ANIMAL_BY_IDCARD", t: "3", d: "根据中国身份证号计算出生肖(鼠、牛、虎、兔...)。支持15位或18位身份证", a: "根据身份证号得到生肖。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISIDCARD", t: "3", d: "验证身份证的格式是否正确。支持15位或18位身份证", a: "验证身份证格式正确性。", m: [1, 1], p: [{ name: "身份证号", example: '"31033519900101XXXX"', detail: "15位或者18位的身份证号或范围。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DM_TEXT_CUTWORD", t: "4", d: "文本分词。把一连串文字拆分为一系列单独词语", a: "中文文本分词。", m: [1, 2], p: [{ name: "文本", example: '"我来到北京清华大学"', detail: "任意需要分词的文本。", require: "m", repeat: "n", type: "rangeall" }, { name: "分词模式", example: "0", detail: "默认为0[精确模式], 1[全模式], 2[搜索引擎模式]。", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TFIDF", t: "4", d: "采用tf-idf算法进行关键词提取。从一连串文字中识别关键词", a: "tf-idf关键词识别。", m: [1, 3], p: [{ name: "文本", example: '"我来到北京清华大学"', detail: "任意需要分词的文本。", require: "m", repeat: "n", type: "rangeall" }, { name: "关键词个数", example: "20", detail: "算法返回的关键词个数,默认20", require: "o", repeat: "n", type: "rangenumber" }, { name: "语料库", example: "1", detail: "选择特定领域的语料库,默认0[通用], 1[金融], 2[医疗]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TEXTRANK", t: "4", d: "采用TextRank算法进行关键词提取。从一连串文字中识别关键词", a: "TextRank关键词识别。", m: [1, 3], p: [{ name: "文本", example: '"我来到北京清华大学"', detail: "任意需要分词的文本。", require: "m", repeat: "n", type: "rangeall" }, { name: "关键词个数", example: "20", detail: "算法返回的关键词个数,默认20", require: "o", repeat: "n", type: "rangenumber" }, { name: "语料库", example: "1", detail: "选择特定领域的语料库,默认0[通用], 1[金融], 2[医疗]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_CLOSE", t: "5", d: "根据股票代码和日期,返回A股对应股票收盘价。", a: "返回A股对应股票收盘价。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_OPEN", t: "5", d: "根据股票代码和日期,返回A股对应股票开盘价。", a: "返回A股对应股票开盘价。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MAX", t: "5", d: "根据股票代码和日期,返回A股对应股票最高价。", a: "返回A股对应股票最高价。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MIN", t: "5", d: "根据股票代码和日期,返回A股对应股票最低价。", a: "返回A股对应股票最低价。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_VOLUMN", t: "5", d: "根据股票代码和日期,返回A股对应股票成交量。", a: "返回A股对应股票成交量。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_AMOUNT", t: "5", d: "根据股票代码和日期,返回A股对应股票成交额。", a: "返回A股对应股票成交额。", m: [1, 3], p: [{ name: "股票代码", example: '"000001"', detail: "6位股票代码,必填项。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "复权除权", example: "0", detail: "选择股票的除权复权类型,默认0[前复权], 1[原始价格], 2[后复权]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ISDATE", t: "6", d: "验证日期的格式是否正确。支持多种日期格式", a: "验证日期格式正确性。", m: [1, 1], p: [{ name: "日期", example: '"1990-01-01"', detail: "日期值,例如1990/01/01, 1990年1月1日等。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LINESPLINES", t: "3", d: "生成嵌入在单元格内的折线图sparklines,用于描述数据的连续走势", a: "生成单元格折线图", m: [1, 8], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "线条颜色", example: "#2ec7c9", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "线条粗细", example: "1", detail: "折线图线段粗细,默认为1px", require: "o", repeat: "n", type: "rangeall" }, { name: "辅助线", example: "avg", detail: "一条横线,可以是min、max、avg、median、范围或自定义数值,默认0无", require: "o", repeat: "n", type: "rangeall" }, { name: "辅助线颜色", example: "#000", detail: "辅助线的颜色设置,同线条颜色配置,默认#000", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值标识", example: "#fc5c5c", detail: "标识线图最大值,同线条颜色配置,默认0不显示", require: "o", repeat: "n", type: "rangeall" }, { name: "最小值标识", example: "#fc5c5c", detail: "标识线图最小值,同线条颜色配置,默认0不显示", require: "o", repeat: "n", type: "rangeall" }, { name: "标识大小", example: "1.5", detail: "最大值和最小值的标识大小设置,默认为1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AREASPLINES", t: "3", d: "生成嵌入在单元格内的面积图sparklines,一般用于描述数据的连续累积值走势", a: "生成单元格面积图", m: [1, 5], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "线条颜色", example: "#2ec7c9", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "填充颜色", example: "#CCF3F4", detail: "形成面积图,同线条颜色配置,默认0不显示", require: "o", repeat: "n", type: "rangeall" }, { name: "线条粗细", example: "1", detail: "折线图线段粗细,默认为1px", require: "o", repeat: "n", type: "rangeall" }, { name: "辅助线", example: "avg", detail: "一条横线,可以是min、max、avg、median、范围或自定义数值,默认0无", require: "o", repeat: "n", type: "rangeall" }, { name: "辅助线颜色", example: "#000", detail: "辅助线的颜色设置,同线条颜色配置,默认#000", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNSPLINES", t: "3", d: "生成嵌入在单元格内的垂直柱状图sparklines,一般用于描述离散数据之间的大小情况", a: "生成单元格垂直柱状图", m: [1, 6], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱条间隔", example: "1", detail: "柱条之间的间隔距离,默认为1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱条颜色", example: "#fc5c5c", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "负向柱条颜色", example: "#97b552", detail: "负向柱条颜色设置,代表负值的颜色,同柱条颜色配置,默认#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "柱图最大值,用于规范柱图长度,默认为自动计算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "调色板可以单独设置每个柱条的颜色,可设置多个,支持两种格式:1颜色例如#000,代表第一个柱的颜色是黑色;2数值范围:颜色,例如-2:#000表示数值为-2的柱为黑色,0:5:#000表示数值0-5的柱为黑色,默认为空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKCOLUMNSPLINES", t: "3", d: "生成嵌入在单元格内的累积垂直柱状图sparklines,一般用于描述离散数据多个维度的数值大小", a: "生成单元格累积垂直柱状图", m: [1, 5], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "按列堆积", example: "1", detail: "如果需要按行堆积则本项设为false或0,默认为是1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱条间隔", example: "1", detail: "柱条之间的间隔距离,默认为1", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "累积柱图最大值,用于规范柱图长度,默认为自动计算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "累积色板", example: "#97b552", detail: "调色板可以单独设置每个维度的柱条颜色,可设置为A1:A10等范围,默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BARSPLINES", t: "3", d: "生成嵌入在单元格内的横向条形图sparklines,一般用于描述离散数据之间的大小情况", a: "生成单元格横向条形图", m: [1, 6], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱条间隔", example: "1", detail: "柱条之间的间隔距离,默认为1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱条颜色", example: "#fc5c5c", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "负向柱条颜色", example: "#97b552", detail: "负向柱条颜色设置,代表负值的颜色,同柱条颜色配置,默认#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "柱图最大值,用于规范柱图长度,默认为自动计算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "调色板可以单独设置每个柱条的颜色,可设置多个,支持两种格式:1颜色例如#000,代表第一个柱的颜色是黑色;2数值范围:颜色,例如-2:#000表示数值为-2的柱为黑色,0:5:#000表示数值0-5的柱为黑色,默认为空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKBARSPLINES", t: "3", d: "生成嵌入在单元格内的累积横向条形图sparklines,一般用于描述离散数据多个维度的数值大小", a: "生成单元格累积横向条形图", m: [1, 5], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "按列堆积", example: "1", detail: "如果需要按行堆积则本项设为false或0,默认为是1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱条间隔", example: "1", detail: "柱条之间的间隔距离,默认为1", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "累积柱图最大值,用于规范柱图长度,默认为自动计算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "累积色板", example: "#97b552", detail: "调色板可以单独设置每个维度的柱条颜色,可设置为A1:A10等范围,默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "DISCRETESPLINES", t: "3", d: "生成嵌入在单元格内的离散图sparklines,一般用于描述离散数据走势", a: "生成单元格离散图", m: [1, 4], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "分割阈值", example: "1", detail: "离散图柱形颜色的区分,例如:该值为0,则大于0为蓝色,小于0为红色,默认为0", require: "o", repeat: "n", type: "rangeall" }, { name: "阈值以上颜色", example: "#2ec7c9", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "阈值以下颜色", example: "#fc5c5c", detail: "阈值以下柱条颜色设置,同阈值以上颜色,默认#fc5c5c", require: "o", repeat: "n", type: "rangeall" }] }, { n: "TRISTATESPLINES", t: "3", d: "生成嵌入在单元格内的三态图sparklines,一般用于描述三种态势的走势例如胜负平", a: "生成单元格三态图", m: [1, 6], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱条间隔", example: "1", detail: "柱条之间的间隔距离,默认为1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱条颜色", example: "#fc5c5c", detail: "线图的线条颜色,可以是否个范围A1、色表索引数值或者具体颜色值,设置为0或false则不显示,支持regx、rgb、rgba等。默认#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "负向柱条颜色", example: "#97b552", detail: "负向柱条颜色设置,代表负值的颜色,同柱条颜色配置,默认#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "零值柱条颜色", example: "#999", detail: "零值柱条颜色设置,代表0值颜色,同柱条颜色配置,默认#999", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "调色板可以单独设置每个柱条的颜色,可设置多个,支持两种格式:1颜色例如#000,代表第一个柱的颜色是黑色;2数值范围:颜色,例如-2:#000表示数值为-2的柱为黑色,0-5:#000表示数值0-5的柱为黑色,默认为空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PIESPLINES", t: "3", d: "生成嵌入在单元格内的饼图sparklines,一般用于描述数据占比", a: "生成单元格饼图", m: [1, 5], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "旋转角度", example: "0", detail: "饼图的旋转角度,默认为0", require: "o", repeat: "n", type: "rangeall" }, { name: "饼图边框", example: "0", detail: "饼图边框大小,默认为无0", require: "o", repeat: "n", type: "rangeall" }, { name: "边框颜色", example: "#000", detail: "饼图边框颜色,默认为#000", require: "o", repeat: "n", type: "rangeall" }, { name: "饼图色板", example: "#97b552", detail: "调色板可以设置切片的颜色,可设置为A1:A10等范围,默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BOXSPLINES", t: "3", d: "生成嵌入在单元格内的箱线图sparklines,一般用于描述数据集的统计分布", a: "生成单元格箱线图", m: [1, 4], p: [{ name: "数据范围", example: "A1:A20", detail: "数据范围,数值才能被有效计算,例如A1:A20 {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "离群点比例", example: "1.5", detail: "离群点的阈值范围,如果为0或false则不显示,默认为1.5倍", require: "o", repeat: "n", type: "rangeall" }, { name: "目标点值", example: "10", detail: "箱线图上的目标值设置,默认为false不显示", require: "o", repeat: "n", type: "rangeall" }, { name: "数据点大小", example: "1.5", detail: "目标点和离群点的半径大小设置,默认为1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "BULLETSPLINES", t: "3", d: "生成嵌入在单元格内的子弹图sparklines,一般用于描述任务达成率", a: "生成单元格子弹图", m: [2, 3], p: [{ name: "目标", example: "10", detail: "达成的目标值,数值才能被有效计算,例如A1, 100等。", require: "m", repeat: "n", type: "rangeall" }, { name: "实际完成", example: "8", detail: "目前完成值,数值才能被有效计算,例如A1, 100等。", require: "m", repeat: "n", type: "rangeall" }, { name: "对比值", example: "12", detail: "对比值,例如超额、最低、获奖底线等,数值才能被有效计算,例如A1, 100等。可以设置最多9个对比值", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMPOSESPLINES", t: "3", d: "支持多个类型的图画在同一个单元格,每个参数代表一个sparklines图", a: "组合sparklines图到一个单元格", m: [1, 1], p: [{ name: "图设置", example: "PIESPLINES(A1:A20)", detail: "sparklines图设置,例如A1:A20, 一个完成的饼图、线图设置等。", require: "m", repeat: "y", type: "rangeall" }] }, { n: "SORT", t: "14", d: "返回数组中元素的排序数组。返回的数组与提供的数组参数形状相同。", a: "返回数组中元素的排序数组。返回的数组与提供的数组参数形状相同。", m: [1, 4], p: [{ name: "array", detail: "要排序的范围或数组。", example: "A2:A17", require: "m", repeat: "n", type: "rangenumber" }, { name: "sort_index", detail: "[可选] - 表示要排序的行或列的数字。(默认row1/col1", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "sort_order", detail: "[可选] - 表示所需排序顺序的数字;1表示升序(默认),-1表示降序。", example: "-1", require: "o", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[可选] - 表示所需排序方向的逻辑值;按行排序为FALSE()(默认),按列排序为TRUE()。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FILTER", t: "14", d: "基于一个布尔(真/假)数组过滤一个数组。", a: "基于一个布尔(真/假)数组过滤一个数组。", m: [2, 3], p: [{ name: "array", detail: "要筛选的数组或范围。", example: "A5:D20", require: "m", repeat: "n", type: "range" }, { name: "include", detail: "布尔数组,其高度或宽度与数组相同", example: "1", require: "m", repeat: "n", type: "range" }, { name: "if_empty", detail: "[可选] - 如果包含数组中的所有值都为空(filter不返回任何值),则返回的值。", example: '""', require: "o", repeat: "n", type: "rangeall" }] }, { n: "UNIQUE", t: "14", d: "返回列表或区域中的唯一值的列表。", a: "返回列表或区域中的唯一值的列表。", m: [1, 3], p: [{ name: "array", detail: "从其返回唯一值的数组或区域。", example: "A2:B26", require: "m", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[可选] - 逻辑值,指示如何比较;按行 = FALSE() 或省略;按列 = TRUE()。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "occurs_once", detail: "[可选] - 逻辑值,仅返回唯一值中出现一次 = TRUE();包括所有唯一值 = FALSE() 或省略。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANDARRAY", t: "14", d: "返回 0 到 1 之间的随机数字数组。", a: "返回 0 到 1 之间的随机数字数组。", m: [0, 2], p: [{ name: "rows", detail: "[可选] - 要返回的行数。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "[可选] - 要返回的列数。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SEQUENCE", t: "14", d: "生成数字序列的列表。", a: "生成数字序列的列表。", m: [1, 4], p: [{ name: "rows", detail: "要返回的行数。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "[可选] - 要返回的列数。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "start", detail: "[可选] - 序列中的第一个数字。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "step", detail: "[可选] - 序列中每个序列值的增量。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "EVALUATE", t: "3", d: "对以文字表示的公式或者表达式求值,并返回结果。", a: "根据文字公式或者表达式求值。", m: [1, 1], p: [{ name: "公式", example: '"A1+5*2^2"', detail: "公式或表达式", require: "m", repeat: "n", type: "rangeall" }] }], toolbar: { undo: "撤销", redo: "重做", paintFormat: "格式刷", currencyFormat: "货币格式", percentageFormat: "百分比格式", numberDecrease: "减少小数位数", numberIncrease: "增加小数位数", moreFormats: "更多格式", font: "字体", fontSize: "字号大小", bold: "粗体 (Ctrl+B)", italic: "斜体 (Ctrl+I)", strikethrough: "删除线 (Alt+Shift+5)", underline: "下划线", textColor: "文本颜色", chooseColor: "颜色选择", resetColor: "重置颜色", customColor: "自定义", alternatingColors: "交替颜色", confirmColor: "确定颜色", cancelColor: "取消", collapse: "收起", fillColor: "单元格颜色", border: "边框", borderStyle: "边框类型", mergeCell: "合并单元格", chooseMergeType: "选择合并类型", horizontalAlign: "水平对齐", verticalAlign: "垂直对齐", alignment: "对齐方式", textWrap: "文本换行", textWrapMode: "换行方式", textRotate: "文本旋转", textRotateMode: "旋转方式", freezeTopRow: "冻结首行", sortAndFilter: "排序和筛选", findAndReplace: "查找替换", sum: "求和", autoSum: "自动求和", moreFunction: "更多函数", conditionalFormat: "条件格式", postil: "批注", pivotTable: "数据透视表", chart: "图表", screenshot: "截图", splitColumn: "分列", insertImage: "插入图片", insertLink: "插入链接", dataVerification: "数据验证", protection: "保护工作表内容", clearText: "清除颜色选择", noColorSelectedText: "没有颜色被选择", toolMore: "更多", toolLess: "少于", toolClose: "收起", toolMoreTip: "更多功能", moreOptions: "更多选项", cellFormat: "设置单元格格式", print: "打印" }, alternatingColors: { applyRange: "应用范围", selectRange: "选择应用范围", header: "页眉", footer: "页脚", errorInfo: "不能对多重选择区域执行此操作,请选择单个区域,然后再试", textTitle: "格式样式", custom: "自定义", close: "关闭", selectionTextColor: "选择文本颜色", selectionCellColor: "选择单元格颜色", removeColor: "移除交替颜色", colorShow: "颜色", currentColor: "当前颜色", tipSelectRange: "请选择交替颜色应用范围", errorNoRange: "您选择的应用范围不是选区!", errorExistColors: "您选择的应用范围已存在交替颜色且不属于你要编辑的应用范围!" }, button: { confirm: "确定", cancel: "取消", close: "关闭", update: "Update", delete: "Delete", insert: "新建" }, paint: { start: "格式刷开启", end: "ESC键退出", tipSelectRange: "请选择需要复制格式的区域", tipNotMulti: "无法对多重选择区域执行此操作" }, format: { moreCurrency: "更多货币格式", moreDateTime: "更多日期与时间格式", moreNumber: "更多数字格式", titleCurrency: "货币格式", decimalPlaces: "小数位数", titleDateTime: "日期与时间格式", titleNumber: "数字格式" }, info: { detailUpdate: "新打开", detailSave: "已恢复本地缓存", row: "行", column: "列", loading: "渲染中", copy: "副本", return: "返回", rename: "重命名", tips: "表格重命名", noName: "无标题的电子表格", wait: "待更新", add: "添加", addLast: "在底部添加", backTop: "回到顶部", pageInfo: "共${total}条,${totalPage}页,当前已显示${currentPage}页", nextPage: "下一页", tipInputNumber: "请输入数字", tipInputNumberLimit: "增加范围限制在1-100", tipRowHeightLimit: "行高必须在0 ~ 545之间", tipColumnWidthLimit: "列宽必须在0 ~ 2038之间", pageInfoFull: "共${total}条,${totalPage}页,已显示全部数据" }, currencyDetail: { RMB: "人民币", USdollar: "美元", EUR: "欧元", GBP: "英镑", HK: "港元", JPY: "日元", AlbanianLek: "阿尔巴尼亚列克", AlgerianDinar: "阿尔及利亚第纳尔", Afghani: "阿富汗尼", ArgentinePeso: "阿根廷比索", UnitedArabEmiratesDirham: "阿拉伯联合酋长国迪拉姆", ArubanFlorin: "阿鲁巴弗罗林", OmaniRial: "阿曼里亚尔", Azerbaijanimanat: "阿塞拜疆马纳特", EgyptianPound: "埃及镑", EthiopianBirr: "埃塞俄比亚比尔", AngolaKwanza: "安哥拉宽扎", AustralianDollar: "澳大利亚元", Patacas: "澳门元", BarbadosDollar: "巴巴多斯元", PapuaNewGuineaKina: "巴布亚新几内亚基那", BahamianDollar: "巴哈马元", PakistanRupee: "巴基斯坦卢比", ParaguayanGuarani: "巴拉圭瓜拉尼", BahrainiDinar: "巴林第纳尔", PanamanianBalboa: "巴拿马巴波亚", Brazilianreal: "巴西里亚伊", Belarusianruble: "白俄罗斯卢布", BermudianDollar: "百慕大元", BulgarianLev: "保加利亚列弗", IcelandKrona: "冰岛克朗", BosniaHerzegovinaConvertibleMark: "波黑可兑换马克", PolishZloty: "波兰兹罗提", Boliviano: "玻利维亚诺", BelizeDollar: "伯利兹元", BotswanaPula: "博茨瓦纳普拉", NotDannuzhamu: "不丹努扎姆", BurundiFranc: "布隆迪法郎", NorthKoreanWon: "朝鲜圆", DanishKrone: "丹麦克朗", EastCaribbeanDollar: "东加勒比元", DominicaPeso: "多米尼加比索", RussianRuble: "俄国卢布", EritreanNakfa: "厄立特里亚纳克法", CFAfranc: "非洲金融共同体法郎", PhilippinePeso: "菲律宾比索", FijiDollar: "斐济元", CapeVerdeEscudo: "佛得角埃斯库多", FalklandIslandsPound: "福克兰群岛镑", GambianDalasi: "冈比亚达拉西", Congolesefranc: "刚果法郎", ColombianPeso: "哥伦比亚比索", CostaRicanColon: "哥斯达黎加科朗", CubanPeso: "古巴比索", Cubanconvertiblepeso: "古巴可兑换比索", GuyanaDollar: "圭亚那元", KazakhstanTenge: "哈萨克斯坦坚戈", Haitiangourde: "海地古德", won: "韩元", NetherlandsAntillesGuilder: "荷属安的列斯盾", Honduraslempiras: "洪都拉斯拉伦皮拉", DjiboutiFranc: "吉布提法郎", KyrgyzstanSom: "吉尔吉斯斯坦索姆", GuineaFranc: "几内亚法郎", CanadianDollar: "加拿大元", GhanaianCedi: "加纳塞地", Cambodianriel: "柬埔寨瑞尔", CzechKoruna: "捷克克朗", ZimbabweDollar: "津巴布韦元", QatariRiyal: "卡塔尔里亚尔", CaymanIslandsDollar: "开曼群岛元", Comorianfranc: "科摩罗法郎", KuwaitiDinar: "科威特第纳尔", CroatianKuna: "克罗地亚库纳", KenyanShilling: "肯尼亚先令", LesothoLoti: "莱索托洛蒂", LaoKip: "老挝基普", LebanesePound: "黎巴嫩镑", Lithuanianlitas: "立陶宛立特", LibyanDinar: "利比亚第纳尔", LiberianDollar: "利比亚元", RwandaFranc: "卢旺达法郎", RomanianLeu: "罗马尼亚列伊", MalagasyAriary: "马达加斯加阿里亚里", MaldivianRufiyaa: "马尔代夫拉菲亚", MalawiKwacha: "马拉维克瓦查", MalaysianRinggit: "马来西亚林吉特", MacedoniawearingDinar: "马其顿戴第纳尔", MauritiusRupee: "毛里求斯卢比", MauritanianOuguiya: "毛里塔尼亚乌吉亚", MongolianTugrik: "蒙古图格里克", BangladeshiTaka: "孟加拉塔卡", PeruvianNuevoSol: "秘鲁新索尔", MyanmarKyat: "缅甸开亚特", MoldovanLeu: "摩尔多瓦列伊", MoroccanDirham: "摩洛哥迪拉姆", MozambiqueMetical: "莫桑比克梅蒂卡尔", MexicanPeso: "墨西哥比索", NamibianDollar: "纳米比亚元", SouthAfricanRand: "南非兰特", SouthSudanesePound: "南苏丹镑", NicaraguaCordoba: "尼加拉瓜科多巴", NepaleseRupee: "尼泊尔卢比", NigerianNaira: "尼日利亚奈拉", NorwegianKrone: "挪威克朗", GeorgianLari: "乔治亚拉瑞", RMBOffshore: "人民币(离岸)", SwedishKrona: "瑞典克朗", SwissFranc: "瑞士法郎", SerbianDinar: "塞尔维亚第纳尔", SierraLeone: "塞拉利昂利昂", SeychellesRupee: "塞舌尔卢比", SaudiRiyal: "沙特里亚尔", SaoTomeDobra: "圣多美多布拉", SaintHelenapound: "圣赫勒拿群岛磅", SriLankaRupee: "斯里兰卡卢比", SwazilandLilangeni: "斯威士兰里兰吉尼", SudanesePound: "苏丹镑", Surinamesedollar: "苏里南元", SolomonIslandsDollar: "所罗门群岛元", SomaliShilling: "索马里先令", TajikistanSomoni: "塔吉克斯坦索莫尼", PacificFranc: "太平洋法郎", ThaiBaht: "泰国铢", TanzanianShilling: "坦桑尼亚先令", TonganPaanga: "汤加潘加", TrinidadandTobagoDollar: "特立尼达和多巴哥元", TunisianDinar: "突尼斯第纳尔", TurkishLira: "土耳其里拉", VanuatuVatu: "瓦努阿图瓦图", GuatemalanQuetzal: "危地马拉格查尔", CommissionBolivar: "委内瑞拉博利瓦", BruneiDollar: "文莱元", UgandanShilling: "乌干达先令", UkrainianHryvnia: "乌克兰格里夫尼亚", UruguayanPeso: "乌拉圭比索", Uzbekistansom: "乌兹别克斯坦苏姆", WesternSamoaTala: "西萨摩亚塔拉", SingaporeDollar: "新加坡元", NT: "新台币", NewZealandDollar: "新西兰元", HungarianForint: "匈牙利福林", SyrianPound: "叙利亚镑", JamaicanDollar: "牙买加元", ArmenianDram: "亚美尼亚德拉姆", YemeniRial: "也门里亚尔", IraqiDinar: "伊拉克第纳尔", IranianRial: "伊朗里亚尔", NewIsraeliShekel: "以色列新谢克尔", IndianRupee: "印度卢比", IndonesianRupiah: "印度尼西亚卢比", JordanianDinar: "约旦第纳尔", VND: "越南盾", ZambianKwacha: "赞比亚克瓦查", GibraltarPound: "直布罗陀镑", ChileanPeso: "智利比索", CFAFrancBEAC: "中非金融合作法郎" }, defaultFmt: [{ text: "自动", value: "General", example: "" }, { text: "纯文本", value: "@", example: "" }, { text: "", value: "split", example: "" }, { text: "数字", value: "##0.00", example: "1000.12" }, { text: "百分比", value: "#0.00%", example: "12.21%" }, { text: "科学计数", value: "0.00E+00", example: "1.01E+5" }, { text: "", value: "split", example: "" }, { text: "会计", value: "¥(0.00)", example: "¥(1200.09)" }, { text: "万元", value: "w", example: "1亿2000万2500" }, { text: "货币", value: "¥0.00", example: "¥1200.09" }, { text: "万元2位小数", value: "w0.00", example: "2万2500.55" }, { text: "", value: "split", example: "" }, { text: "日期", value: "yyyy-MM-dd", example: "2017-11-29" }, { text: "时间", value: "hh:mm AM/PM", example: "3:00 PM" }, { text: "时间24H", value: "hh:mm", example: "15:00" }, { text: "日期时间", value: "yyyy-MM-dd hh:mm AM/PM", example: "2017-11-29 3:00 PM" }, { text: "日期时间24H", value: "yyyy-MM-dd hh:mm", example: "2017-11-29 15:00" }, { text: "", value: "split", example: "" }, { text: "自定义格式", value: "fmtOtherSelf", example: "more" }], 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" }], fontFamily: { MicrosoftYaHei: "Microsoft YaHei" }, fontarray: ["Times New Roman", "Arial", "Tahoma", "Verdana", "微软雅黑", "宋体", "黑体", "楷体", "仿宋", "新宋体", "华文新魏", "华文行楷", "华文隶书"], fontjson: { "times new roman": 0, arial: 1, tahoma: 2, verdana: 3, "微软雅黑": 4, "microsoft yahei": 4, "宋体": 5, simsun: 5, "黑体": 6, simhei: 6, "楷体": 7, kaiti: 7, "仿宋": 8, fangsong: 8, "新宋体": 9, nsimsun: 9, "华文新魏": 10, stxinwei: 10, "华文行楷": 11, stxingkai: 11, "华文隶书": 12, stliti: 12 }, border: { borderTop: "上框线", borderBottom: "下框线", borderLeft: "左框线", borderRight: "右框线", borderNone: "无", borderAll: "所有", borderOutside: "外侧", borderInside: "内侧", borderHorizontal: "内侧横线", borderVertical: "内侧竖线", borderColor: "边框颜色", borderSize: "边框粗细" }, merge: { mergeAll: "全部合并", mergeV: "垂直合并", mergeH: "水平合并", mergeCancel: "取消合并", overlappingError: "不能合并重叠区域", partiallyError: "无法对部分合并单元格执行此操作" }, align: { left: "左对齐", center: "中间对齐", right: "右对齐", top: "顶部对齐", middle: "居中对齐", bottom: "底部对齐" }, textWrap: { overflow: "溢出", wrap: "自动换行", clip: "截断" }, rotation: { none: "无旋转", angleup: "向上倾斜", angledown: "向下倾斜", vertical: "竖排文字", rotationUp: "向上90°", rotationDown: "向下90°" }, freezen: { default: "冻结首行", freezenRow: "冻结首行", freezenColumn: "冻结首列", freezenRC: "冻结行列", freezenRowRange: "冻结行到选区", freezenColumnRange: "冻结列到选区", freezenRCRange: "冻结行列到选区", freezenCancel: "取消冻结", noSeletionError: "没有选区" }, sort: { asc: "升序", desc: "降序", custom: "自定义排序", hasTitle: "数据具有标题行", sortBy: "排序依据", addOthers: "添加其他排序列", close: "关闭", confirm: "排序", columnOperation: "列", secondaryTitle: "次要排序", sortTitle: "排序范围", sortRangeTitle: "排序范围从", sortRangeTitleTo: "到", noRangeError: "不能对多重选择区域执行此操作,请选择单个区域,然后再试", mergeError: "选区有合并单元格,无法执行此操作!" }, filter: (mn = { filter: "筛选", clearFilter: "清除筛选", sortByAsc: "以A-Z升序排列", sortByDesc: "以Z-A降序排列", filterByColor: "按颜色筛选", filterByCondition: "按条件过滤", filterByValues: "按值过滤", filiterInputNone: "无", filiterInputTip: "输入筛选值", filiterRangeStartTip: "范围开始", filiterRangeEndTip: "范围结束", filterValueByAllBtn: "全选", filterValueByClearBtn: "清除", filterValueByInverseBtn: "反选", filterValueByTip: "按照值进行筛选", filterConform: "确 认", filterCancel: "取 消" }, Ia(mn, "clearFilter", "清除筛选"), Ia(mn, "conditionNone", "无"), Ia(mn, "conditionCellIsNull", "单元格为空"), Ia(mn, "conditionCellNotNull", "单元格有数据"), Ia(mn, "conditionCellTextContain", "文本包含"), Ia(mn, "conditionCellTextNotContain", "文本不包含"), Ia(mn, "conditionCellTextStart", "文本开头为"), Ia(mn, "conditionCellTextEnd", "文本结尾为"), Ia(mn, "conditionCellTextEqual", "文本等于"), Ia(mn, "conditionCellDateEqual", "日期等于"), Ia(mn, "conditionCellDateBefore", "日期早于"), Ia(mn, "conditionCellDateAfter", "日期晚于"), Ia(mn, "conditionCellGreater", "大于"), Ia(mn, "conditionCellGreaterEqual", "大于等于"), Ia(mn, "conditionCellLess", "小于"), Ia(mn, "conditionCellLessEqual", "小于等于"), Ia(mn, "conditionCellEqual", "等于"), Ia(mn, "conditionCellNotEqual", "不等于"), Ia(mn, "conditionCellBetween", "介于"), Ia(mn, "conditionCellNotBetween", "不在其中"), Ia(mn, "filiterMoreDataTip", "数据量大!请稍后"), Ia(mn, "filiterMonthText", "月"), Ia(mn, "filiterYearText", "年"), Ia(mn, "filiterByColorTip", "按单元格颜色筛选"), Ia(mn, "filiterByTextColorTip", "按单元格字体颜色筛选"), Ia(mn, "filterContainerOneColorTip", "本列仅包含一种颜色"), Ia(mn, "filterDateFormatTip", "日期格式"), Ia(mn, "valueBlank", "(空白)"), Ia(mn, "mergeError", "筛选选区有合并单元格,无法执行此操作!"), mn), rightclick: { copy: "复制", copyAs: "复制为", paste: "粘贴", insert: "插入", delete: "删除", deleteCell: "删除单元格", deleteSelected: "删除选中", hide: "隐藏", hideSelected: "隐藏选中", showHide: "显示隐藏", to: "向", left: "左", right: "右", top: "上", bottom: "下", moveLeft: "左移", moveUp: "上移", add: "增加", row: "行", column: "列", width: "宽", height: "高", number: "数字", confirm: "确认", orderAZ: "A-Z顺序排列", orderZA: "Z-A降序排列", clearContent: "清除内容", matrix: "矩阵操作选区", sortSelection: "排序选区", filterSelection: "筛选选区", chartGeneration: "图表生成", firstLineTitle: "首行为标题", untitled: "无标题", array1: "一维数组", array2: "二维数组", array3: "多维数组", diagonal: "对角线", antiDiagonal: "反对角线", diagonalOffset: "对角偏移", offset: "偏移量", boolean: "布尔值", flip: "翻转", upAndDown: "上下", leftAndRight: "左右", clockwise: "顺时针", counterclockwise: "逆时针", transpose: "转置", matrixCalculation: "矩阵计算", plus: "加", minus: "减", multiply: "乘", divided: "除", power: "次方", root: "次方根", log: "log", delete0: "删除两端0值", removeDuplicate: "删除重复值", byRow: "按行", byCol: "按列", generateNewMatrix: "生成新矩阵" }, comment: { insert: "新建批注", edit: "编辑批注", delete: "删除", showOne: "显示/隐藏批注", showAll: "显示/隐藏所有批注" }, screenshot: { screenshotTipNoSelection: "请框选需要截图的范围", screenshotTipTitle: "提示!", screenshotTipHasMerge: "无法对合并单元格执行此操作", screenshotTipHasMulti: "无法对多重选择区域执行此操作", screenshotTipSuccess: "截取成功", screenshotImageName: "截图", downLoadClose: "关闭", downLoadCopy: "复制到剪切板", downLoadBtn: "下载", browserNotTip: "下载功能IE浏览器不支持!", rightclickTip: "请在图片上右键点击'复制'", successTip: "已成功复制(如果粘贴失败,请在图片上右键点击'复制图片'" }, splitText: { splitDelimiters: "分割符号", splitOther: "其它", splitContinueSymbol: "连续分隔符号视为单个处理", splitDataPreview: "数据预览", splitTextTitle: "文本分列", splitConfirmToExe: "此处已有数据,是否替换它?", tipNoMulti: "不能对多重选择区域执行此操作,请选择单个区域,然后再试", tipNoMultiColumn: "一次只能转换一列数据,选定区域可以有多行,但不能有多列,请在选定单列区域以后再试" }, imageText: { imageSetting: "图片设置", close: "关闭", conventional: "常规", moveCell1: "移动并调整单元格大小", moveCell2: "移动并且不调整单元格的大小", moveCell3: "不要移动单元格并调整其大小", fixedPos: "固定位置", border: "边框", width: "宽度", radius: "半径", style: "样式", solid: "实线", dashed: "虚线", dotted: "点状", double: "双线", color: "颜色" }, punctuation: { tab: "Tab 键", semicolon: "分号", comma: "逗号", space: "空格" }, findAndReplace: { find: "查找", replace: "替换", goto: "转到", location: "定位条件", formula: "公式", date: "日期", number: "数字", string: "字符", error: "错误", condition: "条件格式", rowSpan: "间隔行", columnSpan: "间隔列", locationExample: "定位", lessTwoRowTip: "请选择最少两行", lessTwoColumnTip: "请选择最少两行", findTextbox: "查找内容", replaceTextbox: "替换内容", regexTextbox: "正则表达式匹配", wholeTextbox: "整词匹配", distinguishTextbox: "区分大小写匹配", allReplaceBtn: "全部替换", replaceBtn: "替换", allFindBtn: "查找全部", findBtn: "查找下一个", noFindTip: "没有查找到该内容", modeTip: "该模式下不可进行此操作", searchTargetSheet: "工作表", searchTargetCell: "单元格", searchTargetValue: "值", searchInputTip: "请输入查找内容", noReplceTip: "没有可替换的内容", noMatchTip: "找不到匹配项", successTip: "已经帮您搜索并进行了${xlength}处替换", locationConstant: "常量", locationFormula: "公式", locationDate: "日期", locationDigital: "数字", locationString: "字符", locationBool: "逻辑值", locationError: "错误", locationNull: "空值", locationCondition: "条件格式", locationRowSpan: "间隔行", locationColumnSpan: "间隔列", locationTiplessTwoRow: "请选择最少两行", locationTiplessTwoColumn: "请选择最少两列", locationTipNotFindCell: "未找到单元格" }, sheetconfig: { delete: "删除", copy: "复制", rename: "重命名", changeColor: "更改颜色", hide: "隐藏", unhide: "取消隐藏", moveLeft: "向左移", moveRight: "向右移", resetColor: "重置颜色", cancelText: "取消", chooseText: "确定颜色", tipNameRepeat: "标签页的名称不能重复!请重新修改", noMoreSheet: "工作薄内至少含有一张可视工作表。若需删除选定的工作表,请先插入一张新工作表或显示一张隐藏的工作表。", confirmDelete: "是否删除", redoDelete: "可以通过Ctrl+Z撤销删除", noHide: "不能隐藏, 至少保留一个sheet标签", chartEditNoOpt: "图表编辑模式下不允许该操作!", sheetNameSpecCharError: "名称不能超过31个字符,首尾不能是' 且名称不能包含:\r\n[ ] : \\ ? * /", sheetNamecannotIsEmptyError: "名称不能为空" }, conditionformat: { conditionformat_greaterThan: "条件格式——大于", conditionformat_greaterThan_title: "为大于以下值的单元格设置格式", conditionformat_lessThan: "条件格式——小于", conditionformat_lessThan_title: "为小于以下值的单元格设置格式", conditionformat_betweenness: "条件格式——介于", conditionformat_betweenness_title: "为介于以下值的单元格设置格式", conditionformat_equal: "条件格式——等于", conditionformat_equal_title: "为等于以下值的单元格设置格式", conditionformat_textContains: "条件格式——文本包含", conditionformat_textContains_title: "为包含以下文本的单元格设置格式", conditionformat_occurrenceDate: "条件格式——发生日期", conditionformat_occurrenceDate_title: "为包含以下日期的单元格设置格式", conditionformat_duplicateValue: "条件格式——重复值", conditionformat_duplicateValue_title: "为包含以下类型值的单元格设置格式", conditionformat_top10: "条件格式——前 10 项", conditionformat_top10_percent: "条件格式——前 10%", conditionformat_top10_title: "为值最大的那些单元格设置格式", conditionformat_last10: "条件格式——最后 10 项", conditionformat_last10_percent: "条件格式——最后 10%", conditionformat_last10_title: "为值最小的那些单元格设置格式", conditionformat_AboveAverage: "条件格式——高于平均值", conditionformat_AboveAverage_title: "为高于平均值的单元格设置格式", conditionformat_SubAverage: "条件格式——低于平均值", conditionformat_SubAverage_title: "为低于平均值的单元格设置格式", rule: "规则", newRule: "新建规则", editRule: "编辑规则", deleteRule: "删除规则", deleteCellRule: "清除所选单元格的规则", deleteSheetRule: "清除整个工作表的规则", manageRules: "管理规则", showRules: "显示其格式规则", highlightCellRules: "突出显示单元格规则", itemSelectionRules: "项目选取规则", conditionformatManageRules: "条件格式规则管理器", format: "格式", setFormat: "设置格式", setAs: "设置为", setAsByArea: "针对选定区域,设置为", applyRange: "应用范围", selectRange: "点击选择应用范围", selectRange_percent: "所选范围的百分比", selectRange_average: "选定范围的平均值", selectRange_value: "选定范围中的数值", pleaseSelectRange: "请选择应用范围", selectDataRange: "点击选择数据范围", selectCell: "选择单元格", pleaseSelectCell: "请选择单元格", pleaseSelectADate: "请选择日期", pleaseEnterInteger: "请输入一个介于 1 和 1000 之间的整数", onlySingleCell: "只能对单个单元格进行引用", conditionValueCanOnly: "条件值只能是数字或者单个单元格", ruleTypeItem1: "基于各自值设置所有单元格的格式", ruleTypeItem2: "只为包含以下内容的单元格设置格式", ruleTypeItem2_title: "只为满足以下条件的单元格", ruleTypeItem3: "仅对排名靠前或靠后的数值设置格式", ruleTypeItem3_title: "为以下排名内的值", ruleTypeItem4: "仅对高于或低于平均值的数值设置格式", ruleTypeItem4_title: "为满足以下条件的值", ruleTypeItem5: "仅对唯一值或重复值设置格式", ruleTypeItem6: "使用公式确定要设置格式的单元格", formula: "公式", textColor: "文本颜色", cellColor: "单元格颜色", confirm: "确定", confirmColor: "确定颜色", cancel: "取消", close: "关闭", clearColorSelect: "清除颜色选择", sheet: "表", currentSheet: "当前工作表", dataBar: "数据条", dataBarColor: "数据条颜色", gradientDataBar_1: "蓝-白渐变数据条", gradientDataBar_2: "绿-白渐变数据条", gradientDataBar_3: "红-白渐变数据条", gradientDataBar_4: "橙-白渐变数据条", gradientDataBar_5: "浅蓝-白渐变数据条", gradientDataBar_6: "紫-白渐变数据条", solidColorDataBar_1: "蓝色数据条", solidColorDataBar_2: "绿色数据条", solidColorDataBar_3: "红色数据条", solidColorDataBar_4: "橙色数据条", solidColorDataBar_5: "浅蓝色数据条", solidColorDataBar_6: "紫色数据条", colorGradation: "色阶", colorGradation_1: "绿-黄-红色阶", colorGradation_2: "红-黄-绿色阶", colorGradation_3: "绿-白-红色阶", colorGradation_4: "红-白-绿色阶", colorGradation_5: "蓝-白-红色阶", colorGradation_6: "红-白-蓝色阶", colorGradation_7: "白-红色阶", colorGradation_8: "红-白色阶", colorGradation_9: "绿-白色阶", colorGradation_10: "白-绿色阶", colorGradation_11: "绿-黄色阶", colorGradation_12: "黄-绿色阶", icons: "图标集", pleaseSelectIcon: "请点击选择一组图标:", cellValue: "单元格值", specificText: "特定文本", occurrence: "发生日期", greaterThan: "大于", lessThan: "小于", between: "介于", equal: "等于", in: "和", to: "到", between2: "之间", contain: "包含", textContains: "文本包含", duplicateValue: "重复值", uniqueValue: "唯一值", top: "前", top10: "前 10 项", top10_percent: "前 10%", last: "后", last10: "后 10 项", last10_percent: "后 10%", oneself: "个", above: "高于", aboveAverage: "高于平均值", below: "低于", belowAverage: "低于平均值", all: "全部", yesterday: "昨天", today: "今天", tomorrow: "明天", lastWeek: "上周", thisWeek: "本周", lastMonth: "上月", thisMonth: "本月", lastYear: "去年", thisYear: "本年", last7days: "最近7天", last30days: "最近30天", next7days: "未来7天", next30days: "未来30天", next60days: "未来60天", chooseRuleType: "选择规则类型", editRuleDescription: "编辑规则说明", newFormatRule: "新建格式规则", editFormatRule: "编辑格式规则", formatStyle: "格式样式", fillType: "填充类型", color: "颜色", twocolor: "双色", tricolor: "三色", multicolor: "彩色", grayColor: "灰色", gradient: "渐变", solid: "实心", maxValue: "最大值", medianValue: "中间值", minValue: "最小值", direction: "方向", threeWayArrow: "三向箭头", fourWayArrow: "四向箭头", fiveWayArrow: "五向箭头", threeTriangles: "3个三角形", shape: "形状", threeColorTrafficLight: "三色交通灯", fourColorTrafficLight: "四色交通灯", threeSigns: "三标志", greenRedBlackGradient: "绿-红-黑渐变", rimless: "无边框", bordered: "有边框", mark: "标记", threeSymbols: "三个符号", tricolorFlag: "三色旗", circled: "有圆圈", noCircle: "无圆圈", grade: "等级", grade4: "四等级", grade5: "五等级", threeStars: "3个星形", fiveQuadrantDiagram: "五象限图", fiveBoxes: "5个框" }, insertLink: { linkText: "文本", linkType: "链接类型", external: "外部链接", internal: "内部链接", linkAddress: "链接地址", linkSheet: "工作表", linkCell: "单元格引用", linkTooltip: "提示", placeholder1: "请输入网页链接地址", placeholder2: "请输入要引用的单元格,例A1", placeholder3: "请输入提示内容", tooltipInfo1: "请输入有效的链接", tooltipInfo2: "请输入正确的单元格引用" }, dataVerification: { cellRange: "单元格范围", selectCellRange: "点击选择单元格范围", selectCellRange2: "请选择单元格范围", verificationCondition: "验证条件", dropdown: "下拉列表", checkbox: "复选框", number: "数字", number_integer: "数字-整数", number_decimal: "数字-小数", text_content: "文本-内容", text_length: "文本-长度", date: "日期", validity: "有效性", placeholder1: "请输入选项,以英文逗号分隔,如1,2,3,4,5", placeholder2: "请输入内容", placeholder3: "数值,如10", placeholder4: "请输入指定的文本", placeholder5: "请输入选中单元格时显示的提示语", selected: "选择时", notSelected: "未选择", between: "介于", notBetween: "不介于", equal: "等于", notEqualTo: "不等于", moreThanThe: "大于", lessThan: "小于", greaterOrEqualTo: "大于等于", lessThanOrEqualTo: "小于等于", include: "包括", exclude: "不包括", earlierThan: "早于", noEarlierThan: "不早于", laterThan: "晚于", noLaterThan: "不晚于", identificationNumber: "身份证号码", phoneNumber: "手机号", remote: "自动远程获取选项", prohibitInput: "输入数据无效时禁止输入", hintShow: "选中单元格时显示提示语", deleteVerification: "删除验证", tooltipInfo1: "下拉列表选项不可为空", tooltipInfo2: "复选框内容不可为空", tooltipInfo3: "输入的值不是数值类型", tooltipInfo4: "数值2不能小于数值1", tooltipInfo5: "文本内容不能为空", tooltipInfo6: "输入的值不是日期类型", tooltipInfo7: "日期2不能小于日期1" }, formula: { sum: "求和", average: "平均值", count: "计数", max: "最大值", min: "最小值", ifGenerate: "if公式生成器", find: "更多函数", tipNotBelongToIf: "该单元格函数不属于if公式!", tipSelectCell: "请选择单元格插入函数", ifGenCompareValueTitle: "比较值", ifGenSelectCellTitle: "点击选择单元格", ifGenRangeTitle: "范围", ifGenRangeTo: "至", ifGenRangeEvaluate: "范围评估", ifGenSelectRangeTitle: "点击选择范围", ifGenCutWay: "划分方式", ifGenCutSame: "划分值相同", ifGenCutNpiece: "划分为N份", ifGenCutCustom: "自定义输入", ifGenCutConfirm: "生成", ifGenTipSelectCell: "选择单元格", ifGenTipSelectCellPlace: "请选择单元格", ifGenTipSelectRange: "选择单范围", ifGenTipSelectRangePlace: "请选择范围", ifGenTipNotNullValue: "比较值不能为空!", ifGenTipLableTitile: "标签", ifGenTipRangeNotforNull: "范围不能为空!", ifGenTipCutValueNotforNull: "划分值不能为空!", ifGenTipNotGenCondition: "没有生成可用的条件!" }, formulaMore: { valueTitle: "值", tipSelectDataRange: "选取数据范围", tipDataRangeTile: "数据范围", findFunctionTitle: "查找函数", tipInputFunctionName: "请输入您要查找的函数名称或函数功能的简要描述", Array: "数组", Database: "数据源", Date: "日期", Engineering: "工程计算", Filter: "过滤器", Financial: "财务", luckysheet: "Luckysheet内置", other: "其它", Logical: "逻辑", Lookup: "查找", Math: "数学", Operator: "运算符", Parser: "转换工具", Statistical: "统计", Text: "文本", dataMining: "数据挖掘", selectFunctionTitle: "选择函数", calculationResult: "计算结果", tipSuccessText: "成功", tipParamErrorText: "参数类型错误", helpClose: "关闭", helpCollapse: "收起", helpExample: "示例", helpAbstract: "摘要", execfunctionError: '提示", "公式存在错误', execfunctionSelfError: "公式不可引用其本身的单元格", execfunctionSelfErrorResult: "公式不可引用其本身的单元格,会导致计算结果不准确", allowRepeatText: "可重复", allowOptionText: "可选", selectCategory: "或选择类别" }, drag: { noMerge: "无法对合并单元格执行此操作", affectPivot: "无法对所选单元格进行此更改,因为它会影响数据透视表!", noMulti: "无法对多重选择区域执行此操作,请选择单个区域", noPaste: "无法在此处粘贴此内容,请选择粘贴区域的一个单元格,然后再次尝试粘贴", noPartMerge: "无法对部分合并单元格执行此操作", inputCorrect: "请输入正确的数值", notLessOne: "行列数不能小于1", offsetColumnLessZero: "偏移列不能为负数!", pasteMustKeybordAlert: "Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut", pasteMustKeybordAlertHTMLTitle: "Copy and paste in the Sheet", pasteMustKeybordAlertHTML: "<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut" }, pivotTable: { title: "数据透视表", closePannel: "关闭", editRange: "编辑范围", tipPivotFieldSelected: "选择需要添加到数据透视表的字段", tipClearSelectedField: "清除所有已选字段", btnClearSelectedField: "清除", btnFilter: "筛选", titleRow: "行", titleColumn: "列", titleValue: "数值", tipShowColumn: "统计字段显示为列", tipShowRow: "统计字段显示为行", titleSelectionDataRange: "选取数据范围", titleDataRange: "数据范围", valueSum: "总计", valueStatisticsSUM: "求和", valueStatisticsCOUNT: "数值计数", valueStatisticsCOUNTA: "计数", valueStatisticsCOUNTUNIQUE: "去重计数", valueStatisticsAVERAGE: "平均值", valueStatisticsMAX: "最大值", valueStatisticsMIN: "最小值", valueStatisticsMEDIAN: "中位数", valueStatisticsPRODUCT: "乘积", valueStatisticsSTDEV: "标准差", valueStatisticsSTDEVP: "整体标准差", valueStatisticslet: "方差", valueStatisticsVARP: "整体方差", errorNotAllowEdit: "非编辑模式下禁止该操作!", errorNotAllowMulti: "不能对多重选择区域执行此操作,请选择单个区域,然后再试", errorSelectRange: "请选择新建透视表的区域", errorIsDamage: "此数据透视表的源数据已损坏!", errorNotAllowPivotData: "不可选择数据透视表为源数据!", errorSelectionRange: "选择失败, 输入范围错误!", errorIncreaseRange: "请扩大选择的数据范围!", titleAddColumn: "添加列到数据透视表", titleMoveColumn: "移动该列到下方白框", titleClearColumnFilter: "清除该列的筛选条件", titleFilterColumn: "筛选该列", titleSort: "排序", titleNoSort: "无排序", titleSortAsc: "升序", titleSortDesc: "降序", titleSortBy: "排序依据", titleShowSum: "显示总计", titleStasticTrue: "是", titleStasticFalse: "否" }, dropCell: { copyCell: "复制单元格", sequence: "填充序列", onlyFormat: "仅填充格式", noFormat: "不带格式填充", day: "以天数填充", workDay: "以工作日填充", month: "以月填充", year: "以年填充", chineseNumber: "以中文小写数字填充" }, imageCtrl: { borderTile: "图片边框颜色选择", borderCur: "当前颜色" }, protection: { protectiontTitle: "保护工作表", enterPassword: "请输入密码(可留空)", enterHint: "您试图更改的单元格或图表位于受保护的工作表中。若要更改,请取消工作表保护。您可能需要输入密码", swichProtectionTip: "保护工作表及锁定的单元格内容", authorityTitle: "允许此工作表的用户进行:", selectLockedCells: "选定锁定单元格", selectunLockedCells: "选定解除锁定的单元格", formatCells: "设置单元格格式", formatColumns: "设置列格式", formatRows: "设置行格式", insertColumns: "插入列", insertRows: "插入行", insertHyperlinks: "插入超链接", deleteColumns: "删除列", deleteRows: "删除行", sort: "排序", filter: "使用自动筛选", usePivotTablereports: "使用数据透视表和报表", editObjects: "编辑对象", editScenarios: "编辑方案", allowRangeTitle: "允许用户编辑区域", allowRangeAdd: "新建...", allowRangeAddTitle: "标题", allowRangeAddSqrf: "引用单元格", selectCellRange: "点击选择单元格范围", selectCellRangeHolder: "请输入单元格范围", allowRangeAddTitlePassword: "密码", allowRangeAddTitleHint: "提示", allowRangeAddTitleHintTitle: "设置密码后,提示用户输入密码(可留空)", allowRangeAddtitleDefault: "请输入区域名称", rangeItemDblclick: "双击进行编辑", rangeItemHasPassword: "已设置密码", rangeItemErrorTitleNull: "标题不能为空", rangeItemErrorRangeNull: "单元格范围不能为空", rangeItemErrorRange: "单元格范围格式错误", validationTitle: "验证提示", validationTips: "需要输入密码来撤销工作表的保护", validationInputHint: "请输入密码", checkPasswordNullalert: "密码不能为空!", checkPasswordWrongalert: "密码错误,请重试!", checkPasswordSucceedalert: "解锁成功,可以编辑该区域!", defaultRangeHintText: "该单元格正在受密码保护。", defaultSheetHintText: "该单元格或图表位于受保护的工作表中,若要进行更改,请取消工作表保护,您可能需要输入密码。" }, cellFormat: { cellFormatTitle: "设置单元格格式", protection: "保护", locked: "锁定单元格", hidden: "隐藏公式", protectionTips: "只有保护工作表功能(在菜单栏点击保护工作表按钮进行设置)开启后,锁定单元格或隐藏公式才能生效", tipsPart: "部分选中", tipsAll: "全部选中", selectionIsNullAlert: "请选择一个范围!", sheetDataIsNullAlert: "数据为空无法设置!" }, print: { normalBtn: "常规视图", layoutBtn: "页面布局", pageBtn: "分页预览", menuItemPrint: "打印(Ctrl+P)", menuItemAreas: "打印区域", menuItemRows: "打印标题行", menuItemColumns: "打印标题列" }, edit: { typing: "正在输入" }, websocket: { success: "WebSocket连接成功", refresh: "WebSocket连接发生错误, 请刷新页面!", wait: "WebSocket连接发生错误, 请耐心等待!", close: "WebSocket连接关闭", contact: "服务器通信发生错误,请刷新页面后再试,如若不行请联系管理员!", support: "当前浏览器不支持WebSocket" } }, es: { functionlist: [{ n: "SUMIF", t: 0, d: "Returns a conditional sum across a range.", a: "A conditional sum across a range.", m: [2, 3], p: [{ name: "range", detail: "The range which is tested against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion", detail: "The pattern or test to apply to `range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "sum_range", detail: "The range to be summed, if different from `range`.", example: "B1:B10", require: "o", repeat: "n", type: "range" }] }, { n: "TAN", t: 0, d: "Returns the tangent of an angle provided in radians.", a: "Tangent of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the tangent of, in radians.", example: "45*PI()/180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TANH", t: 0, d: "Returns the hyperbolic tangent of any real number.", a: "Hyperbolic tangent of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic tangent of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CEILING", t: 0, d: "Rounds a number up to the nearest integer multiple of specified significance `factor`.", a: "Rounds number up to nearest multiple of a factor.", m: [2, 2], p: [{ name: "value", detail: "The value to round up to the nearest integer multiple of `factor`.", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN", t: 0, d: "Returns the inverse tangent of a value, in radians.", a: "Inverse tangent of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse tangent.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ASINH", t: 0, d: "Returns the inverse hyperbolic sine of a number.", a: "Inverse hyperbolic sine of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic sine.", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ABS", t: 0, d: "Returns the absolute value of a number.", a: "Absolute value of a number.", m: [1, 1], p: [{ name: "value", detail: "The number of which to return the absolute value.", example: "-2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOS", t: 0, d: "Returns the inverse cosine of a value, in radians.", a: "Inverse cosine of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOSH", t: 0, d: "Returns the inverse hyperbolic cosine of a number.", a: "Inverse hyperbolic cosine of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTINOMIAL", t: 0, d: "Returns the factorial of the sum of values divided by the product of the values' factorials.", a: "Multinomial distribution function.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "ATANH", t: 0, d: "Returns the inverse hyperbolic tangent of a number.", a: "Inverse hyperbolic tangent of a number.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN2", t: 0, d: "Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.", a: "Arctangent of a value.", m: [2, 2], p: [{ name: "x", detail: "The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "y", detail: "The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTBLANK", t: 1, d: "Returns the number of empty values in a list of values and ranges.", a: "Number of empty values.", m: [1, 1], p: [{ name: "value1", detail: "The first value or range in which to count the number of blanks.", example: "A2:C100", require: "m", repeat: "n", type: "range" }] }, { n: "COSH", t: 0, d: "Returns the hyperbolic cosine of any real number.", a: "Hyperbolic cosine of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic cosine of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "INT", t: 0, d: "Rounds a number down to the nearest integer that is less than or equal to it.", a: "Rounds number down to nearest integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round down to the nearest integer.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISEVEN", t: 0, d: "Checks whether the provided value is even.", a: "Whether the provided value is even.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as even.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISODD", t: 0, d: "Checks whether the provided value is odd.", a: "Whether the provided value is odd.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as odd.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LCM", t: 0, d: "Returns the least common multiple of one or more integers.", a: "Least common multiple of one or more integers.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range whose factors to consider in a calculation to find the least common multiple.", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges whose factors to consider to find the least common multiple.", example: "3", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LN", t: 0, d: "Returns the logarithm of a number, base e (Euler's number).", a: "The logarithm of a number, base e (euler's number).", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the logarithm, base e.", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOG", t: 0, d: "Returns the logarithm of a number with respect to a base.", a: "The logarithm of a number with respect to a base.", m: [1, 2], p: [{ name: "value", detail: "The value for which to calculate the logarithm.", example: "128", require: "m", repeat: "n", type: "rangenumber" }, { name: "base", detail: "The base to use for calculation of the logarithm.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "LOG10", t: 0, d: "Returns the logarithm of a number, base 10.", a: "The logarithm of a number, base 10.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the logarithm, base 10.", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MOD", t: 0, d: "Returns the result of the modulo operator, the remainder after a division operation.", a: "Modulo (remainder) operator.", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided to find the remainder.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MROUND", t: 0, d: "Rounds one number to the nearest integer multiple of another.", a: "Rounds a number to the nearest integer multiple.", m: [2, 2], p: [{ name: "value", detail: "The number to round to the nearest integer multiple of another.", example: "21", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ODD", t: 0, d: "Rounds a number up to the nearest odd integer.", a: "Rounds a number up to the nearest odd integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round to the next greatest odd number.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMSQ", t: 0, d: "Returns the sum of the squares of a series of numbers and/or cells.", a: "Sum of squares.", m: [1, 255], p: [{ name: "value1", detail: "The first number or range whose squares to add together.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional numbers or ranges whose squares to add to the square(s) of `value1`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMBIN", t: 0, d: "Returns the number of ways to choose some number of objects from a pool of a given size of objects.", a: "Number of combinations from a set of objects.", m: [2, 2], p: [{ name: "n", detail: "The size of the pool of objects to choose from.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "The number of objects to choose.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUM", t: 0, d: "Returns the sum of a series of numbers and/or cells.", a: "Sum of a series of numbers and/or cells.", m: [1, 255], p: [{ name: "value1", detail: "The first number or range to add together.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional numbers or ranges to add to `value1`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SUBTOTAL", t: 0, d: "Returns a subtotal for a vertical range of cells using a specified aggregation function.", a: "Subtotal for a range using a specific function.", m: [2, 256], p: [{ name: "function_code", detail: "The function to use in subtotal aggregation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "range1", detail: "The first range over which to calculate a subtotal.", example: "A2:A5", require: "m", repeat: "n", type: "range" }, { name: "range2", detail: "Additional ranges over which to calculate subtotals.", example: "B2:B8", require: "o", repeat: "y", type: "range" }] }, { n: "ASIN", t: 0, d: "Returns the inverse sine of a value, in radians.", a: "Inverse sine of a value, in radians.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTIF", t: 1, d: "Returns a conditional count across a range.", a: "A conditional count across a range.", m: [2, 2], p: [{ name: "range", detail: "The range that is tested against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion", detail: "The pattern or test to apply to `range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "RADIANS", t: 0, d: "Converts an angle value in degrees to radians.", a: "Converts an angle value in degrees to radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to convert from degrees to radians.", example: "180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RAND", t: 0, d: "Returns a random number between 0 inclusive and 1 exclusive.", a: "A random number between 0 inclusive and 1 exclusive.", m: [0, 0], p: [] }, { n: "COUNTUNIQUE", t: 0, d: "Counts the number of unique values in a list of specified values and ranges.", a: "Counts number of unique values in a range.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider for uniqueness.", example: "A1:C100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider for uniqueness.", example: "1", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DEGREES", t: 0, d: "Converts an angle value in radians to degrees.", a: "Converts an angle value in radians to degrees.", m: [1, 1], p: [{ name: "angle", detail: "The angle to convert from radians to degrees.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ERFC", t: 9, d: "Returns the complementary Gauss error function of a value.", a: "Complementary gauss error function of a value.", m: [1, 1], p: [{ name: "z", detail: "The number for which to calculate the complementary Gauss error function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EVEN", t: 0, d: "Rounds a number up to the nearest even integer.", a: "Rounds a number up to the nearest even integer.", m: [1, 1], p: [{ name: "value", detail: "The value to round to the next greatest even number.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EXP", t: 0, d: "Returns Euler's number, e (~2.718) raised to a power.", a: "Euler's number, e (~2.718) raised to a power.", m: [1, 1], p: [{ name: "exponent", detail: "The exponent to raise e to.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACT", t: 0, d: "Returns the factorial of a number.", a: "Factorial of a number.", m: [1, 1], p: [{ name: "value", detail: "The number or reference to a number whose factorial will be calculated and returned.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACTDOUBLE", t: 0, d: 'Returns the "double factorial" of a number.', a: '"double factorial" of a number.', m: [1, 1], p: [{ name: "value", detail: "The number or reference to a number whose double factorial will be calculated and returned.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PI", t: 0, d: "Returns the value of Pi to 14 decimal places.", a: "The number pi.", m: [0, 0], p: [] }, { n: "FLOOR", t: 0, d: "Rounds a number down to the nearest integer multiple of specified significance `factor`.", a: "Rounds number down to nearest multiple of a factor.", m: [2, 2], p: [{ name: "value", detail: "The value to round down to the nearest integer multiple of `factor`.", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The number to whose multiples `value` will be rounded.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GCD", t: 0, d: "Returns the greatest common divisor of one or more integers.", a: "Greatest common divisor of one or more integers.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range whose factors to consider in a calculation to find the greatest common divisor.", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges whose factors to consider to find the greatest common divisor.", example: "96", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANDBETWEEN", t: 0, d: "Returns a uniformly random integer between two values, inclusive.", a: "Random integer between two values, inclusive.", m: [2, 2], p: [{ name: "low", detail: "The low end of the random range.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "high", detail: "The high end of the random range.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUND", t: 0, d: "Rounds a number to a certain number of decimal places according to standard rules.", a: "Rounds a number according to standard rules.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDDOWN", t: 0, d: "Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.", a: "Rounds down a number.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places, always rounding down.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDUP", t: 0, d: "Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.", a: "Rounds up a number.", m: [2, 2], p: [{ name: "value", detail: "The value to round to `places` number of places, always rounding up.", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of decimal places to which to round.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SERIESSUM", t: 0, d: "Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a", a: "Sum of a power series.", m: [4, 4], p: [{ name: "x", detail: "The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "The initial power to which to raise `x` in the power series.", example: "0", require: "m", repeat: "n", type: "rangenumber" }, { name: "m", detail: "The additive increment by which to increase `x`.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "a", detail: "The array or range containing the coefficients of the power series.", example: "{FACT(0)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIGN", t: 0, d: "Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.", a: "Sign of a provided number (+/-/0).", m: [1, 1], p: [{ name: "value", detail: "The value whose sign will be evaluated.", example: "-42", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIN", t: 0, d: "Returns the sine of an angle provided in radians.", a: "Sine of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the sine of, in radians.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SINH", t: 0, d: "Returns the hyperbolic sine of any real number.", a: "Hyperbolic sine of any real number.", m: [1, 1], p: [{ name: "value", detail: "Any real value to calculate the hyperbolic sine of.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRT", t: 0, d: "Returns the positive square root of a positive number.", a: "Positive square root of a positive number.", m: [1, 1], p: [{ name: "value", detail: "The number for which to calculate the positive square root.", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRTPI", t: 0, d: "Returns the positive square root of the product of Pi and the given positive number.", a: "Square root of the product of pi and number.", m: [1, 1], p: [{ name: "value", detail: "The number which will be multiplied by Pi and have the product's square root returned", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GAMMALN", t: 1, d: "Returns the logarithm of a specified Gamma function, base e (Euler's number).", a: "Logarithm of gamma function.", m: [1, 1], p: [{ name: "value", detail: "The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COS", t: 0, d: "Returns the cosine of an angle provided in radians.", a: "Cosine of an angle provided in radians.", m: [1, 1], p: [{ name: "angle", detail: "The angle to find the cosine of, in radians.", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRUNC", t: 0, d: "Truncates a number to a certain number of significant digits by omitting less significant digits.", a: "Truncates a number.", m: [1, 2], p: [{ name: "value", detail: "The value to be truncated.", example: "3.141592654", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "The number of significant digits to the right of the decimal point to retain.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUOTIENT", t: 0, d: "Returns one number divided by another.", a: "One number divided by another.", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POWER", t: 0, d: "Returns a number raised to a power.", a: "A number raised to a power.", m: [2, 2], p: [{ name: "base", detail: "The number to raise to the `exponent` power.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "exponent", detail: "The exponent to raise `base` to.", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMIFS", t: 0, d: "Returns the sum of a range depending on multiple criteria.", a: "Sums a range depending on multiple criteria.", m: [3, 257], p: [{ name: "sum_range", detail: "The range to sum.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criteria_range1", detail: "The range to check against criterion1.", example: " B1:B10", require: "m", repeat: "n", type: "range" }, { name: "criterion1", detail: "The pattern or test to apply to criteria_range1.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " C1:C10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTIFS", t: 1, d: "Returns the count of a range depending on multiple criteria.", a: "Count values depending on multiple criteria.", m: [2, 256], p: [{ name: "criteria_range1", detail: "The range to check against `criterion1`.", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "criterion1", detail: "The pattern or test to apply to `criteria_range1`.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " B1:B10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PRODUCT", t: 0, d: "Returns the result of multiplying a series of numbers together.", a: "Result of multiplying a series of numbers together.", m: [1, 255], p: [{ name: "factor1", detail: "The first number or range to calculate for the product.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor2", detail: "More numbers or ranges to calculate for the product.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HARMEAN", t: 1, d: "Calculates the harmonic mean of a dataset.", a: "The harmonic mean of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HYPGEOMDIST", t: 1, d: "Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.", a: "Hypergeometric distribution probability.", m: [5, 5], p: [{ name: "num_successes", detail: "The desired number of successes.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_draws", detail: "The number of permitted draws.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "successes_in_pop", detail: "The total number of successes in the population.", example: "20", require: "m", repeat: "n", type: "rangenumber" }, { name: "pop_size", detail: "The total size of the population", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\n\nif FALSE(), it returns the probability density function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "INTERCEPT", t: 1, d: "Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).", a: "Y-intercept of line derived via linear regression.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "KURT", t: 1, d: 'Calculates the kurtosis of a dataset, which describes the shape, and in particular the "peakedness" of that dataset.', a: "Kurtosis of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LARGE", t: 1, d: "Returns the nth largest element from a data set, where n is user-defined.", a: "Nth largest element from a data set.", m: [2, 2], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "The rank from largest to smallest of the element to return.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STDEVA", t: 1, d: "Calculates the standard deviation based on a sample, setting text to the value `0`.", a: "Standard deviation of sample (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STDEVP", t: 1, d: "Calculates the standard deviation based on an entire population.", a: "Standard deviation of an entire population.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "GEOMEAN", t: 1, d: "Calculates the geometric mean of a dataset.", a: "The geometric mean of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANK_EQ", t: 1, d: "Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.", a: "Top rank of a specified value in a dataset.", m: [2, 3], p: [{ name: "value", detail: "The value whose rank will be determined.", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "is_ascending", detail: "Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANK_AVG", t: 1, d: "Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.", a: "Average rank of a specified value in a dataset.", m: [2, 3], p: [{ name: "value", detail: "The value whose rank will be determined.", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "is_ascending", detail: "Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PERCENTRANK_EXC", t: 1, d: "Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.", a: "Percentage rank (percentile) from 0 to 1 exclusive.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value", detail: "The value whose percentage rank will be determined.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant figures to use in the calculation. Default is 3.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTRANK_INC", t: 1, d: "Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.", a: "Percentage rank (percentile) from 0 to 1 inclusive.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value", detail: "The value whose percentage rank will be determined.", example: " A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant figures to use in the calculation. Default is 3.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FORECAST", t: 1, d: "Calculates the expected y-value for a specified x based on a linear regression of a dataset.", a: "Expected y-value based of linear regression.", m: [3, 3], p: [{ name: "x", detail: "The value on the x-axis to forecast.", example: "A1", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHERINV", t: 1, d: "Returns the inverse Fisher transformation of a specified value.", a: "Inverse fisher transformation of a specified value.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the inverse Fisher transformation.", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHER", t: 1, d: "Returns the Fisher transformation of a specified value.", a: "Fisher transformation of a specified value.", m: [1, 1], p: [{ name: "value", detail: "The value for which to calculate the Fisher transformation.", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MODE_SNGL", t: 1, d: "Returns the most commonly occurring value in a dataset.", a: "Most commonly occurring value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating mode.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating mode.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "WEIBULL_DIST", t: 1, d: "Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.", a: "Weibull distribution function.", m: [4, 4], p: [{ name: "x", detail: "The input to the Weibull distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "shape", detail: "The shape parameter of the Weibull distribution function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "scale", detail: "The scale parameter of the Weibull distribution function.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the cumulative distribution function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "COUNT", t: 1, d: "Returns the number of numeric values in a dataset.", a: "The number of numeric values in dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when counting.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when counting.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTA", t: 1, d: "Returns the number of values in a dataset.", a: "The number of values in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when counting.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when counting.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVEDEV", t: 1, d: "Calculates the average of the magnitudes of deviations of data from a dataset's mean.", a: "Average magnitude of deviations from mean.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "AVERAGE", t: 1, d: "Returns the numerical average value in a dataset, ignoring text.", a: "Numerical average value in a dataset, ignoring text.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the average value.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the average value.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVERAGEA", t: 1, d: "Returns the numerical average value in a dataset.", a: "Numerical average value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the average value.", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the average value.", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BINOM_DIST", t: 1, d: "Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.", a: "Binomial distribution probability.", m: [4, 4], p: [{ name: "num_successes", detail: "The number of successes for which to calculate the probability in `num_trials` trials.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_trials", detail: "The number of independent trials.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the binomial cumulative distribution.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BINOM_INV", t: 1, d: "Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.", a: "Inverse cumulative binomial distribution function.", m: [3, 3], p: [{ name: "num_trials", detail: "The number of independent trials.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "target_prob", detail: "The desired threshold probability.", example: "0.8", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONFIDENCE_NORM", t: 1, d: "Calculates the width of half the confidence interval for a normal distribution.", a: "Confidence interval for a normal distribution.", m: [3, 3], p: [{ name: "alpha", detail: "One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.", example: "0.05", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation of the population.", example: "1.6", require: "m", repeat: "n", type: "rangenumber" }, { name: "pop_size", detail: "The size of the population.", example: "250", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CORREL", t: 1, d: "Calculates r, the Pearson product-moment correlation coefficient of a dataset.", a: "Pearson Product-Moment Correlation Coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_P", t: 1, d: "Calculates the covariance of a dataset.", a: "The covariance of a dataset.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_S", t: 1, d: "Calculates the sample covariance of a dataset.", a: "The sample covariance of a dataset.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DEVSQ", t: 1, d: "Calculates the sum of squares of deviations based on a sample.", a: "The sum of squares of deviations based on a sample.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "EXPON_DIST", t: 1, d: "Returns the value of the exponential distribution function with a specified lambda at a specified value.", a: "Exponential distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the exponential distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "lambda", detail: "The lambda to specify the exponential distribution function.", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the exponential cumulative distribution.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIF", t: 1, d: "Returns the average of a range depending on criteria.", a: "Average of values depending on criteria.", m: [2, 3], p: [{ name: "criteria_range", detail: "The range to check against `criterion`.", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion", detail: "The pattern or test to apply to `criteria_range`.", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "average_range", detail: "The range to average. If not included, `criteria_range` is used for the average instead.", example: "B1:B10", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIFS", t: 1, d: "Returns the average of a range depending on multiple criteria.", a: "Average of values depending on multiple criteria.", m: [2, 255], p: [{ name: "average_range", detail: "The range to average.", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range1", detail: "The range to check against `criterion1`.", example: " B1:B10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion1", detail: "The pattern or test to apply to `criteria_range1`.", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2", detail: "Additional ranges to check.", example: " C1:C10", require: "m", repeat: "n", type: "rangeall" }] }, { n: "PERMUT", t: 1, d: "Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.", a: "Number of permutations from a number of objects.", m: [2, 2], p: [{ name: "n", detail: "The size of the pool of objects to choose from.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "The number of objects to choose.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRIMMEAN", t: 1, d: "Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.", a: "Mean of a dataset excluding high/low ends.", m: [2, 2], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "exclude_proportion", detail: "The proportion of the dataset to exclude, from the extremities of the set.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_EXC", t: 1, d: "Returns the value at a given percentile of a dataset exclusive of 0 and 1.", a: "Value at a given percentile of a dataset exclusive of 0 and 1.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "percentile", detail: "The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_INC", t: 1, d: "Returns the value at a given percentile of a dataset.", a: "Value at a given percentile of a dataset.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "percentile", detail: "The percentile whose value within `data` will be calculated and returned.`", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PEARSON", t: 1, d: "Calculates r, the Pearson product-moment correlation coefficient of a dataset.", a: "Pearson Product-Moment Correlation Coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_INV", t: 1, d: "Returns the value of the inverse standard normal distribution function for a specified value.", a: "Inverse standard normal distribution function.", m: [1, 1], p: [{ name: "x", detail: "The input to the inverse standard normal distribution function.", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_DIST", t: 1, d: "Returns the value of the standard normal cumulative distribution function for a specified value.", a: "Standard normal cumulative distribution function.", m: [2, 2], p: [{ name: "x", detail: "The input to the standard normal cumulative distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NORM_INV", t: 1, d: "Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.", a: "Inverse normal distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the inverse normal distribution function.", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the normal distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the normal distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_DIST", t: 1, d: "Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.", a: "Normal distribution function.", m: [4, 4], p: [{ name: "x", detail: "The input to the normal distribution function.", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the normal distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the normal distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the normal cumulative distribution function rather than the distribution function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NEGBINOM_DIST", t: 1, d: "Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.", a: "Negative binomial distribution probability.", m: [4, 4], p: [{ name: "num_failures", detail: "The number of failures to model.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_successes", detail: "The number of successes to model.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "prob_success", detail: "The probability of success in any given trial.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINA", t: 1, d: "Returns the minimum numeric value in a dataset.", a: "Minimum numeric value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the minimum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the minimum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MIN", t: 1, d: "Returns the minimum value in a numeric dataset.", a: "Minimum value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the minimum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the minimum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MEDIAN", t: 1, d: "Returns the median value in a numeric dataset.", a: "Median value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the median value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the median value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAXA", t: 1, d: "Returns the maximum numeric value in a dataset.", a: "Maximum numeric value in a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the maximum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the maximum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAX", t: 1, d: "Returns the maximum value in a numeric dataset.", a: "Maximum value in a numeric dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range to consider when calculating the maximum value.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to consider when calculating the maximum value.", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LOGNORM_INV", t: 1, d: "Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.", a: "Inverse log-normal cumulative distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the inverse log-normal cumulative distribution function.", example: "0.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the inverse log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the inverse log-normal cumulative distribution function.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOGNORM_DIST", t: 1, d: "Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.", a: "Log-normal cumulative distribution probability.", m: [4, 4], p: [{ name: "x", detail: "The input to the log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the log-normal cumulative distribution function.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation (sigma) of the log-normal cumulative distribution function.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Determine the logical value of the function form. \n\nIf TRUE(), it returns the cumulative distribution function;\n\nIf it is FALSE(), it returns the probability density function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "Z_TEST", t: 1, d: "Returns the one-tailed p-value of a Z-test with standard distribution.", a: "One-tailed p-value of a z-test.", m: [2, 3], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "value", detail: "The test statistic to use in the Z-test.", example: "B2", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.", example: "3", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PROB", t: 1, d: "Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.", a: "Probability values lie in a range.", m: [3, 4], p: [{ name: "data", detail: "Array or range containing the dataset to consider.", example: "A3:A6", require: "m", repeat: "n", type: "range" }, { name: "probabilities", detail: "Array or range containing probabilities corresponding to `data`.", example: "2", require: "m", repeat: "n", type: "range" }, { name: "low_limit", detail: "The lower bound on the value range for which to calculate the probability.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "high_limit", detail: "The upper bound on the value range for which to calculate the probability.", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_EXC", t: 1, d: "Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.", a: "Value nearest to a specific quartile of a dataset exclusive of 0 and 4.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quartile_number", detail: "Which quartile to return.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_INC", t: 1, d: "Returns a value nearest to a specified quartile of a dataset.", a: "Value nearest to a specific quartile of a dataset.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quartile_number", detail: "Which quartile value to return.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POISSON_DIST", t: 1, d: "Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.", a: "Poisson distribution function.", m: [3, 3], p: [{ name: "x", detail: "The input to the Poisson distribution function.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean (mu) of the Poisson distribution function.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Whether to use the Poisson cumulative distribution function rather than the distribution function.", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "RSQ", t: 1, d: "Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.", a: "Square of the correlation coefficient.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST", t: 1, d: "Calculates the left tail probability for a Student's t-distribution with a given input (x).", a: "The left-tailed Student's t-distribution", m: [3, 3], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "T_DIST_2T", t: 1, d: "Calculates the probability for two tailed Student's t-distribution with a given input (x).", a: "The two tailed Student's t-distribution", m: [2, 2], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST_RT", t: 1, d: "Calculates the right tail probability for a Student's t-distribution with a given input (x).", a: "The right-tailed Student's t-distribution", m: [2, 2], p: [{ name: "x", detail: "The input to the t-distribution function.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV", t: 1, d: "Calculates the negative inverse of the one-tailed TDIST function.", a: "T.INV", m: [2, 2], p: [{ name: "probability", detail: "The probability associated with the two-tailed t-distribution.", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV_2T", t: 1, d: "Calculates the inverse of the two-tailed TDIST function.", a: "T.INV.2T", m: [2, 2], p: [{ name: "probability", detail: "The probability associated with the two-tailed t-distribution.", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "The number of degrees of freedom.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_TEST", t: 1, d: "t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.", a: "Returns the probability associated with t-test.", m: [4, 4], p: [{ name: "range1", detail: "The first sample of data or group of cells to consider for the t-test.", example: "A1:A4", require: "m", repeat: "n", type: "rangenumber" }, { name: "range2", detail: "The second sample of data or group of cells to consider for the t-test.", example: "B1:B4", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "Specifies the number of distribution tails.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "Specifies the type of t-test.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "F_DIST", t: 1, d: "Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.", a: "F probability distribution (left-tailed).", m: [4, 4], p: [{ name: "x", detail: "The input to the F probability distribution function. The value at which to evaluate the function.", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "The numerator of the number of degrees of freedom.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "The denominator of the number of degrees of freedom.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "Logical value that determines the form of the function.", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "F_DIST_RT", t: 1, d: "Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.", a: "F probability distribution.", m: [3, 3], p: [{ name: "x", detail: "The input to the F probability distribution function. The value at which to evaluate the function.", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "The numerator of the number of degrees of freedom.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "The denominator of the number of degrees of freedom.", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "VAR_P", t: 1, d: "Calculates the variance based on an entire population.", a: "Variance of entire population.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VAR_S", t: 1, d: "Calculates the variance based on a sample.", a: "Variance.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARA", t: 1, d: "Calculates the variance based on a sample, setting text to the value `0`.", a: "Variance of sample (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the sample.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the sample.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARPA", t: 1, d: "Calculates the variance based on an entire population, setting text to the value `0`.", a: "Variance of entire population (text as 0).", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the population.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "Additional values or ranges to include in the population.", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STEYX", t: 1, d: "Calculates the standard error of the predicted y-value for each x in the regression of a dataset.", a: "Standard error of predicted y-values in regression.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STANDARDIZE", t: 1, d: "Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.", a: "Normalized equivalent of a random variable.", m: [3, 3], p: [{ name: "value", detail: "The value of the random variable to normalize.", example: "96", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "The mean of the distribution.", example: "80", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_deviation", detail: "The standard deviation of the distribution.", example: "6.7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SMALL", t: 1, d: "Returns the nth smallest element from a data set, where n is user-defined.", a: "Nth smallest element in a data set.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the dataset to consider.", example: "A2:B100", require: "m", repeat: "n", type: "range" }, { name: "n", detail: "The rank from smallest to largest of the element to return.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SLOPE", t: 1, d: "Calculates the slope of the line resulting from linear regression of a dataset.", a: "Slope of line from linear regression of data.", m: [2, 2], p: [{ name: "data_y", detail: "The range representing the array or matrix of dependent data.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "data_x", detail: "The range representing the array or matrix of independent data.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SKEW", t: 1, d: "Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.", a: "Skewness of a dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SKEW_P", t: 1, d: "Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.", a: "Skewness of a population's dataset.", m: [1, 255], p: [{ name: "value1", detail: "The first value or range of the dataset.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional values or ranges to include in the dataset.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "VLOOKUP", t: 2, d: "Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.", a: "Vertical lookup.", m: [3, 4], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.", example: "A2:B26", require: "m", repeat: "n", type: "rangeall" }, { name: "index", detail: "The column index of the value to be returned, where the first column in `range` is numbered 1.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "is_sorted", detail: "Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "HLOOKUP", t: 2, d: "Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.", a: "Horizontal lookup", m: [3, 4], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.", example: "A2:Z6", require: "m", repeat: "n", type: "rangeall" }, { name: "index", detail: "The row index of the value to be returned, where the first row in `range` is numbered 1.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "is_sorted", detail: "Indicates whether the row to be searched (the first row of the specified range) is sorted.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOOKUP", t: 2, d: "Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.", a: "Look up a value.", m: [2, 3], p: [{ name: "search_key", detail: 'The value to search for in the row or column. For example, `42`, `"Cats"`, or `I24`.', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "search_range|search_result_array", detail: "One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.", example: "A1:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "result_range", detail: "The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.", example: "B1:B100", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ADDRESS", t: 2, d: "Returns a cell reference as a string.", a: "Cell reference as a string.", m: [2, 5], p: [{ name: "row", detail: "The row number of the cell reference", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "column", detail: "The column number (not name) of the cell reference. `A` is column number `1`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "absolute_relative_mode", detail: "An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).", example: "4", require: "o", repeat: "n", type: "rangenumber" }, { name: "use_a1_notation", detail: "A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }, { name: "sheet", detail: "Text indicating the name of the sheet into which the address points.", example: '"Sheet2"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "INDIRECT", t: 2, d: "Returns a cell reference specified by a string.", a: "A cell reference specified by a string.", m: [1, 2], p: [{ name: "cell_reference_as_string", detail: "A cell reference, written as a string with surrounding quotation marks.", example: '"Sheet2!"&B10', require: "m", repeat: "n", type: "rangeall" }, { name: "is_A1_notation", detail: "Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROW", t: 2, d: "Returns the row number of a specified cell.", a: "Row number of a specified cell.", m: [0, 1], p: [{ name: "cell_reference", detail: "The cell whose row number will be returned.", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROWS", t: 2, d: "Returns the number of rows in a specified array or range.", a: "Number of rows in a specified array or range.", m: [1, 1], p: [{ name: "range", detail: "The range whose row count will be returned.", example: "A9:A62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COLUMN", t: 2, d: "Returns the column number of a specified cell, with `A=1`.", a: "Column number of a specified cell.", m: [0, 1], p: [{ name: "cell_reference", detail: "The cell whose column number will be returned. Column `A` corresponds to `1`.", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNS", t: 2, d: "Returns the number of columns in a specified array or range.", a: "Number of columns in a specified array or range.", m: [1, 1], p: [{ name: "range", detail: "The range whose column count will be returned.", example: "A9:W62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "OFFSET", t: 2, d: "Returns a range reference shifted a specified number of rows and columns from a starting cell reference.", a: "A range reference offset relative to a cell.", m: [3, 5], p: [{ name: "cell_reference", detail: "The starting point from which to count the offset rows and columns.", example: "A2", require: "m", repeat: "n", type: "range" }, { name: "offset_rows", detail: "The number of rows to offset by.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "offset_columns", detail: "The number of columns to offset by.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "height", detail: "The height of the range to return starting at the offset target.", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "width", detail: "The width of the range to return starting at the offset target.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MATCH", t: 2, d: "Returns the relative position of an item in a range that matches a specified value.", a: "Position of item in range that matches value.", m: [2, 3], p: [{ name: "search_key", detail: 'The value to search for. For example, `42`, `"Cats"`, or `I24`.', example: '"Sunday"', require: "m", repeat: "n", type: "rangeall" }, { name: "range", detail: "The one-dimensional array to be searched.", example: "A2:A9", require: "m", repeat: "n", type: "range" }, { name: "search_type", detail: "The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INDEX", t: 2, d: "Returns the content of a cell, specified by row and column offset.", a: "Content of cell specified by row and column offset.", m: [2, 3], p: [{ name: "reference", detail: "The array of cells to be offset into.", example: "A1:C20", require: "m", repeat: "n", type: "range" }, { name: "row", detail: "The number of offset rows.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "column", detail: "The number of offset columns.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GETPIVOTDATA", t: 2, d: "Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.", a: "Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.", m: [2, 254], p: [{ name: "value_name", detail: "The name of the value in the pivot table for which you want to get data.", example: '"SUM of number of units"', require: "m", repeat: "n", type: "rangeall" }, { name: "any_pivot_table_cell", detail: "Any reference to a cell in the desired pivot table (top corner recommended).", example: "'Pivot table'!A1", require: "m", repeat: "n", type: "rangeall" }, { name: "original_column", detail: "The name of the column in the original data set (not the pivot table).", example: '"division"', require: "o", repeat: "y", type: "rangeall" }, { name: "pivot_item", detail: "The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.", example: '"east"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CHOOSE", t: 2, d: "Returns an element from a list of choices based on index.", a: "An element from a list of choices based on index.", m: [2, 255], p: [{ name: "index", detail: "Which choice (of the up to 30 provided) to return.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "choice1", detail: "A potential value to return. Required. May be a reference to a cell or an individual value.", example: '"A"', require: "m", repeat: "n", type: "rangeall" }, { name: "choice2", detail: "Additional values among which to choose.", example: '"B"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "HYPERLINK", t: 2, d: "Creates a hyperlink inside a cell.", a: "Creates a hyperlink inside a cell.", p: [{ name: "url", detail: "The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.", example: '"http://www.luckysheet.com/"', require: "m", repeat: "n", type: "rangeall" }, { name: "link_label", detail: "The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.", example: '"luckysheet"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TIME", t: 6, d: "Converts a provided hour, minute, and second into a time.", a: "Converts hour/minute/second into a time.", m: [3, 3], p: [{ name: "hour", detail: "The hour component of the time.", example: "11", require: "m", repeat: "n", type: "rangenumber" }, { name: "minute", detail: "The minute component of the time.", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "second", detail: "The second component of the time.", example: "59", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TIMEVALUE", t: 6, d: "Returns the fraction of a 24-hour day the time represents.", a: "Converts a time string into its serial number representation.", m: [1, 1], p: [{ name: "time_string", detail: "The string that holds the time representation.", example: '"2:15 PM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EOMONTH", t: 6, d: "Returns a date on the last day of a month that falls a specified number of months before or after another date.", a: "Last day of a month before or after a date.", m: [2, 2], p: [{ name: "start_date", detail: "The date from which to calculate the result.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "The number of months before (negative) or after (positive) 'start_date' to consider.", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EDATE", t: 6, d: "Returns a date a specified number of months before or after another date.", a: "Date a number of months before/after another date.", m: [2, 2], p: [{ name: "start_date", detail: "The date from which to calculate the result.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "The number of months before (negative) or after (positive) 'start_date' to calculate.", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SECOND", t: 6, d: "Returns the second component of a specific time, in numeric format.", a: "Second component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the second component", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINUTE", t: 6, d: "Returns the minute component of a specific time, in numeric format.", a: "Minute component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the minute component.", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "HOUR", t: 6, d: "Returns the hour component of a specific time, in numeric format.", a: "Hour component of a specific time.", m: [1, 1], p: [{ name: "time", detail: "The time from which to calculate the hour component.", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOW", t: 6, d: "Returns the current date and time as a date value.", a: "Current date and time as a date value.", m: [0, 0], p: [] }, { n: "NETWORKDAYS", t: 6, d: "Returns the number of net working days between two provided days.", a: "Net working days between two provided days.", m: [2, 3], p: [{ name: "start_date", detail: "The start date of the period from which to calculate the number of net working days.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date of the period from which to calculate the number of net working days.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the date serial numbers to consider holidays.", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "NETWORKDAYS_INTL", t: 6, d: "Returns the number of net working days between two provided days excluding specified weekend days and holidays.", a: "Net working days between two dates (specifying weekends).", m: [2, 4], p: [{ name: "start_date", detail: "The start date of the period from which to calculate the number of net working days.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date of the period from which to calculate the number of net working days.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "weekend", detail: "A number or string representing which days of the week are considered weekends.", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the dates to consider as holidays.", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ISOWEEKNUM", t: 6, d: "Returns a number representing the ISO week of the year where the provided date falls.", a: "ISO week number of the year.", m: [1, 1], p: [{ name: "date", detail: "The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WEEKNUM", t: 6, d: "Returns a number representing the week of the year where the provided date falls.", a: "Week number of the year.", m: [1, 2], p: [{ name: "date", detail: "The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "type", detail: "A number representing the day that a week starts on. Sunday = 1.", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "WEEKDAY", t: 6, d: "Returns a number representing the day of the week of the date provided.", a: "Day of the week of the date provided (as number).", m: [1, 2], p: [{ name: "date", detail: "The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "type", detail: "A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DAY", t: 6, d: "Returns the day of the month that a specific date falls on, in numeric format.", a: "Day of the month that a specific date falls on.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the day.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS", t: 6, d: "Returns the number of days between two dates.", a: "Number of days between two dates.", m: [2, 2], p: [{ name: "end_date", detail: "The end of the date range.", example: "2011-3-15", require: "m", repeat: "n", type: "rangeall" }, { name: "start_date", detail: "The start of the date range.", example: "2011-2-1", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS360", t: 6, d: "Returns the difference between two days based on the 360 day year used in some financial interest calculations.", a: "Days between two dates on a 360-day year.", m: [2, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "method", detail: "An indicator of what day count method to use.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DATE", t: 6, d: "Converts a provided year, month, and day into a date.", a: "Converts year/month/day into a date.", m: [3, 3], p: [{ name: "year", detail: "The year component of the date.", example: "1969", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "The month component of the date.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "day", detail: "The day component of the date.", example: "20", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DATEVALUE", t: 6, d: "Converts a provided date string in a known format to a date value.", a: "Converts a date string to a date value.", m: [1, 1], p: [{ name: "date_string", detail: "The string representing the date.", example: '"1969-7-20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DATEDIF", t: 6, d: "Calculates the number of days, months, or years between two dates.", a: "Date Difference.", m: [3, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "unit", detail: 'A string abbreviation for unit of time. For example, "M" for month. Accepted values are "Y","M","D","MD","YM","YD".', example: "16)", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY", t: 6, d: "Calculates the date after a number of working days from a specified start date.", a: "Number of working days from start date.", m: [2, 3], p: [{ name: "start_date", detail: "The date from which to begin counting.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "num_days", detail: "The number of working days to advance from `start_date`. If negative, counts backwards.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "holidays", detail: "A range or array constant containing the dates to consider holidays.", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY_INTL", t: 6, d: "Calculates the date after a specified number of workdays excluding specified weekend days and holidays.", a: "Date after a number of workdays (specifying weekends).", m: [2, 4], p: [{ name: "start_date", detail: "The date from which to begin counting.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "num_days", detail: "The number of working days to advance from `start_date`. If negative, counts backwards.", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "weekend", detail: "A number or string representing which days of the week are considered weekends.", example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "A range or array constant containing the dates to consider holidays.", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "YEAR", t: 6, d: "Returns the year specified by a given date.", a: "Year specified by a given date.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the year.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "YEARFRAC", t: 6, d: "Returns the number of years, including fractional years, between two dates using a specified day count convention.", a: "Exact number of years between two dates.", m: [2, 3], p: [{ name: "start_date", detail: "The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "16)", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "TODAY", t: 6, d: "Returns the current date as a date value.", a: "Current date as a date value.", m: [0, 0], p: [] }, { n: "MONTH", t: 6, d: "Returns the month of the year a specific date falls in, in numeric format.", a: "Month of the year a specific date falls in.", m: [1, 1], p: [{ name: "date", detail: "The date from which to extract the month.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EFFECT", t: 8, d: "Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.", a: "Annual effective interest rate.", m: [2, 2], p: [{ name: "nominal_rate", detail: "The nominal interest rate per year.", example: "0.99", require: "m", repeat: "n", type: "rangenumber" }, { name: "periods_per_year", detail: "The number of compounding periods per year.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLAR", t: 12, d: "Formats a number into the currency specific to your spreadsheet locale.", a: "Formats a number as currency specific to your spreadsheet locale.", m: [1, 2], p: [{ name: "number", detail: "The value to be formatted.", example: "1.2351", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_places", detail: "The number of decimal places to display.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARDE", t: 8, d: "Converts a price quotation given as a decimal fraction into a decimal value.", a: "Converts a decimal fraction to decimal value.", m: [2, 2], p: [{ name: "fractional_price", detail: "The price quotation given using fractional decimal conventions.", example: "100.10", require: "m", repeat: "n", type: "rangenumber" }, { name: "unit", detail: "The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARFR", t: 8, d: "Converts a price quotation given as a decimal value into a decimal fraction.", a: "Converts a decimal value to decimal fraction.", m: [2, 2], p: [{ name: "decimal_price", detail: "The price quotation given as a decimal value.", example: "100.125", require: "m", repeat: "n", type: "rangenumber" }, { name: "unit", detail: "The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DB", t: 8, d: "Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.", a: "Depreciation via declining balance method.", m: [4, 5], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "The number of months in the first year of depreciation.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DDB", t: 8, d: "Calculates the depreciation of an asset for a specified period using the double-declining balance method.", a: "Depreciation via double-declining balance method.", m: [4, 5], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "The factor by which depreciation decreases.", example: "2.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RATE", t: 8, d: "Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.", a: "Interest rate of an annuity investment.", m: [3, 6], p: [{ name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_per_period", detail: "The amount per period to be paid.", example: "-100", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "rate_guess", detail: "An estimate for what the interest rate will be.", example: "0.1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "CUMPRINC", t: 8, d: "Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Cumulative principal paid over a set of periods.", m: [6, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "first_period", detail: "The number of the payment period to begin the cumulative calculation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "last_period", detail: "The number of the payment period to end the cumulative calculation.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPNUM", t: 8, d: "Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.", a: "Number of coupons between settlement and maturity.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "02", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SYD", t: 8, d: "Calculates the depreciation of an asset for a specified period using the sum of years digits method.", a: "Depreciation via sum of years digits method.", m: [4, 4], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The single period within `life` for which to calculate depreciation.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLEQ", t: 8, d: "Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.", a: "Equivalent rate of return for a Treasury bill.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the bill at time of purchase.", example: "2)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLYIELD", t: 8, d: "Calculates the yield of a US Treasury Bill based on price.", a: "The yield of a us treasury bill based on price.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLPRICE", t: 8, d: "Calculates the price of a US Treasury Bill based on discount rate.", a: "Price of US treasury bill.", m: [3, 3], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the bill at time of purchase.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PV", t: 8, d: "Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Present value of an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount per period to be paid.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "D2", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ACCRINT", t: 8, d: "Calculates the accrued interest of a security that has periodic payments.", a: "Accrued interest of security with periodic payments.", m: [6, 8], p: [{ name: "issue", detail: "The date the security was initially issued.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "first_payment", detail: "The first date interest will be paid.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "calc_method", detail: "[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \n\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \n\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ACCRINTM", t: 8, d: "Calculates the accrued interest of a security that pays interest at maturity.", a: "Accrued interest of security paying at maturity.", m: [4, 5], p: [{ name: "issue", detail: "The date the security was initially issued.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity date of the security.", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "1000", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYBS", t: 8, d: "Calculates the number of days from the first coupon, or interest payment, until settlement.", a: "Number of days from first coupon to settlement.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYS", t: 8, d: "Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.", a: "Days in coupon period containing settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYSNC", t: 8, d: "Calculates the number of days from the settlement date until the next coupon, or interest payment.", a: "Days from settlement until next coupon.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPNCD", t: 8, d: "Calculates next coupon, or interest payment, date after the settlement date.", a: "Next coupon date after the settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPPCD", t: 8, d: "Calculates last coupon, or interest payment, date before the settlement date.", a: "Last coupon date before settlement date.", m: [3, 4], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FV", t: 8, d: "Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Future value of an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount per period to be paid.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FVSCHEDULE", t: 8, d: "Calculates the future value of some principal based on a specified series of potentially varying interest rates.", a: "Future value of principal from series of rates.", m: [2, 2], p: [{ name: "principal", detail: "The amount of initial capital or value to compound against.", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "rate_schedule", detail: "A series of interest rates to compound against the `principal`.", example: "A2:A100", require: "m", repeat: "n", type: "range" }] }, { n: "YIELD", t: 8, d: "Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.", a: "Annual yield of a security paying periodic interest.", m: [6, 7], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "YIELDDISC", t: 8, d: "Calculates the annual yield of a discount (non-interest-bearing) security, based on price.", a: "Annual yield of a discount security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NOMINAL", t: 8, d: "Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.", a: "Annual nominal interest rate.", m: [2, 2], p: [{ name: "effective_rate", detail: "The effective interest rate per year.", example: "0.85", require: "m", repeat: "n", type: "rangenumber" }, { name: "periods_per_year", detail: "The number of compounding periods per year.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "XIRR", t: 8, d: "Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.", a: "Internal rate of return given non-periodic cashflows.", m: [2, 3], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "cashflow_dates", detail: "An array or range with dates corresponding to the cash flows in `cashflow_amounts`.", example: "C2:C25", require: "m", repeat: "n", type: "range" }, { name: "rate_guess", detail: "An estimate for what the internal rate of return will be.", example: "250", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MIRR", t: 8, d: "Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.", a: "Modified internal rate of return.", m: [3, 3], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "financing_rate", detail: "The interest rate paid on funds invested.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "reinvestment_return_rate", detail: "The return (as a percentage) earned on reinvestment of income received from the investment.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IRR", t: 8, d: "Calculates the internal rate of return on an investment based on a series of periodic cash flows.", a: "Internal rate of return given periodic cashflows.", m: [1, 2], p: [{ name: "cashflow_amounts", detail: "An array or range containing the income or payments associated with the investment.", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "rate_guess", detail: "An estimate for what the internal rate of return will be.", example: "200", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPV", t: 8, d: "Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.", a: "The net present value of an investment based on a series of periodic cash flows and a discount rate.", m: [2, 255], p: [{ name: "discount", detail: "The discount rate of the investment over one period.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cashflow1", detail: "The first future cash flow.", example: "200", require: "m", repeat: "n", type: "rangeall" }, { name: "cashflow2", detail: "Additional future cash flows.", example: "250", require: "o", repeat: "y", type: "rangeall" }] }, { n: "XNPV", t: 8, d: "Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.", a: "Net present value given non-periodic cashflows.", m: [3, 3], p: [{ name: "discount", detail: "The discount rate of the investment over one period.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "cashflow_amounts", detail: "A range of cells containing the income or payments associated with the investment.", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "cashflow_dates", detail: "A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.", example: "C2:C25", require: "m", repeat: "n", type: "range" }] }, { n: "CUMIPMT", t: 8, d: "Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Cumulative interest paid over a set of periods.", m: [6, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "first_period", detail: "The number of the payment period to begin the cumulative calculation.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "last_period", detail: "The number of the payment period to end the cumulative calculation.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PMT", t: 8, d: "Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.", a: "Periodic payment for an annuity investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: " 100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "D2", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IPMT", t: 8, d: "Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Payment on interest for an investment.", m: [4, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The amortization period, in terms of number of periods.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "80000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "E2", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PPMT", t: 8, d: "Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.", a: "Payment on the principal of an investment.", m: [4, 6], p: [{ name: "rate", detail: "The interest rate.", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "The amortization period, in terms of number of periods.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_periods", detail: "The number of payments to be made.", example: "3*12", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INTRATE", t: 8, d: "Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.", a: "Calculates effective interest rate.", m: [4, 5], p: [{ name: "buy_date", detail: "The date of purchase of the investment.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "sell_date", detail: "The date of sale of the investment.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "buy_price", detail: "The price at which the investment was purchased.", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "sell_price", detail: "The price at which the investment was sold.", example: "101200", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PRICE", t: 8, d: "Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.", a: "Price of a security paying periodic interest.", m: [6, 7], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.065", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEDISC", t: 8, d: "Calculates the price of a discount (non-interest-bearing) security, based on expected yield.", a: "Price of a discount security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "The discount rate of the security at time of purchase.", example: "0.0525", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEMAT", t: 8, d: "Calculates the price of a security paying interest at maturity, based on expected yield.", a: "Price of security paying interest at maturity.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "issue", detail: "The date the security was initially issued.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "RECEIVED", t: 8, d: "Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.", a: "Amount received at maturity for a security.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "The amount invested (irrespective of face value of each security).", example: "10000000", require: "m", repeat: "n", type: "rangenumber" }, { name: "discount", detail: "The discount rate of the security invested in.", example: "0.0575", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DISC", t: 8, d: "Calculates the discount rate of a security based on price.", a: "The discount rate of a security based on price.", m: [4, 5], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "price", detail: "The price at which the security is bought per 100 face value.", example: "97.975", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "The redemption amount per 100 face value, or par.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPER", t: 8, d: "Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.", a: "Number of payment periods for an investment.", m: [3, 5], p: [{ name: "rate", detail: "The interest rate.", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "payment_amount", detail: "The amount of each payment made.", example: "500", require: "m", repeat: "n", type: "rangenumber" }, { name: "present_value", detail: "The current value of the annuity.", example: "40000", require: "m", repeat: "n", type: "rangenumber" }, { name: "future_value", detail: "The future value remaining after the final payment has been made.", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "end_or_beginning", detail: "Whether payments are due at the end (`0`) or beginning (`1`) of each period.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SLN", t: 8, d: "Calculates the depreciation of an asset for one period using the straight-line method.", a: "Depreciation of asset using the straight-line method.", m: [3, 3], p: [{ name: "cost", detail: "The initial cost of the asset.", example: "300000", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "The value of the asset at the end of depreciation.", example: "75000", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "The number of periods over which the asset is depreciated.", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DURATION", t: 8, d: "Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.", a: "Number of periods for an investment to reach a value.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MDURATION", t: 8, d: "Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.", a: "Modified Macaulay duration.", m: [5, 6], p: [{ name: "settlement", detail: "The settlement date of the security, the date after issuance when the security is delivered to the buyer.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "The maturity or end date of the security, when it can be redeemed at face, or par value.", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "The annualized rate of interest.", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yield", detail: "The expected annual yield of the security.", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "The number of interest or coupon payments per year (1, 2, or 4).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "day_count_convention", detail: "An indicator of what day count method to use.", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2DEC", t: 9, d: "Converts a signed binary number to decimal format.", a: "Converts a signed binary number to decimal format.", m: [1, 1], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to decimal, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIN2HEX", t: 9, d: "Converts a signed binary number to signed hexadecimal format.", a: "Converts a binary number to hexadecimal.", m: [1, 2], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to signed hexademical, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2OCT", t: 9, d: "Converts a signed binary number to signed octal format.", a: "Converts a binary number to octal.", m: [1, 2], p: [{ name: "signed_binary_number", detail: "The signed 10-bit binary value to be converted to signed octal, provided as a string.", example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2BIN", t: 9, d: "Converts a decimal number to signed binary format.", a: "Converts a decimal number to signed binary format.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed binary, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2HEX", t: 9, d: "Converts a decimal number to signed hexadecimal format.", a: "Converts a decimal number to hexadecimal.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed hexadecimal, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2OCT", t: 9, d: "Converts a decimal number to signed octal format.", a: "Converts a decimal number to signed octal format.", m: [1, 2], p: [{ name: "decimal_number", detail: "The decimal value to be converted to signed octal, provided as a string.", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2BIN", t: 9, d: "Converts a signed hexadecimal number to signed binary format.", a: "Converts a hexadecimal number to binary.", m: [1, 2], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2DEC", t: 9, d: "Converts a signed hexadecimal number to decimal format.", a: "Converts a hexadecimal number to decimal.", m: [1, 1], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "HEX2OCT", t: 9, d: "Converts a signed hexadecimal number to signed octal format.", a: "Converts a hexadecimal number to octal.", m: [1, 2], p: [{ name: "signed_hexadecimal_number", detail: "The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.", example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2BIN", t: 9, d: "Converts a signed octal number to signed binary format.", a: "Converts an octal number to binary.", m: [1, 2], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to signed binary, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2DEC", t: 9, d: "Converts a signed octal number to decimal format.", a: "Converts a signed octal number to decimal format.", m: [1, 1], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to decimal, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }] }, { n: "OCT2HEX", t: 9, d: "Converts a signed octal number to signed hexadecimal format.", a: "Converts an octal number to hexadecimal.", m: [1, 2], p: [{ name: "signed_octal_number", detail: "The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.", example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "significant_digits", detail: "The number of significant digits to ensure in the result.", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COMPLEX", t: 9, d: "Creates a complex number given real and imaginary coefficients.", a: "Creates a complex number.", m: [2, 3], p: [{ name: "real_part", detail: "The real coefficient.", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "imaginary_part", detail: "The imaginary coefficient.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "suffix", detail: "The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.", example: '"j"', require: "o", repeat: "n", type: "rangestring" }] }, { n: "IMREAL", t: 9, d: "Returns the real coefficient of a complex number.", a: "The real coefficient of a complex number.", m: [1, 1], p: [{ name: "complex_number", detail: "The complex number, in the a+bi or a+bj format.", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMAGINARY", t: 9, d: "Returns the imaginary coefficient of a complex number.", a: "The imaginary coefficient of a complex number.", m: [1, 1], p: [{ name: "complex_number", detail: "The complex number, in the a+bi or a+bj format.", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMCONJUGATE", t: 9, d: "Returns the complex conjugate of a number.", a: "The complex conjugate of a number.", m: [1, 1], p: [{ name: "number", detail: "The complex number to calculate the conjugate for.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMABS", t: 9, d: "Returns absolute value (or modulus) of a complex number.", a: "The absolute value of a complex number.", m: [1, 1], p: [{ name: "number", detail: "The complex number to calculate the absolute value of.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DELTA", t: 9, d: "Compare two numeric values, returning 1 if they're equal.", a: "Compare two numeric values.", m: [1, 2], p: [{ name: "number1", detail: "The first number to compare.", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number2", detail: "The second number to compare.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "IMSUM", t: 9, d: "Returns the sum of a series of complex numbers.", a: "Sum of a series of complex numbers.", m: [1, 255], p: [{ name: "value1", detail: "The first complex number or range to add together.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "Additional complex numbers or ranges to add to `value1`.", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMSUB", t: 9, d: "Returns the difference between two complex numbers.", a: "The difference between two complex numbers.", m: [2, 2], p: [{ name: "first_number", detail: "The complex number to subtract second_number from.", example: '"6+5i"', require: "m", repeat: "n", type: "rangeall" }, { name: "second_number", detail: "The complex number to subtract from first_number.", example: '"2+3i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMPRODUCT", t: 9, d: "Returns the result of multiplying a series of complex numbers together.", a: "Result of multiplying a series of complex numbers together.", m: [1, 255], p: [{ name: "factor1", detail: "The first number or range to calculate for the product.", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "factor2", detail: "Additional complex numbers or ranges to calculate for the product.", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMDIV", t: 9, d: "Returns one complex number divided by another.", a: "One complex number divided by another.", m: [2, 2], p: [{ name: "dividend", detail: "The complex number to be divided.", example: '"11+16i"', require: "m", repeat: "n", type: "rangeall" }, { name: "divisor", detail: "The complex number to divide by.", example: '"3+2i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOT", t: 10, d: "Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.", a: "Returns opposite of provided logical value.", m: [1, 1], p: [{ name: "logical_expression", detail: "An expression or reference to a cell holding an expression that represents some logical value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRUE", t: 10, d: "Returns the logical value `TRUE`.", a: "Logical value `true`.", m: [0, 0], p: [] }, { n: "FALSE", t: 10, d: "Returns the logical value `FALSE`.", a: "Logical value `false`.", m: [0, 0], p: [] }, { n: "AND", t: 10, d: "Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.", a: "Logical `and` operator.", m: [1, 255], p: [{ name: "logical_expression1", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical_expression2", detail: "More expressions that represent logical values.", example: 'A3 = "bar"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IFERROR", t: 10, d: "Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.", a: "Value if it is not an error, otherwise 2nd argument.", m: [2, 2], p: [{ name: "value", detail: "The value to return if `value` itself is not an error.", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_error", detail: "The value the function returns if `value` is an error.", example: '"Error in cell A1"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IF", t: 10, d: "Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.", a: "Returns value depending on logical expression.", m: [2, 3], p: [{ name: "logical_expression", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_true", detail: "The value the function returns if `logical_expression` is `TRUE`.", example: '"A2 is foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_false", detail: "The value the function returns if `logical_expression` is `FALSE`.", example: '"A2 was false"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "OR", t: 10, d: "Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.", a: "Logical `or` operator.", m: [1, 255], p: [{ name: "logical_expression1", detail: "An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical_expression2", detail: "More expressions that evaluate to logical values.", example: ' A3 = "bar"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NE", t: 11, d: "Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.", a: "Not equal.", m: [2, 2], p: [{ name: "value1", detail: "The first value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to test against `value1` for inequality.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EQ", t: 11, d: "Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.", a: "Equal.", m: [2, 2], p: [{ name: "value1", detail: "The first value.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to test against `value1` for equality.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GT", t: 11, d: "Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.", a: "Strictly greater than.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being greater than `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GTE", t: 11, d: "Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.", a: "Greater than or equal to.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being greater than or equal to `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LT", t: 11, d: "Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.", a: "Less than.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being less than `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LTE", t: 11, d: "Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.", a: "Less than or equal to.", m: [2, 2], p: [{ name: "value1", detail: "The value to test as being less than or equal to `value2`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The second value.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ADD", t: 11, d: "Returns the sum of two numbers. Equivalent to the `+` operator.", a: "Sum of two numbers", m: [2, 2], p: [{ name: "value1", detail: "The first addend.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "The second addend.", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINUS", t: 11, d: "Returns the difference of two numbers. Equivalent to the `-` operator.", a: "Difference of two numbers", m: [2, 2], p: [{ name: "value1", detail: "The minuend, or number to be subtracted from.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "The subtrahend, or number to subtract from `value1`.", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTIPLY", t: 11, d: "Returns the product of two numbers. Equivalent to the `*` operator.", a: "Product of two numbers", m: [2, 2], p: [{ name: "factor1", detail: "The first multiplicand.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor2", detail: "The second multiplicand.", example: "B2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DIVIDE", t: 11, d: "Returns one number divided by another. Equivalent to the `/` operator.", a: "One number divided by another", m: [2, 2], p: [{ name: "dividend", detail: "The number to be divided.", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "divisor", detail: "The number to divide by.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCAT", t: 11, d: "Returns the concatenation of two values. Equivalent to the `&` operator.", a: "Concatenation of two values", m: [2, 2], p: [{ name: "value1", detail: "The value to which `value2` will be appended.", example: '"de"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "The value to append to `value1`.", example: '"mystify"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UNARY_PERCENT", t: 11, d: "Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.", a: "Value interpreted as a percentage.", m: [1, 1], p: [{ name: "percentage", detail: "The value to interpret as a percentage.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCATENATE", t: 12, d: "Appends strings to one another.", a: "Appends strings to one another.", m: [1, 255], p: [{ name: "string1", detail: "The initial string.", example: '"Super"', require: "m", repeat: "n", type: "rangeall" }, { name: "string2", detail: "More strings to append in sequence.", example: '"calla"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CODE", t: 12, d: "Returns the numeric Unicode map value of the first character in the string provided.", a: "Numeric unicode map value of character.", m: [1, 1], p: [{ name: "string", detail: "The string whose first character's Unicode map value will be returned.", example: '"a"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CHAR", t: 12, d: "Convert a number into a character according to the current Unicode table.", a: "Gets character associated with number.", m: [1, 1], p: [{ name: "table_number", detail: "The number of the character to look up from the current Unicode table in decimal format.", example: "97", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ARABIC", t: 12, d: "Computes the value of a Roman numeral.", a: "Computes the value of a roman numeral.", m: [1, 1], p: [{ name: "roman_numeral", detail: "The Roman numeral to format, whose value must be between 1 and 3999, inclusive.", example: '"XIV"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "ROMAN", t: 12, d: "Formats a number in Roman numerals.", a: "Formats a number in Roman numerals.", m: [1, 1], p: [{ name: "number", detail: "The number to format, between 1 and 3999, inclusive.", example: "499", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "REGEXEXTRACT", t: 12, d: "Extracts matching substrings according to a regular expression.", a: "Extracts matching substrings with regular expression.", m: [2, 2], p: [{ name: "text", detail: "The input text.", example: '"Needle in a haystack"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The first part of `text` that matches this expression will be returned.", example: '".e{2}dle"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXMATCH", t: 12, d: "Whether a piece of text matches a regular expression.", a: "Whether a piece of text matches regular expression.", m: [2, 2], p: [{ name: "text", detail: "The text to be tested against the regular expression.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The regular expression to test the text against.", example: '"S.r"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXREPLACE", t: 12, d: "Replaces part of a text string with a different text string using regular expressions.", a: "Replaces text with regular expressions.", m: [3, 3], p: [{ name: "text", detail: "The text, a part of which will be replaced.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "The regular expression. All matching instances in `text` will be replaced.", example: '"S.*d"', require: "m", repeat: "n", type: "rangeall" }, { name: "replacement", detail: "The text which will be inserted into the original text.", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "T", t: 12, d: "Returns string arguments as text, or the empty string if the value is not text.", a: "String arguments as text.", m: [1, 1], p: [{ name: "value", detail: "The argument to be converted to text.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "FIXED", t: 12, d: "Formats a number with a fixed number of decimal places.", a: "Formats number with fixed number of decimal places.", m: [1, 3], p: [{ name: "number", detail: "The number to format.", example: "3.141592653", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_of_places", detail: "The number of decimal places to display in the result.", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "suppress_separator", detail: "Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FIND", t: 12, d: "Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.", a: "First position of string found in text, case-sensitive.", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "14", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FINDB", t: 12, d: "Returns the position at which a string is first found within text counting each double-character as 2.", a: "Position at which a string is first found within text (binary).", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"new"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: '"new year"', require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "JOIN", t: 12, d: "Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.", a: "Concatenates elements of arrays with delimiter.", m: [2, 255], p: [{ name: "delimiter", detail: "The character or string to place between each concatenated value.", example: '" and-a "', require: "m", repeat: "n", type: "rangeall" }, { name: "value_or_array1", detail: "The value or values to be appended using `delimiter`.", example: "{1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_or_array2", detail: "More values to be appended using `delimiter`.", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LEFT", t: 12, d: "Returns a substring from the beginning of a specified string.", a: "Substring from beginning of specified string.", m: [1, 2], p: [{ name: "string", detail: "The string from which the left portion will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_characters", detail: "The number of characters to return from the left side of `string`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RIGHT", t: 12, d: "Returns a substring from the end of a specified string.", a: "A substring from the end of a specified string.", m: [1, 2], p: [{ name: "string", detail: "The string from which the right portion will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_characters", detail: "The number of characters to return from the right side of `string`.", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MID", t: 12, d: "Returns a segment of a string.", a: "A segment of a string.", m: [3, 3], p: [{ name: "string", detail: "The string to extract a segment from.", example: '"get this"', require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "extract_length", detail: "The length of the segment to extract.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LEN", t: 12, d: "Returns the length of a string.", a: "Length of a string.", m: [1, 1], p: [{ name: "text", detail: "The string whose length will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LENB", t: 12, d: "Returns the length of a string in bytes.", a: "Length of a string in bytes.", m: [1, 1], p: [{ name: "text", detail: "The string whose length will be returned.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LOWER", t: 12, d: "Converts a specified string to lowercase.", a: "Converts a specified string to lowercase.", m: [1, 1], p: [{ name: "text", detail: "The string to convert to lowercase.", example: '"LOREM IPSUM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UPPER", t: 12, d: "Converts a specified string to uppercase.", a: "Converts a specified string to uppercase.", m: [1, 1], p: [{ name: "text", detail: "The string to convert to uppercase.", example: '"lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EXACT", t: 12, d: "Tests whether two strings are identical.", a: "Tests whether two strings are identical.", m: [2, 2], p: [{ name: "string1", detail: "The first string to compare", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "string2", detail: "The second string to compare", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPLACE", t: 12, d: "Replaces part of a text string with a different text string.", a: "Replaces part of a text string with different text.", m: [4, 4], p: [{ name: "text", detail: "The text, a part of which will be replaced.", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "position", detail: "The position where the replacement will begin (starting from 1).", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "length", detail: "The number of characters in the text to be replaced.", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "new_text", detail: "The text which will be inserted into the original text.", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPT", t: 12, d: "Returns specified text repeated a number of times.", a: "Specified text repeated a number of times.", m: [2, 2], p: [{ name: "text_to_repeat", detail: "The character or string to repeat.", example: '"ha"', require: "m", repeat: "n", type: "rangeall" }, { name: "number_of_repetitions", detail: "The number of times `text_to_repeat` should appear in the value returned.", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SEARCH", t: 12, d: "Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.", a: "First position of string found in text, ignoring case.", m: [2, 3], p: [{ name: "search_for", detail: "The string to look for within `text_to_search`.", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "text_to_search", detail: "The text to search for the first occurrence of `search_for`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "starting_at", detail: "The character within `text_to_search` at which to start the search.", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUBSTITUTE", t: 12, d: "Replaces existing text with new text in a string.", a: "Replaces existing text with new text in a string.", m: [3, 4], p: [{ name: "text_to_search", detail: "The text within which to search and replace.", example: '"search for it"', require: "m", repeat: "n", type: "rangeall" }, { name: "search_for", detail: "The string to search for within `text_to_search`.", example: '"search for"', require: "m", repeat: "n", type: "rangeall" }, { name: "replace_with", detail: "The string that will replace `search_for`.", example: '"Google"', require: "m", repeat: "n", type: "rangeall" }, { name: "occurrence_number", detail: "The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CLEAN", t: 12, d: "Returns the text with the non-printable ASCII characters removed.", a: "Removes non-printable characters from a piece of text.", m: [1, 1], p: [{ name: "text", detail: "The text whose non-printable characters are to be removed.", example: '"AF"&CHAR(31)', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TEXT", t: 12, d: "Converts a number into text according to a specified format.", a: "Formats a number into text.", m: [2, 2], p: [{ name: "number", detail: "The number, date, or time to format.", example: "1.23", require: "m", repeat: "n", type: "rangenumber" }, { name: "format", detail: "The pattern by which to format the number, enclosed in quotation marks.", example: '"$0.00"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRIM", t: 12, d: "Removes leading, trailing, and repeated spaces in text.", a: "Removes space characters.", m: [1, 1], p: [{ name: "text", detail: "The text or reference to a cell containing text to be trimmed.", example: '" lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "VALUE", t: 12, d: "Converts a string in any of the date, time or number formats that Google Sheets understands into a number.", a: "Converts a date/time/number string into a number.", m: [1, 1], p: [{ name: "text", detail: "The string containing the value to be converted.", example: '"123"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "PROPER", t: 12, d: "Capitalizes each word in a specified string.", a: "Capitalizes each word in a specified string.", m: [1, 1], p: [{ name: "text_to_capitalize", detail: "The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.", example: '"united states"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CONVERT", t: 13, d: "Converts a numeric value to a different unit of measure.", a: "Unit conversion for numbers.", m: [3, 3], p: [{ name: "value", detail: "The numeric value in `start_unit` to convert to `end_unit`.", example: "5.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_unit", detail: "The starting unit, the unit currently assigned to `value`.", example: '"g"', require: "m", repeat: "n", type: "rangeall" }, { name: "end_unit", detail: "The unit of measure into which to convert the argument, `value`.", example: '"kg"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "SUMX2MY2", t: 14, d: "Calculates the sum of the differences of the squares of values in two arrays.", a: "Sum of the differences of squares.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMX2PY2", t: 14, d: "Calculates the sum of the sums of the squares of values in two arrays.", a: "Sum of the sums of squares.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMXMY2", t: 14, d: "Calculates the sum of the squares of differences of values in two arrays.", a: "Sum of the squares of differences.", m: [2, 2], p: [{ name: "array_x", detail: "The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRANSPOSE", t: 14, d: "Transposes the rows and columns of an array or range of cells.", a: "Transposes the rows and columns of an array.", m: [1, 1], p: [{ name: "array_or_range", detail: "The array or range whose rows and columns will be swapped.", example: "{1,2}", require: "m", repeat: "n", type: "range" }] }, { n: "TREND", t: 14, d: "Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.", a: "Fits points to linear trend derived via least-squares.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_data_x", detail: "The data points to return the `y` values for on the ideal curve fit.", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FREQUENCY", t: 14, d: "Calculates the frequency distribution of a one-column array into specified classes.", a: "The frequency distribution of array.", m: [2, 2], p: [{ name: "data", detail: "The array or range containing the values to be counted.", example: "A2:A40", require: "m", repeat: "n", type: "rangenumber" }, { name: "classes", detail: "The array or range containing the set of classes.", example: "B2:B5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GROWTH", t: 14, d: "Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.", a: "Fits points to exponential growth trend.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_data_x", detail: "The data points to return the `y` values for on the ideal curve fit.", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LINEST", t: 14, d: "Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.", a: "Best-fit linear trend via least-squares.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "calculate_b", detail: "Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "verbose", detail: "A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOGEST", t: 14, d: "Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.", a: "Best-fit exponential growth curve.", m: [1, 4], p: [{ name: "known_data_y", detail: "The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_data_x", detail: "The values of the independent variable(s) corresponding with `known_data_y`.", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "b", detail: "Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "verbose", detail: "A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "MDETERM", t: 14, d: "Returns the matrix determinant of a square matrix specified as an array or range.", a: "Matrix determinant of a square matrix.", m: [1, 1], p: [{ name: "square_matrix", detail: "An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINVERSE", t: 14, d: "Returns the multiplicative inverse of a square matrix specified as an array or range.", a: "Multiplicative inverse of square matrix.", m: [1, 1], p: [{ name: "square_matrix", detail: "An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MMULT", t: 14, d: "Calculates the matrix product of two matrices specified as arrays or ranges.", a: "The matrix product of two matrices.", m: [2, 2], p: [{ name: "matrix1", detail: "The first matrix in the matrix multiplication operation, represented as an array or range.", example: "A1:B3", require: "m", repeat: "n", type: "rangenumber" }, { name: "matrix2", detail: "The second matrix in the matrix multiplication operation, represented as an array or range.", example: "C1:F2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMPRODUCT", t: 14, d: "Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.", a: "Sum of products of elements in two arrays.", m: [1, 255], p: [{ name: "array1", detail: "The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.", example: "A2:C5", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.", example: "D2:F5", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "ISFORMULA", t: 15, d: "Checks whether a value is a formula.", a: "Whether a value is a formula.", m: [1, 1], p: [{ name: "cell", detail: "The cell to be verified as containing a formula.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "CELL", t: 15, d: "Returns the requested information about the specified cell.", a: "Gets information about a cell.", m: [2, 2], p: [{ name: "info_type", detail: "The type of information requested (see article for available types)", example: '"type"', require: "m", repeat: "n", type: "rangeall" }, { name: "reference", detail: "The reference to the cell.", example: "C2", require: "m", repeat: "n", type: "range" }] }, { n: "NA", t: 15, d: 'Returns the "value not available" error, `#N/A`.', a: "The `#N/A` error.", m: [0, 0], p: [] }, { n: "ERROR_TYPE", t: 15, d: "Returns a number corresponding to the error value in a different cell.", a: "Error value of cell (as number).", m: [1, 1], p: [{ name: "reference", detail: "The cell to find the error number for although you can also provide the error value directly.", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISBLANK", t: 15, d: "Checks whether the referenced cell is empty.", a: "Whether the referenced cell is empty.", m: [1, 1], p: [{ name: "value", detail: "Reference to the cell that will be checked for emptiness.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISERR", t: 15, d: "Checks whether a value is an error other than `#N/A`.", a: "Whether a value is an error other than `#n/a`.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as an error type other than `#N/A`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISERROR", t: 15, d: "Checks whether a value is an error.", a: "Whether a value is an error.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as an error type.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISLOGICAL", t: 15, d: "Checks whether a value is `TRUE` or `FALSE`.", a: "Whether a value is `true` or `false`.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a logical `TRUE` or `FALSE`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNA", t: 15, d: "Checks whether a value is the error `#N/A`.", a: "Whether a value is the error `#n/a`.", m: [1, 1], p: [{ name: "value", detail: "The value to be compared with the error value `#N/A`.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNONTEXT", t: 15, d: "Checks whether a value is non-textual.", a: "Whether a value is non-textual.", m: [1, 1], p: [{ name: "value", detail: "The value to be checked.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNUMBER", t: 15, d: "Checks whether a value is a number.", a: "Whether a value is a number.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a number.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISREF", t: 15, d: "Checks whether a value is a valid cell reference.", a: "Whether a value is a valid cell reference.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as a cell reference.", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISTEXT", t: 15, d: "Checks whether a value is text.", a: "Whether a value is text.", m: [1, 1], p: [{ name: "value", detail: "The value to be verified as text.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TYPE", t: 15, d: "Returns a number associated with the type of data passed into the function.", a: "Get the type of a value.", m: [1, 1], p: [{ name: "value", detail: "The value whose type is to be determined.", example: "C4", require: "m", repeat: "n", type: "rangeall" }] }, { n: "N", t: 15, d: "Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.", a: "Argument provided as a number.", m: [1, 1], p: [{ name: "value", detail: "The argument to be converted to a number.", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DATE", t: 16, d: "Converts a provided number to a date.", a: "Converts a provided number to a date.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a date.", example: "25405", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PURE_NUMBER", t: 16, d: "Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.", a: "Converts any numeric value to a pure number.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a pure number.", example: "50%", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_TEXT", t: 16, d: "Converts a provided numeric value to a text value.", a: "Converts a provided numeric value to a text value.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to text.", example: "24", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DOLLARS", t: 16, d: "Converts a provided number to a dollar value.", a: "Converts a provided number to a dollar value.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a dollar value.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PERCENT", t: 16, d: "Converts a provided number to a percentage.", a: "Converts a provided number to a percentage.", m: [1, 1], p: [{ name: "value", detail: "The argument or reference to a cell to be converted to a percentage.", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DGET", t: 17, d: "Returns a single value from a database table-like array or range using a SQL-like query.", a: "Single value from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMAX", t: 17, d: "Returns the maximum value selected from a database table-like array or range using a SQL-like query.", a: "Maximum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMIN", t: 17, d: "Returns the minimum value selected from a database table-like array or range using a SQL-like query.", a: "Minimum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DAVERAGE", t: 17, d: "Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.", a: "Average of a set of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNT", t: 17, d: "Counts numeric values selected from a database table-like array or range using a SQL-like query.", a: "Counts values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNTA", t: 17, d: "Counts values, including text, selected from a database table-like array or range using a SQL-like query.", a: "Counts values and text from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DPRODUCT", t: 17, d: "Returns the product of values selected from a database table-like array or range using a SQL-like query.", a: "Product of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEV", t: 17, d: "Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.", a: "Standard deviation of population sample from table.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEVP", t: 17, d: "Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.", a: "Standard deviation of entire population from table.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSUM", t: 17, d: "Returns the sum of values selected from a database table-like array or range using a SQL-like query.", a: "Sum of values from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVAR", t: 17, d: "Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.", a: "Variance of population sample from table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVARP", t: 17, d: "Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.", a: "Variance of a population from a table-like range.", m: [3, 3], p: [{ name: "database", detail: "The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "Indicates which column in `database` contains the values to be extracted and operated on.", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "An array or range containing zero or more criteria to filter the `database` values by before operating.", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "AGE_BY_IDCARD", t: "3", d: "Calculate the age based on the Chinese ID number. Support 15 or 18", a: "Get age based on ID number.", m: [1, 2], p: [{ name: "ID number", example: "A1", detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }, { name: "Deadline", example: '"2017-10-01"', detail: "The deadline or range of age calculation. The default is the current day.", require: "o", repeat: "n", type: "rangedatetime" }] }, { n: "SEX_BY_IDCARD", t: "3", d: "Calculate gender based on Chinese ID number. Support 15 or 18", a: "Get gender based on ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIRTHDAY_BY_IDCARD", t: "3", d: "Calculate the birthday based on the Chinese ID number. Support 15 or 18", a: "Get the birthday based on the ID number.", m: [1, 2], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }, { name: "Birthday format", example: "0", detail: "Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PROVINCE_BY_IDCARD", t: "3", d: "Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18", a: "Get the province of birthplace based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "CITY_BY_IDCARD", t: "3", d: "Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18", a: "Get the city of birthplace based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "STAR_BY_IDCARD", t: "3", d: "Calculate the constellation based on the Chinese ID number. Support 15 or 18", a: "Get the constellation based on the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ANIMAL_BY_IDCARD", t: "3", d: "Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18", a: "Get the zodiac according to the ID number.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISIDCARD", t: "3", d: "Verify that the format of the ID card is correct. Support 15 or 18", a: "Verify the correctness of the ID card format.", m: [1, 1], p: [{ name: "ID number", example: '"31033519900101XXXX"', detail: "15-digit or 18-digit ID number or range.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DM_TEXT_CUTWORD", t: "4", d: "Text segmentation. Split a series of words into a series of individual words", a: "Chinese text segmentation.", m: [1, 2], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Word segmentation mode", example: "0", detail: "The default is 0[precision mode], 1[full mode], 2[search engine mode].", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TFIDF", t: "4", d: "Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text", a: "tf-idf keyword recognition.", m: [1, 3], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Number of keywords", example: "20", detail: "The number of keywords returned by the algorithm, the default is 20", require: "o", repeat: "n", type: "rangenumber" }, { name: "Corpus", example: "1", detail: "Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TEXTRANK", t: "4", d: "Use TextRank algorithm to extract keywords. Identify keywords from a series of text", a: "TextRank keyword recognition.", m: [1, 3], p: [{ name: "Text", example: '"I came to Beijing Tsinghua University"', detail: "Any text that needs word segmentation.", require: "m", repeat: "n", type: "rangeall" }, { name: "Number of keywords", example: "20", detail: "The number of keywords returned by the algorithm, the default is 20", require: "o", repeat: "n", type: "rangenumber" }, { name: "Corpus", example: "1", detail: "Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_CLOSE", t: "5", d: "According to the stock code and date, return the corresponding stock closing price of A shares.", a: "Returns the closing price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_OPEN", t: "5", d: "According to the stock code and date, return the opening price of stock.", a: "Return the opening price of a shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MAX", t: "5", d: "According to the stock code and date, return the highest price of stock.", a: "Return the highest price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MIN", t: "5", d: "According to the stock code and date, return the lowest price of stock.", a: "Returns the lowest price of stock.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_VOLUMN", t: "5", d: "According to the stock code and date, return the corresponding stock trading volume of A shares.", a: "Returns the corresponding stock trading volume of A shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_AMOUNT", t: "5", d: "According to the stock code and date, return the corresponding stock turnover of A shares.", a: "Returns the corresponding stock turnover of A shares.", m: [1, 3], p: [{ name: "Stock code", example: '"000001"', detail: "6-digit stock code, required.", require: "m", repeat: "n", type: "rangeall" }, { name: "Date", example: "2015-01-08", detail: "The trading day of the stock, the default is the latest trading day", require: "o", repeat: "n", type: "rangedate" }, { name: "Reversion and exclusion", example: "0", detail: "Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ISDATE", t: "6", d: "Returns whether a value is a date.", a: "Whether a value is a date.", m: [1, 1], p: [{ name: "value", example: '"1990-01-01"', detail: "The value to be verified as a date.", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LINESPLINES", t: "3", d: "Generate sparklines embedded in the cell to describe the continuous trend of data", a: "Generate sparklines line chart", m: [1, 8], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Line color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Line thickness", example: "1", detail: "Line thickness of the line graph, the default is 1px", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line", example: "avg", detail: "A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line color", example: "#000", detail: "Color setting of auxiliary line, same as line color configuration, default #000", require: "o", repeat: "n", type: "rangeall" }, { name: "Maximum mark", example: "#fc5c5c", detail: "Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Minimum mark", example: "#fc5c5c", detail: "Identify the minimum value of the line graph, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Mark size", example: "1.5", detail: "The maximum and minimum mark size settings, the default is 1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AREASPLINES", t: "3", d: "Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data", a: "Generate sparklines area chart", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Line color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Fill color", example: "#CCF3F4", detail: "Form an area chart, the same line color configuration, default 0 does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Line thickness", example: "1", detail: "Line thickness of the line graph, the default is 1px", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line", example: "avg", detail: "A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none", require: "o", repeat: "n", type: "rangeall" }, { name: "Auxiliary line color", example: "#000", detail: "Color setting of auxiliary line, same as line color configuration, default #000", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNSPLINES", t: "3", d: "Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data", a: "Generate sparklines vertical histogram", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKCOLUMNSPLINES", t: "3", d: "Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data", a: "Generate sparklines cumulative vertical histogram", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Stack by column", example: "1", detail: "If you need to stack by row, set this item to false or 0, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BARSPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the size of discrete data", a: "Generate sparklines horizontal bar graph", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKBARSPLINES", t: "3", d: "Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data", a: "Generate sparklines cumulative horizontal bar graph", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Stack by column", example: "1", detail: "If you need to stack by row, set this item to false or 0, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Max", example: "100", detail: "The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "DISCRETESPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the trend of discrete data", a: "Generate sparklines discrete graph", m: [1, 4], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Segmentation threshold", example: "1", detail: "Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0", require: "o", repeat: "n", type: "rangeall" }, { name: "Above threshold color", example: "#2ec7c9", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "Below threshold color", example: "#fc5c5c", detail: "The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }] }, { n: "TRISTATESPLINES", t: "3", d: "Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.", a: "Generate sparklines three-state graph", m: [1, 6], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Bar interval", example: "1", detail: "The distance between bars, the default is 1", require: "o", repeat: "n", type: "rangeall" }, { name: "Bar color", example: "#fc5c5c", detail: "The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "Negative bar color", example: "#97b552", detail: "Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "Zero value bar color", example: "#999", detail: "Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PIESPLINES", t: "3", d: "Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data", a: "Generate sparklines pie chart", m: [1, 5], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Rotation angle", example: "0", detail: "The rotation angle of the pie chart, the default is 0", require: "o", repeat: "n", type: "rangeall" }, { name: "border", example: "0", detail: "Pie chart border size, default is none 0", require: "o", repeat: "n", type: "rangeall" }, { name: "Border color", example: "#000", detail: "The border color of the pie chart, the default is #000", require: "o", repeat: "n", type: "rangeall" }, { name: "Color palette", example: "#97b552", detail: "The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BOXSPLINES", t: "3", d: "Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set", a: "Generate sparklines box plot", m: [1, 4], p: [{ name: "Range", example: "A1:A20", detail: "RangeValues can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Outlier ratio", example: "1.5", detail: "The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times", require: "o", repeat: "n", type: "rangeall" }, { name: "Target value", example: "10", detail: "The target value setting on the box plot, the default is false and does not display", require: "o", repeat: "n", type: "rangeall" }, { name: "Point size", example: "1.5", detail: "The radius of the target point and outlier is set, the default is 1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "BULLETSPLINES", t: "3", d: "Generate sparklines embedded in the cell, generally used to describe the task achievement rate", a: "Generating sparklines bullets", m: [2, 3], p: [{ name: "Target", example: "10", detail: "The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "achieved", example: "8", detail: "Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.", require: "m", repeat: "n", type: "rangeall" }, { name: "Contrast", example: "12", detail: "Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMPOSESPLINES", t: "3", d: "Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram", a: "Combine sparklines graphs into one cell", m: [1, 1], p: [{ name: "config", example: "PIESPLINES(A1:A20)", detail: "Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.", require: "m", repeat: "y", type: "rangeall" }] }, { n: "SORT", t: "14", d: "Sorts the rows of a given array or range by the values in one or more columns.", a: "Sorts rows of range by specified column.", m: [1, 4], p: [{ name: "range", detail: "The data to be sorted.", example: "A2:A17", require: "m", repeat: "n", type: "rangenumber" }, { name: "sort_column", detail: "The index of the column in `range` or a range outside of `range` containing the values by which to sort.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "is_ascending", detail: "`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.", example: "-1", require: "o", repeat: "n", type: "rangenumber" }, { name: "sort_column2", detail: "Additional columns.", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FILTER", t: "14", d: "Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.", a: "Filters a range based off provided conditions.", m: [2, 3], p: [{ name: "range", detail: "The data to be filtered.", example: "A5:D20", require: "m", repeat: "n", type: "range" }, { name: "condition1", detail: "A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.", example: "1", require: "m", repeat: "n", type: "range" }, { name: "condition2", detail: "Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.", example: '""', require: "o", repeat: "n", type: "rangeall" }] }, { n: "UNIQUE", t: "14", d: "Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.", a: "Unique rows in the provided source range.", m: [1, 3], p: [{ name: "range", detail: "The data to filter by unique entries.", example: "A2:B26", require: "m", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "occurs_once", detail: "[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANDARRAY", t: "14", d: "Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.", a: "Returns a grid of random numbers.", m: [0, 2], p: [{ name: "rows", detail: "The number of rows to populate with a random number.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "columns", detail: "The number of columns to populate with a random number.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SEQUENCE", t: "14", d: "Returns a grid of sequential numbers starting at a specified start value and increasing by a specified step size. By default, the sequence starts at and increases by 1.", a: "Returns a grid of sequential numbers.", m: [1, 4], p: [{ name: "rows", detail: "The number of rows in the function's resulting grid.", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "columns", detail: "The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "start", detail: "The number, at which to start the sequence. If omitted, the sequence will start at 1.", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "step", detail: "The amount each value in the sequence will differ by. If omitted, each value will differ by 1.", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "EVALUATE", t: "3", d: "Evaluate a formula or expression expressed in words and return the result", a: "Evaluate according to literal formula or expression.", m: [1, 1], p: [{ name: "expression", example: '"A1+5*2^2"', detail: "Formula or expression", require: "m", repeat: "n", type: "rangeall" }] }], toolbar: { undo: "Deshacer", redo: "Rehacer", paintFormat: "Clonar formato", currencyFormat: "Formato de moneda", percentageFormat: "Formato de porcentaje", numberDecrease: "Menos decimales", numberIncrease: "Más decimales", moreFormats: "Más formatos", font: "Fuente", fontSize: "Tamaño Fuente", bold: "Negrita (Ctrl+B)", italic: "Itálica (Ctrl+I)", strikethrough: "Tachar (Alt+Shift+5)", underline: "Guion bajo", textColor: "Color texto", chooseColor: "elegir color", resetColor: "Reinicializar", customColor: "PERSONALIZADO", alternatingColors: "Colores alternos", confirmColor: "Vale", cancelColor: "Cancelar", collapse: "Recoger", fillColor: "Color de relleno", border: "Borde", borderStyle: "Estilo Borde", mergeCell: "Juntar celdas", chooseMergeType: "Elegir tipo de unión", horizontalAlign: "Alineación Horizontal", verticalAlign: "Alineación Vertical", alignment: "Alineación", textWrap: "Ajuste de texto", textWrapMode: "Modo de ajuste de texto", textRotate: "Rotar texto", textRotateMode: "Modo de rotar texto", freezeTopRow: "Fijar fila superior", sortAndFilter: "Ordenar y filtrar", findAndReplace: "Buscar y reemplazar", sum: "SUMA", autoSum: "SUMA automática", moreFunction: "Más funciones", conditionalFormat: "Formato condicional", postil: "Comentario", pivotTable: "Tabla Dinámica", chart: "Gráfica", screenshot: "Captura de pantalla", splitColumn: "Separar texto", insertImage: "Insertar imagen", dataVerification: "Verificación de datos", protection: "Proteger la hoja", clearText: "Limpiar color", noColorSelectedText: "Ningún color seleccionado", toolMore: "Más", toolLess: "Menos", toolClose: "Cerrar", toolMoreTip: "Más funcionalidades", moreOptions: "Más opciones", cellFormat: "Configuración formato de celda", print: "Imprimir" }, alternatingColors: { applyRange: "Aplicar a rango", selectRange: "Seleccionar un rango de datos", header: "Cabecera", footer: "Pie", errorInfo: "No se puede realizar esta operación en varias áreas de selección, selecciona una sola área y vuelve a intentarlo", textTitle: "Estilo Formato", custom: "PERSONALIZADO", close: "cerrar", selectionTextColor: "Haz clic para seleccionar el color del texto", selectionCellColor: "Haz clic para seleccionar el color de la celda", removeColor: "Eliminar colores alternos", colorShow: "color", currentColor: "Actual", tipSelectRange: "Selecciona la gama de colores alternos", errorNoRange: "No hay ningún rango seleccionado", errorExistColors: "Los colores alternos ya existen y no se pueden editar" }, button: { confirm: "Vale", cancel: "Cancelar", close: "Cerrar", update: "Actualizar", delete: "Eliminar", insert: "Insertar" }, paint: { start: "Inicio clonar formato", end: "ESC", tipSelectRange: "Selecciona el rango que quieres copiar", tipNotMulti: "No se puede realizar esta operación en un rango de selección múltiple" }, format: { moreCurrency: "Más formatos de moneda", moreDateTime: "Más formatos de fecha y hora", moreNumber: "Más formatos de número", titleCurrency: "Formatos de moneda", decimalPlaces: "Decimales", titleDateTime: "Formatos de fecha y hora", titleNumber: "Formatos de números" }, info: { detailUpdate: "Nuevo abierto", detailSave: "Cache local restaurado", row: "", column: "", loading: "Cargando", copy: "Copiar", return: "Salir", rename: "Renombrar", tips: "Renombrar Libro", noName: "Hoja sin título", wait: "esperando actualización", add: "Añadir", addLast: "más filas al final", backTop: "Volver arriba", pageInfo: "Total ${total}página ${totalPage}actual ${currentPage}", nextPage: "Siguiente", tipInputNumber: "Introduce el número", tipInputNumberLimit: "El rango de aumento está limitado a 1-100", tipRowHeightLimit: "La altura de la fila debe estar entre 0 ~ 545", tipColumnWidthLimit: "El ancho de la columna debe estar entre 0 ~ 2038", pageInfoFull: "Total ${total}página ${totalPage}Se muestran todos los datos" }, currencyDetail: { RMB: "RMB", USdollar: "Dólar US", EUR: "EUR", GBP: "GBP", HK: "HK", JPY: "JPY", AlbanianLek: "Albanian Lek", AlgerianDinar: "Algerian Dinar", Afghani: "Afghani", ArgentinePeso: "Argentine Peso", UnitedArabEmiratesDirham: "United Arab Emirates Dirham", ArubanFlorin: "Aruban Florin", OmaniRial: "Omani Rial", Azerbaijanimanat: "Azerbaijani manat", EgyptianPound: "Egyptian Pound", EthiopianBirr: "Ethiopian Birr", AngolaKwanza: "Angola Kwanza", AustralianDollar: "Australian Dollar", Patacas: "Patacas", BarbadosDollar: "Barbados Dollar", PapuaNewGuineaKina: "Papua New Guinea Kina", BahamianDollar: "Bahamian Dollar", PakistanRupee: "Pakistan Rupee", ParaguayanGuarani: "Paraguayan Guarani", BahrainiDinar: "Bahraini Dinar", PanamanianBalboa: "Panamanian Balboa", Brazilianreal: "Brazilian real", Belarusianruble: "Belarusian ruble", BermudianDollar: "Bermudian Dollar", BulgarianLev: "Bulgarian Lev", IcelandKrona: "Iceland Krona", BosniaHerzegovinaConvertibleMark: "Bosnia-Herzegovina Convertible Mark", PolishZloty: "Polish Zloty", Boliviano: "Boliviano", BelizeDollar: "Belize Dollar", BotswanaPula: "Botswana Pula", NotDannuzhamu: "Not Dannuzhamu", BurundiFranc: "Burundi Franc", NorthKoreanWon: "North Korean Won", DanishKrone: "Danish Krone", EastCaribbeanDollar: "East Caribbean Dollar", DominicaPeso: "Dominica Peso", RussianRuble: "Russian Ruble", EritreanNakfa: "Eritrean Nakfa", CFAfranc: "CFA franc", PhilippinePeso: "Philippine Peso", FijiDollar: "Fiji Dollar", CapeVerdeEscudo: "Cape Verde Escudo", FalklandIslandsPound: "Falkland Islands Pound", GambianDalasi: "Gambian Dalasi", Congolesefranc: "Congolese franc", ColombianPeso: "Colombian Peso", CostaRicanColon: "Costa Rican Colon", CubanPeso: "Cuban Peso", Cubanconvertiblepeso: "Cuban convertible peso", GuyanaDollar: "Guyana Dollar", KazakhstanTenge: "Kazakhstan Tenge", Haitiangourde: "Haitian gourde", won: "won", NetherlandsAntillesGuilder: "Netherlands Antilles Guilder", Honduraslempiras: "Honduras lempiras", DjiboutiFranc: "Djibouti Franc", KyrgyzstanSom: "Kyrgyzstan Som", GuineaFranc: "Guinea Franc", CanadianDollar: "Canadian Dollar", GhanaianCedi: "Ghanaian Cedi", Cambodianriel: "Cambodian riel", CzechKoruna: "Czech Koruna", ZimbabweDollar: "Zimbabwe Dollar", QatariRiyal: "Qatari Riyal", CaymanIslandsDollar: "Cayman Islands Dollar", Comorianfranc: "Comorian franc", KuwaitiDinar: "Kuwaiti Dinar", CroatianKuna: "Croatian Kuna", KenyanShilling: "Kenyan Shilling", LesothoLoti: "Lesotho Loti", LaoKip: "Lao Kip", LebanesePound: "Lebanese Pound", Lithuanianlitas: "Lithuanian litas", LibyanDinar: "Libyan Dinar", LiberianDollar: "Liberian Dollar", RwandaFranc: "Rwanda Franc", RomanianLeu: "Romanian Leu", MalagasyAriary: "Malagasy Ariary", MaldivianRufiyaa: "Maldivian Rufiyaa", MalawiKwacha: "Malawi Kwacha", MalaysianRinggit: "Malaysian Ringgit", MacedoniawearingDinar: "Macedonia wearing Dinar", MauritiusRupee: "Mauritius Rupee", MauritanianOuguiya: "Mauritanian Ouguiya", MongolianTugrik: "Mongolian Tugrik", BangladeshiTaka: "Bangladeshi Taka", PeruvianNuevoSol: "Peruvian Nuevo Sol", MyanmarKyat: "Myanmar Kyat", MoldovanLeu: "Moldovan Leu", MoroccanDirham: "Moroccan Dirham", MozambiqueMetical: "Mozambique Metical", MexicanPeso: "Mexican Peso", NamibianDollar: "Namibian Dollar", SouthAfricanRand: "South African Rand", SouthSudanesePound: "South Sudanese Pound", NicaraguaCordoba: "Nicaragua Cordoba", NepaleseRupee: "Nepalese Rupee", NigerianNaira: "Nigerian Naira", NorwegianKrone: "Norwegian Krone", GeorgianLari: "Georgian Lari", RMBOffshore: "RMB (Offshore)", SwedishKrona: "Swedish Krona", SwissFranc: "Swiss Franc", SerbianDinar: "Serbian Dinar", SierraLeone: "Sierra Leone", SeychellesRupee: "Seychelles Rupee", SaudiRiyal: "Saudi Riyal", SaoTomeDobra: "Sao Tome Dobra", SaintHelenapound: "Saint Helena pound", SriLankaRupee: "Sri Lanka Rupee", SwazilandLilangeni: "Swaziland Lilangeni", SudanesePound: "Sudanese Pound", Surinamesedollar: "Surinamese dollar", SolomonIslandsDollar: "Solomon Islands Dollar", SomaliShilling: "Somali Shilling", TajikistanSomoni: "Tajikistan Somoni", PacificFranc: "Pacific Franc", ThaiBaht: "Thai Baht", TanzanianShilling: "Tanzanian Shilling", TonganPaanga: "Tongan Pa'anga", TrinidadandTobagoDollar: "Trinidad and Tobago Dollar", TunisianDinar: "Tunisian Dinar", TurkishLira: "Turkish Lira", VanuatuVatu: "Vanuatu Vatu", GuatemalanQuetzal: "Guatemalan Quetzal", CommissionBolivar: "Commission Bolivar", BruneiDollar: "Brunei Dollar", UgandanShilling: "Ugandan Shilling", UkrainianHryvnia: "Ukrainian Hryvnia", UruguayanPeso: "Uruguayan Peso", Uzbekistansom: "Uzbekistan som", WesternSamoaTala: "Western Samoa Tala", SingaporeDollar: "Singapore Dollar", NT: "NT", NewZealandDollar: "New Zealand Dollar", HungarianForint: "Hungarian Forint", SyrianPound: "Syrian Pound", JamaicanDollar: "Jamaican Dollar", ArmenianDram: "Armenian Dram", YemeniRial: "Yemeni Rial", IraqiDinar: "Iraqi Dinar", IranianRial: "Iranian Rial", NewIsraeliShekel: "New Israeli Shekel", IndianRupee: "Indian Rupee", IndonesianRupiah: "Indonesian Rupiah", JordanianDinar: "Jordanian Dinar", VND: "VND", ZambianKwacha: "Zambian Kwacha", GibraltarPound: "Gibraltar Pound", ChileanPeso: "Chilean Peso", CFAFrancBEAC: "CFA Franc BEAC" }, defaultFmt: [{ text: "Automático", value: "General", example: "" }, { text: "Texto", value: "@", example: "" }, { text: "", value: "partir", example: "" }, { text: "Número", value: "##0.00", example: "1000.12" }, { text: "Porcentaje", value: "#0.00%", example: "12.21%" }, { text: "Científico", value: "0.00E+00", example: "1.01E+5" }, { text: "", value: "split", example: "" }, { text: "Contabilidad", value: "¥(0.00)", example: "¥(1200.09)" }, { text: "Moneda", value: "¥0.00", example: "¥1200.09" }, { text: "", value: "partir", example: "" }, { text: "Fecha", value: "yyyy-MM-dd", example: "2017-11-29" }, { text: "Hora", value: "hh:mm AM/PM", example: "3:00 PM" }, { text: "Hora 24H", value: "hh:mm", example: "15:00" }, { text: "Fecha Hora", value: "yyyy-MM-dd hh:mm AM/PM", example: "2017-11-29 3:00 PM" }, { text: "Fecha Hora 24 H", value: "yyyy-MM-dd hh:mm", example: "2017-11-29 15:00" }, { text: "", value: "partir", example: "" }, { text: "Formatos personalizados", value: "fmtOtherSelf", example: "más" }], dateFmtList: [{ name: "1930-08-05", value: "yyyy-MM-dd" }, { name: "1930/8/5", value: "yyyy/MM/dd" }, { name: "08-05", value: "MM-dd" }, { name: "8-5", value: "M-d" }, { name: "13:30:30", value: "h:mm:ss" }, { name: "13:30", value: "h:mm" }, { name: "PM 01:30", value: "AM/PM hh:mm" }, { name: "PM 1:30", value: "AM/PM h:mm" }, { name: "PM 1:30:30", value: "AM/PM h:mm:ss" }, { name: "08-05 PM 01:30", value: "MM-dd AM/PM hh:mm" }], fontFamily: { MicrosoftYaHei: "YaHei" }, fontarray: ["Times New Roman", "Arial", "Tahoma", "Verdana"], fontjson: { "times new roman": 0, arial: 1, tahoma: 2, verdana: 3 }, border: { borderTop: "borderTop", borderBottom: "borderBottom", borderLeft: "borderLeft", borderRight: "borderRight", borderNone: "borderNone", borderAll: "borderAll", borderOutside: "borderOutside", borderInside: "borderInside", borderHorizontal: "borderHorizontal", borderVertical: "borderVertical", borderColor: "borderColor", borderSize: "borderSize" }, merge: { mergeAll: "Unir todo", mergeV: "Verticalmente", mergeH: "Horizontalmente", mergeCancel: "Separar", overlappingError: "No se pueden fusionar áreas superpuestas", partiallyError: "No se puede realizar esta operación en celdas parcialmente unidas" }, align: { left: "izquierda", center: "centro", right: "derecha", top: "Arriba", middle: "Centro", bottom: "Abajo" }, textWrap: { overflow: "Desbordar", wrap: "Ajustar", clip: "Cortar" }, rotation: { none: "Ninguno", angleup: "Ladear Arriba", angledown: "Ladear Abajo", vertical: "Apilar Verticalmente", rotationUp: "Rotar Arriba", rotationDown: "Rotar Abajo" }, freezen: { default: "Fijar", freezenRow: "Primera Fila", freezenColumn: "Primera Columna", freezenRC: "Ambas", freezenRowRange: "Fijar rango filas", freezenColumnRange: "Fijar rango columnas", freezenRCRange: "Fijar ambos rangos", freezenCancel: "Cancelar", noSeletionError: "No hay rango para seleccionar" }, sort: { asc: "Ascendente ", desc: "Descendente ", custom: "Ordenación personalizada", hasTitle: "Los datos tienen una fila de encabezado", sortBy: "Ordenar por", addOthers: "Añadir otra columna de ordenación", close: "cerrar", confirm: "ordenar", columnOperation: "Columna", secondaryTitle: "y después por", sortTitle: "Ordenar rango", sortRangeTitle: "Ordenar rango de", sortRangeTitleTo: "a", noRangeError: "No se puede realizar esta operación en múltiples áreas de selección, selecciona un solo rango e intenta nuevamente", mergeError: "Hay celdas combinadas en la selección, ¡esta operación no se puede realizar!" }, filter: { filter: "crear filtro", sortByAsc: "Ordenar A-Z", sortByDesc: "Ordenar Z-A", filterByColor: "Filtrar por color", filterByCondition: "Filtrar por condición", filterByValues: "Filtrar por valores", filiterInputNone: "Ninguno", filiterInputTip: "Introduce valor de filtro", filiterRangeStartTip: "Valor para fórmula", filiterRangeEndTip: "Valor para fórmula", filterValueByAllBtn: "Seleccionar todos", filterValueByClearBtn: "Limpiar", filterValueByInverseBtn: "Invertir", filterValueByTip: "filtrar por valores", filterConform: "Confirmar", filterCancel: "Cancelar", clearFilter: "Quitar filtro", conditionNone: "Ninguno", conditionCellIsNull: "Está vacío", conditionCellNotNull: "No está vacío", conditionCellTextContain: "El texto contiene", conditionCellTextNotContain: "El texto no contiene", conditionCellTextStart: "El texto empieza con", conditionCellTextEnd: "El texto termina con", conditionCellTextEqual: "El texto es exactamente", conditionCellDateEqual: "La fecha es", conditionCellDateBefore: "La fecha es anterior", conditionCellDateAfter: "La fecha es posterior", conditionCellGreater: "Mayor que", conditionCellGreaterEqual: "Mayor o igual que", conditionCellLess: "Menor que", conditionCellLessEqual: "Menor o igual que", conditionCellEqual: "Es igual a", conditionCellNotEqual: "No es igual a", conditionCellBetween: "Está entre", conditionCellNotBetween: "No está entre", filiterMoreDataTip: "¡Gran cantidad de datos! por favor espera", filiterMonthText: "Mes", filiterYearText: "Año", filiterByColorTip: "Filtrar por color de celda", filiterByTextColorTip: "Filtrar por color de fuente", filterContainerOneColorTip: "Esta columna contiene solo un color", filterDateFormatTip: "Format fecha", valueBlank: "(Nulo)", mergeError: "Hay celdas combinadas en la selección del filtro, ¡esta operación no se puede realizar!" }, rightclick: { copy: "Copiar", copyAs: "Copiar como", paste: "Pegar", insert: "Insertar", delete: "Eliminar", deleteCell: "Eliminar celda", deleteSelected: "Eliminar seleccionado ", hide: "Esconder", hideSelected: "Esconder seleccionado ", showHide: "Mostrar ocultos ", to: "Hacia", left: "Izquierda", right: "Derecha", top: "Arriba", bottom: "Abajo", moveLeft: "Mover izquierda", moveUp: "Mover arriba", add: "Añadir", row: "Fila", column: "Columna", width: "Ancho", height: "Alto", number: "Número", confirm: "Confirmar", orderAZ: "Ordenar A-Z", orderZA: "Ordenar Z-A", clearContent: "Limpiar contenido", matrix: "Operación de Matriz", sortSelection: "Ordenar", filterSelection: "Filtrar", chartGeneration: "Crear gráfico", firstLineTitle: "título primera línea", untitled: "sin título", array1: "Matriz unidimensional", array2: "Matriz bidimensional", array3: "Matrices multidimensionales", diagonal: "Diagonal", antiDiagonal: "Anti-diagonal", diagonalOffset: "Desplazamiento Diagonal", offset: "Desplazamiento", boolean: "Booleana", flip: "Voltear", upAndDown: "Arriba y abajo", leftAndRight: "Izquierda y derecha", clockwise: "Sentido horario", counterclockwise: "Sentido anti-horario", transpose: "Transponer", matrixCalculation: "Cálculo de matrices", plus: "Suma", minus: "Resta", multiply: "Multiplicación", divided: "División", power: "Exponenciación", root: "Raíz Cuadrada", log: "Logaritmo", delete0: "Eliminar valores nulos en ambos extremos", removeDuplicate: "Eliminar valores duplicados", byRow: "Por fila", byCol: "Por columna", generateNewMatrix: "Generar nueva matriz" }, comment: { insert: "Insertar", edit: "Editar", delete: "Elimiar", showOne: "Mostrar/Ocular", showAll: "Mostrar/Ocular Todo" }, screenshot: { screenshotTipNoSelection: "Selecciona el alcance de la captura de pantalla", screenshotTipTitle: "¡Advertencia!", screenshotTipHasMerge: "Esta operación no se puede realizar en celdas combinadas", screenshotTipHasMulti: "Esta operación no se puede realizar en varios rangos de selección", screenshotTipSuccess: "Exitoso", screenshotImageName: "Captura de pantalla", downLoadClose: "Cerrar", downLoadCopy: "Copiar al portapapeles", downLoadBtn: "Descargar", browserNotTip: "no es compatible con el navegador IE.", rightclickTip: 'Haz clic con el botón derecho en la imagen y selecciona "copiar"', successTip: 'Con éxito (si falla el pegado, haz clic con el botón derecho en la imagen para "copiar imagen")' }, splitText: { splitDelimiters: "Delimitadores", splitOther: "Otros", splitContinueSymbol: "Los separadores consecutivos se tratan como uno solo", splitDataPreview: "Previsualizar", splitTextTitle: "Partir texto", splitConfirmToExe: "Ya hay datos aquí, ¿quieres reemplazarlos?", tipNoMulti: "No se puede realizar esta operación en varias áreas de selección, selecciona una única área y vuelve a intentarlo", tipNoMultiColumn: "Solo se puede convertir una columna de datos a la vez. El área seleccionado puede tener varias filas, pero no varias columnas. Vuelve a intentarlo después de seleccionar un solo rango de columnas" }, imageText: { imageSetting: "Configuración de imagen", close: "Cerrar", conventional: "Convencional", moveCell1: "Mover y cambiar el tamaño de las celdas", moveCell2: "Mover y no cambiar el tamaño de la celda", moveCell3: "No mover ni cambiar el tamaño de la celda", fixedPos: "Posición fija", border: "Borde", width: "Ancho", radius: "Radio", style: "Estilo", solid: "Sólido", dashed: "Discontinua", dotted: "Punteado", double: "Doble", color: "Color" }, punctuation: { tab: "Tabulación", semicolon: "punto y coma", comma: "coma", space: "espacio" }, findAndReplace: { find: "Encontrar", replace: "Reemplazar", goto: "Ir a", location: "Ubicación", formula: "Fórmula", date: "Fecha", number: "Número", string: "Texto", error: "Error", condition: "Condición", rowSpan: "Intervalo de filas", columnSpan: "Intervalo de columnas", locationExample: "Ubicación", lessTwoRowTip: "Selecciona al menos dos filas", lessTwoColumnTip: "Selecciona al menos dos columnas", findTextbox: "Encontrar Contenido", replaceTextbox: "Reemplazar Contenido", regexTextbox: "Expresión Regular", wholeTextbox: "Palabra entera", distinguishTextbox: "Distingue mayúsculas y minúsculas", allReplaceBtn: "Reemplazar Todo", replaceBtn: "Reemplazar", allFindBtn: "Encontrar Todo", findBtn: "Encontrar siguiente", noFindTip: "No se encontró el contenido", modeTip: "Esta operación no está disponible en este modo", searchTargetSheet: "Hoja", searchTargetCell: "Celda", searchTargetValue: "Valor", searchInputTip: "Introduce el contenido de la búsqueda", noReplceTip: "No hay nada que reemplazar", noMatchTip: "No se encontraron coincidencias", successTip: "${xlength} elementos encontrados", locationConstant: "Constante", locationFormula: "Fórmula", locationDate: "Fecha", locationDigital: "Número", locationString: "Texto", locationBool: "Lógicos", locationError: "Error", locationNull: "Nulo", locationCondition: "Formato condicional", locationRowSpan: "Intervalo fila", locationColumnSpan: "Intervalo columna", locationTiplessTwoRow: "Selecciona al menos dos filas", locationTiplessTwoColumn: "Selecciona al menos dos columnas", locationTipNotFindCell: "Celda no encontrada" }, sheetconfig: { delete: "Eliminar", copy: "Copiar", rename: "Renombrar", changeColor: "Cambiar color", hide: "Ocultar", unhide: "Mostrar", moveLeft: "Mover izquierda", moveRight: "Mover derecja", resetColor: "Reiniciar color", cancelText: "Cancelar", chooseText: "Confirmar color", tipNameRepeat: "¡El nombre de la página de la pestaña no se puede repetir! Revísalo", noMoreSheet: "El libro de trabajo contiene al menos una hoja de trabajo visual. Para eliminar la hoja de trabajo seleccionada, inserta una nueva hoja de trabajo o muestra una hoja de trabajo oculta", confirmDelete: "¿Estás seguro de eliminar", redoDelete: "Se puede deshacer con Ctrl+Z", noHide: "No se puede ocultar, al menos conserva una etiqueta de hoja", chartEditNoOpt: "¡Esta operación no está permitida en el modo de edición de gráficos!", sheetNameSpecCharError: "El nombre no puede contener:[ ] : ? * / ' \"", sheetNamecannotIsEmptyError: "El nombre de la hoja no puede estar vacío" }, conditionformat: { conditionformat_greaterThan: "Conditionformat-GreaterThan", conditionformat_greaterThan_title: "Dar formato a celdas mayores que", conditionformat_lessThan: "Conditionformat-LessThan", conditionformat_lessThan_title: "Dar formato a celdas más pequeñas que", conditionformat_betweenness: "Conditionformat-Betweenness", conditionformat_betweenness_title: "Dar formato a celdas con valores entre", conditionformat_equal: "Conditionformat-Equal", conditionformat_equal_title: "Dar formato a celdas iguales a", conditionformat_textContains: "Conditionformat-TextContains", conditionformat_textContains_title: "Dar formato a las celdas que contienen el siguiente texto", conditionformat_occurrenceDate: "Conditionformat-OccurrenceDate", conditionformat_occurrenceDate_title: "Dar formato a celdas que contienen las siguientes fechas", conditionformat_duplicateValue: "Conditionformat-DuplicateValue", conditionformat_duplicateValue_title: "Dar formato a celdas que contienen los siguientes tipos de valores", conditionformat_top10: "Conditionformat-Top10", conditionformat_top10_percent: "Conditionformat-Top10%", conditionformat_top10_title: "Formatea las celdas con el valor más alto", conditionformat_last10: "Conditionformat-Last10", conditionformat_last10_percent: "Conditionformat-Last10%", conditionformat_last10_title: "Formatea las celdas con el valor más pequeño", conditionformat_AboveAverage: "Conditionformat-AboveAverage", conditionformat_AboveAverage_title: "Dar formato a celdas por encima del promedio", conditionformat_SubAverage: "Conditionformat-SubAverage", conditionformat_SubAverage_title: "Dar formato a celdas por debajo del promedio", rule: "Regla", newRule: "Nueva regla", editRule: "Editar regla", deleteRule: "Eliminar regla", deleteCellRule: "Eliminar regla de celda", deleteSheetRule: "Eliminar regla de hoja", manageRules: "Reglas administración", showRules: "Muestra sus reglas de formato", highlightCellRules: "Resaltar reglas de celda", itemSelectionRules: "Reglas de selección de elementos", conditionformatManageRules: "Administrador de reglas de formato condicional", format: "Formatear", setFormat: "Establecer formato", setAs: "Establecer como", setAsByArea: "Para el área seleccionada, establecer", applyRange: "Aplicar rango", selectRange: "Seleccionar rango de aplicación", selectRange_percent: "Porcentaje del rango seleccionado", selectRange_average: "Valor promedio del rango seleccionado", selectRange_value: "Valor en el rango seleccionado", pleaseSelectRange: "Selecciona el rango de aplicación", selectDataRange: "Seleccionar rango de datos", selectCell: "seleccionar celda", pleaseSelectCell: "Selecciona una celda", pleaseSelectADate: "Selecciona una fecha", pleaseEnterInteger: "Introduzca un número entero entre 1 y 1000", onlySingleCell: "Solo se puede hacer referencia a una sola celda", conditionValueCanOnly: "El valor de la condición solo puede ser un número o una sola celda", ruleTypeItem1: "Aplicar formato a todas las celdas según sus valores respectivos", ruleTypeItem2: "Solo formatear celdas que contengan", ruleTypeItem2_title: "Solo para celdas que cumplan las siguientes condiciones", ruleTypeItem3: "Aplicar formato solo a los números superiores o inferiores", ruleTypeItem3_title: "Es el valor en la siguiente clasificación", ruleTypeItem4: "Aplicar formato solo a los valores superiores o inferiores al promedio", ruleTypeItem4_title: "Es un valor que cumple las siguientes condiciones", ruleTypeItem5: "Aplicar formato solo a valores únicos o repetidos", ruleTypeItem6: "Use fórmulas para determinar qué celdas formatear", formula: "fórmula", textColor: "Color Texto", cellColor: "Color Celda", confirm: "Confirma", confirmColor: "Confirma color", cancel: "Cancela", close: "Cierra", clearColorSelect: "Limpiar selección de color", sheet: "Hoja", currentSheet: "Hoja actual", dataBar: "Barra de datos", dataBarColor: "Color barra de datos", gradientDataBar_1: "Barra de datos de degradado azul-blanco", gradientDataBar_2: "Barra de datos de degradado verde-blanco", gradientDataBar_3: "Barra de datos de degradado rojo-blanco", gradientDataBar_4: "Rayas de degradado de color naranja-blanco", gradientDataBar_5: "Rayas de degradado azul claro-blancas", gradientDataBar_6: "Barra de datos de degradado púrpura-blanco", solidColorDataBar_1: "Barra de datos azul", solidColorDataBar_2: "Barra de datos verde", solidColorDataBar_3: "Barra de datos roja", solidColorDataBar_4: "Barra de datos naranja", solidColorDataBar_5: "Barra de datos azul claro", solidColorDataBar_6: "Barra de datos púrpura", colorGradation: "Degradado de color", colorGradation_1: "Gradación de color verde-amarillo-rojo", colorGradation_2: "Gradación de color rojo-amarillo-verde", colorGradation_3: "Gradación de color verde-blanco-rojo", colorGradation_4: "Gradación de color rojo-blanco-verde", colorGradation_5: "Gradación de color azul-blanco-rojo", colorGradation_6: "Gradación de color rojo-blanco-azul", colorGradation_7: "Gradación de color blanco-rojo", colorGradation_8: "Gradación de color rojo-blanco", colorGradation_9: "Gradación de color verde-blanco", colorGradation_10: "Gradación de color blanco-verde", colorGradation_11: "Gradación de color verde-amarillo", colorGradation_12: "Gradación de color amarillo-verde", icons: "iconos", pleaseSelectIcon: "Haz clic para seleccionar un grupo de iconos:", cellValue: "Valor de celda", specificText: "Texto específico", occurrence: "Fecha", greaterThan: "Mayor que", lessThan: "Menor que", between: "Entre", equal: "Igual", in: "En", between2: "", contain: "Contiene", textContains: "Texto contiene", duplicateValue: "Valor duplicado", uniqueValue: "Valor Unico", top: "Mejor", top10: "10 mejores", top10_percent: "10% mejores", last: "Ultimo", last10: "Ultimos 10", last10_percent: "Ultimos 10%", oneself: "", above: "Encima", aboveAverage: "Encima media", below: "Debajo", belowAverage: "Debajo media", all: "Todos", yesterday: "Año a fecha", today: "Hoy", tomorrow: "Mañana", lastWeek: "Ultima semana", thisWeek: "Esta semana", lastMonth: "Ultimo mes", thisMonth: "Este mes", lastYear: "Ultimo año", thisYear: "Este año", last7days: "Ultimos 7 días", last30days: "Ultimos 30 días", next7days: "Siguientes 7 días", next30days: "Siguientes 30 días", next60days: "Siguientes 60 días", chooseRuleType: "Elige el tipo de regla", editRuleDescription: "Editar descripción de regla", newFormatRule: "Nueva regla de formato", editFormatRule: "Editar regla de formato", formatStyle: "Estilo", fillType: "Rellenar", color: "Color", twocolor: "Dos colores", tricolor: "Tricolor", multicolor: "Multi color", grayColor: "Color gris", gradient: "Gradiente", solid: "Sólido", maxValue: "Valor máximo", medianValue: "Valor mediano", minValue: "Valor mínimo", direction: "Dirección", threeWayArrow: "Flecha de tres direcciones", fourWayArrow: "Flecha de cuatro direcciones", fiveWayArrow: "Flecha de cinco direcciones", threeTriangles: "Tres triángulos", shape: "Forma", threeColorTrafficLight: "Semáforo de tres colores", fourColorTrafficLight: "Semáforo de cuatro colores", threeSigns: "Tres signos", greenRedBlackGradient: "Gradiente verde-rojo-negro", rimless: "Sin aros", bordered: "Bordeado", mark: "Marcar", threeSymbols: "Tres símbolos", tricolorFlag: "Bandera tricolor", circled: "Rodeado", noCircle: "Sin círculo", grade: "Grado", grade4: "4 Grado", grade5: "5 Grado", threeStars: "3 Estrellas", fiveQuadrantDiagram: "Diagrama de cinco cuadrantes", fiveBoxes: "5 Cajas" }, dataVerification: { cellRange: "Rango celdas", selectCellRange: "Haz clic para seleccionar un rango de celdas", selectCellRange2: "Selecciona un rango de celdas", verificationCondition: "Condición de verificación", dropdown: "lista desplegable", checkbox: "Casilla de verificación", number: "Número", number_integer: "Número entero", number_decimal: "Número decimal", text_content: "Contenido texto", text_length: "Longitud texto", date: "Fecha", validity: "Eficacia", placeholder1: "Introduce las opciones, separadas por comas, como 1,2,3,4,5", placeholder2: "Introduce contenido", placeholder3: "Valor numérico, como 10", placeholder4: "Introduce el texto especificado", placeholder5: "Introduce el mensaje que se muestra cuando se selecciona la celda", selected: "Seleccionado", notSelected: "No seleccionado", between: "Entre", notBetween: "No entre", equal: "Iqual", notEqualTo: "No iqual a", moreThanThe: "Más que el", lessThan: "Menos que", greaterOrEqualTo: "Mayor o igual a", lessThanOrEqualTo: "Menor o igual a", include: "Incluir", exclude: "Excluir", earlierThan: "Antes de", noEarlierThan: "No antes de", laterThan: "Después de", noLaterThan: "No después de", identificationNumber: "Número de identificación", phoneNumber: "Número de teléfono", remote: "Opción de adquisición remota automática", prohibitInput: "Prohibir la entrada cuando los datos de entrada no son válidos", hintShow: "Mostrar mensaje cuando se selecciona la celda", deleteVerification: "Eliminar verificación", tooltipInfo1: "La opción de la lista desplegable no puede estar vacía", tooltipInfo2: "El contenido de la casilla de verificación no puede estar vacío", tooltipInfo3: "El valor ingresado no es un tipo numérico", tooltipInfo4: "El segundo valor no puede ser menor que el primero", tooltipInfo5: "El contenido del texto no puede estar vacío", tooltipInfo6: "El valor ingresado no es una fecha", tooltipInfo7: "La segunda fecha no puede ser menor que la primera" }, formula: { sum: "Suma", average: "Media", count: "Contar", max: "Máx", min: "Mín", ifGenerate: "Generador de fórmula SI", find: "Aprender más", tipNotBelongToIf: "¡Esta función de celda no pertenece a la fórmula SI!", tipSelectCell: "Selecciona la celda para insertar la función", ifGenCompareValueTitle: "Valor de comparación", ifGenSelectCellTitle: "Haz click para seleccionar una celda", ifGenRangeTitle: "Rango", ifGenRangeTo: "a", ifGenRangeEvaluate: "Evaluar rango", ifGenSelectRangeTitle: "Haz click para seleccionar rango", ifGenCutWay: "Forma particionado", ifGenCutSame: "Mismo valor de particionado", ifGenCutNpiece: "Particionar por N", ifGenCutCustom: "Personalizado", ifGenCutConfirm: "Confirma", ifGenTipSelectCell: "Selecciona celdas", ifGenTipSelectCellPlace: "Por favor selecciona celdas", ifGenTipSelectRange: "Selecciona rango", ifGenTipSelectRangePlace: "Por favor selecciona rango", ifGenTipNotNullValue: "El valor de comparación no puede ser vacío!", ifGenTipLableTitile: "Etiqueta", ifGenTipRangeNotforNull: "El rango no puede quedar vacío!", ifGenTipCutValueNotforNull: "El valor de partición no puede ser vacío!", ifGenTipNotGenCondition: "No hay condiciones disponibles para la generación!" }, formulaMore: { valueTitle: "Valor", tipSelectDataRange: "Selecciona rango de datos", tipDataRangeTile: "Rango de datos", findFunctionTitle: "Función de búsqueda", tipInputFunctionName: "Nombre o breve descripción de la función", Array: "Vector", Database: "Base de datos", Date: "Fecha", Engineering: "Ingeniería", Filter: "Filtro", Financial: "Financiero", luckysheet: "Luckysheet", other: "Otro", Logical: "Lógica", Lookup: "Búsqueda", Math: "Matemático", Operator: "Operadores", Parser: "Compilador", Statistical: "Estadístico", Text: "Texto", dataMining: "Minería de datos", selectFunctionTitle: "Selecciona una función", calculationResult: "Resultado", tipSuccessText: "Exito", tipParamErrorText: "Parámetro erróneo", helpClose: "Cerrar", helpCollapse: "Recoger", helpExample: "Ejemplo", helpAbstract: "Resumen", execfunctionError: "Error en la fórmula", execfunctionSelfError: "La fórmula no puede hacer referencia a su propia celda", execfunctionSelfErrorResult: "La fórmula no puede hacer referencia a su propia celda, lo que dará lugar a resultados de cálculo inexactos", allowRepeatText: "Repetir", allowOptionText: "Opción", selectCategory: "O selecciona una categoría" }, drag: { noMerge: "No se puede realizar esta operación en celdas combinadas", afectarPivot: "¡Este cambio no se puede realizar en la celda seleccionada porque afectará a la tabla dinámica!", noMulti: "No se puede realizar esta operación en varias áreas de selección, selecciona una sola área", noPaste: "No se puede pegar este contenido aquí, selecciona una celda en el área de pegado e intenta pegar nuevamente", noPartMerge: "No se puede realizar esta operación en celdas parcialmente fusionadas", inputCorrect: "Introduce el valor correcto", notLessOne: "El número de filas y columnas no puede ser inferior a 1", offsetColumnLessZero: "¡La columna de desplazamiento no puede ser negativa!", pasteMustKeybordAlert: "在表格中进行复制粘贴: Ctrl + C 进行复制, Ctrl + V 进行粘贴, Ctrl + X 进行剪切", pasteMustKeybordAlertHTMLTitle: "在表格中进行复制粘贴", pasteMustKeybordAlertHTML: "<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;进行复制<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;进行粘贴<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;进行剪切" }, pivotTable: { title: "Tabla Dinámica", closePannel: "Cerrar", editRange: "Rango", tipPivotFieldSelected: "Selecciona los campos", tipClearSelectedField: "Limpiar todos los campos", btnClearSelectedField: "Limpiar", btnFilter: "Filtrar", titleRow: "Fila", titleColumn: "Columna", titleValue: "Valor", tipShowColumn: "Los campos de estadísticas se muestran como columnas", tipShowRow: "Los campos de estadísticas se muestran como filas", titleSelectionDataRange: "Selecciona rango", titleDataRange: "Rango de datos", valueSum: "SUMA", valueStatisticsSUM: "Suma", valueStatisticsCOUNT: "Contar", valueStatisticsCOUNTA: "Contar A", valueStatisticsCOUNTUNIQUE: "Contar Distintos", valueStatisticsAVERAGE: "Media", valueStatisticsMAX: "Máx", valueStatisticsMIN: "Mín", valueStatisticsMEDIAN: "Mediana", valueStatisticsPRODUCT: "Producto", valueStatisticsSTDEV: "Desviación Estándar", valueStatisticsSTDEVP: "Stdevp", valueStatisticslet: "Varianza", valueStatisticsVARP: "VarP", errorNotAllowEdit: "¡Esta operación está prohibida en el modo sin edición!", errorNotAllowMulti: "No se puede realizar esta operación en varias áreas de selección, selecciona un solo rango y vuelve a intentarlo", errorSelectRange: "Seleccione el rango de la nueva tabla dinámica", errorIsDamage: "¡Los datos de origen de esta tabla dinámica están dañados!", errorNotAllowPivotData: "¡No se puede seleccionar la tabla dinámica como datos de origen!", errorSelectionRange: "¡La selección falló, rango de entrada incorrecto!", errorIncreaseRange: "¡Por favor, expande el rango seleccionado!", titleAddColumn: "Añadir columna a la tabla dinámica", titleMoveColumn: "Muever la columna a la celda en blanco de abajo", titleClearColumnFilter: "Quitar el filtro de esta columna", titleFilterColumn: "Filtro", titleSort: "Ordenar", titleNoSort: "No Ordenar", titleSortAsc: "ASC", titleSortDesc: "DESC", titleSortBy: "Ordenar por", titleShowSum: "Mostrar total", titleStasticTrue: "Sí", titleStasticFalse: "No" }, dropCell: { copyCell: "Copiar", sequence: "Secuencia", onlyFormat: "Solo formato", noFormat: "Sin formato", day: "Día", workDay: "Día Laborable", month: "Mes", year: "Año", chineseNumber: "Números Chinos" }, imageCtrl: { borderTile: "Color de borde de imagen", borderCur: "Color" }, protection: { protectiontTitle: "Protección", enterPassword: "Introduce una contraseña (opcional)", enterHintTitle: "Preguntar cuando la edición está prohibida (opcional)", enterHint: "La celda o el gráfico que estás intentando cambiar se encuentra en una hoja de trabajo protegida. Si quieres cambiarlo, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contraseña", swichProtectionTip: "Protege la hoja y el contenido de las celdas bloqueadas", authorityTitle: "Permitir a los usuarios de esta hoja:", selectLockedCells: "Selecciona celdas bloqueadas", selectunLockedCells: "Selecciona celdas desbloqueadas", formatCells: "Formatear celdas", formatColumns: "Formatear columnas", formatRows: "Formatear filas", insertColumns: "Insertar columnas", insertRows: "Insertar filas", insertHyperlinks: "Insertar enlaces", deleteColumns: "Eliminar columnas", deleteRows: "Eliminar filas", sort: "Ordenar", filter: "Filtrar", usePivotTablereports: "Usar informes de tabla dinámica", editObjects: "Editar objetos", editScenarios: "Editar escenarios", allowRangeTitle: "Permitir a los usuarios del rango:", allowRangeAdd: "Nuevo...", allowRangeAddTitle: "Título", allowRangeAddSqrf: "Referencia", selectCellRange: "Haz clic para seleccionar un rango de celdas", selectCellRangeHolder: "Rango de celdas", allowRangeAddTitlePassword: "Contraseña", allowRangeAddTitleHint: "Pregunta", allowRangeAddTitleHintTitle: "Preguntar cuando hay una contraseña (opcional)", allowRangeAddtitleDefault: "Nombre del rango de entrada", rangeItemDblclick: "Haz doble clic para editar", rangeItemHasPassword: "Tiene contraseña", rangeItemErrorTitleNull: "El título es nulo", rangeItemErrorRangeNull: "La referencia es nula", rangeItemErrorRange: "La reference tiene un error", validationTitle: "Validación de contraseña", validationTips: "Hay que ingresar una contraseña para desbloquear la protección de la hoja de trabajo", validationInputHint: "Introduce una contraseña", checkPasswordNullalert: "Contraseña requerida!", checkPasswordWrongalert: "¡Contraseña incorrecta. Por favor, prueba de nuevo!", checkPasswordSucceedalert: "Desbloqueo conseguido!", defaultRangeHintText: "La celda está protegida con contraseña.", defaultSheetHintText: "La celda o el gráfico están en una hoja de trabajo protegida. Para realizar cambios, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contraseña" }, cellFormat: { cellFormatTitle: "Formatear celdas", protection: "Protección", locked: "Bloqueado", hidden: "Escondido", protectionTips: "Para bloquear celdas u ocultar fórmulas, protege la hoja de trabajo. En la barra de herramientas, haz clic en el botón Proteger hoja", tipsPart: "Comprobado parcial", tipsAll: "Todo seleccionado", selectionIsNullAlert: "Se requiere una selección!", sheetDataIsNullAlert: "error, no hay datos!" }, print: { normalBtn: "Normal", layoutBtn: "Disposición de página", pageBtn: "Previsualización de saltos de página", menuItemPrint: "Imprimir (Ctrl+P)", menuItemAreas: "Imprimir áreas", menuItemRows: "Imprimir títulos de filas", menuItemColumns: "Imprimir títulos de columnas" }, edit: { typing: "mecanografía" }, websocket: { success: "Éxito de la conexión de WebSocket", refresh: "Se produjo un error en la conexión de WebSocket, ¡actualice la página!", wait: "Se produjo un error en la conexión de WebSocket, ¡tenga paciencia!", close: "Conexión WebSocket cerrada", contact: "Ocurrió un error de comunicación con el servidor, actualice la página y vuelva a intentarlo; de lo contrario, comuníquese con el administrador.", support: "El navegador actual no es compatible con WebSocket" } }, zh_tw: { functionlist: [{ n: "SUMIF", t: 0, d: "對範圍中符合指定條件的值求和。", a: "對範圍中符合指定條件的值求和。", m: [2, 3], p: [{ name: "範圍", detail: "要根據條件進行檢測的範圍。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "條件", detail: "要應用於範圍的模式或測試條件。\n\n如果範圍包含的是要檢測的文字,則條件必須為字串。條件可以包含萬用字元,包括用於匹配單個字元的?或用於匹配零個或連續多個字元的*。要匹配問號星號本身,請在該字元前面加上波浪號(~)首碼(即~?和~*)。字串條件必須用引號括起來。函數會檢查範圍中的每個儲存格與條件是否相等或匹配(如果使用了萬用字元)。\n\n如果範圍包含的是要檢測的數位,則條件可以是字串也可以是數位。如果給定的條件是一個數位,則檢查範圍中的每個儲存格是否等於條件。另外,條件也可能是包含數位的字串(也將對其進行相等檢測),或者帶有以下首碼的數位:=(檢查是否相等)、>(檢查範圍儲存格的值是否大於條件值)或<(檢查範圍儲存格的值是否小於條件值)", example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "求和範圍", detail: "要求和的範圍(如果與範圍不同)。", example: "B1:B10", require: "o", repeat: "n", type: "range" }] }, { n: "TAN", t: 0, d: "返回已知角度的正切值。", a: "返回已知角度的正切值。", m: [1, 1], p: [{ name: "角度", detail: "要求其正切值的角度,以弧度表示。", example: "45*PI()/180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TANH", t: 0, d: "返回給定實數的雙曲正切值。", a: "返回給定實數的雙曲正切值。", m: [1, 1], p: [{ name: "值", detail: "要計算其雙曲正切值的實數。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CEILING", t: 0, d: "將數值向上取整為最接近的指定因數的倍數。", a: "將數值向上取整為最接近的指定因數的倍數。", m: [2, 2], p: [{ name: "值", detail: "要向上舍入的數值。", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "因數", detail: "要將值舍入到此數的整數倍。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN", t: 0, d: "返回數值的反正切值,以弧度表示。", a: "返回數值的反正切值", m: [1, 1], p: [{ name: "值", detail: "要計算其反正切值的數值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ASINH", t: 0, d: "返回數值的反雙曲正弦值。", a: "返回數值的反雙曲正弦值。", m: [1, 1], p: [{ name: "值", detail: "要計算其反雙曲正弦值的數值。", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ABS", t: 0, d: "返回數值的絕對值。", a: "返回數值的絕對值。", m: [1, 1], p: [{ name: "value", detail: "要返回其絕對值的數。", example: "-2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOS", t: 0, d: "返回數值的反余弦值,以弧度表示。", a: "返回數值的反余弦值", m: [1, 1], p: [{ name: "值", detail: "要計算其反余弦值的數值。必須介於-1和1之間,包括兩端值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ACOSH", t: 0, d: "返回數值的反雙曲余弦值。", a: "返回數值的反雙曲余弦值。", m: [1, 1], p: [{ name: "值", detail: "要計算其反雙曲余弦值的數值。必須大於等於1。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTINOMIAL", t: 0, d: "返回參數和的階乘除以各參數階乘的乘積後得到的值。", a: "返回參數和的階乘除以各參數階乘的乘積後得到的值。", m: [1, 255], p: [{ name: "值1", detail: "用於計算的第一項數值或範圍。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "用於計算的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "ATANH", t: 0, d: "返回數值的反雙曲正切值。", a: "返回數值的反雙曲正切值。", m: [1, 1], p: [{ name: "值", detail: "要計算其反雙曲正切值的數值。必須介於-1和1之間(不包括-1和1)。", example: "0.9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ATAN2", t: 0, d: "以弧度為組織返回x軸與從原點(0,0)到指定座標點(`x`,`y`)之間連線的夾角。", a: "以弧度為組織返回x軸與從原點(0,0)到指定座標點(`x`,`y`)之間連線的夾角。", m: [2, 2], p: [{ name: "x", detail: "要計算其與x軸夾角大小的線段的終點x座標。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "y", detail: "要計算其與x軸夾角大小的線段的終點y座標。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTBLANK", t: 1, d: "返回給定範圍內的空儲存格數。", a: "返回給定範圍內的空儲存格數。", m: [1, 1], p: [{ name: "範圍", detail: "要統計空白儲存格數量的範圍。", example: "A2:C100", require: "m", repeat: "n", type: "range" }] }, { n: "COSH", t: 0, d: "返回給定實數的雙曲余弦值。", a: "返回給定實數的雙曲余弦值。", m: [1, 1], p: [{ name: "值", detail: "要計算其雙曲余弦值的實數值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "INT", t: 0, d: "數值向下取整為小於或等於該數的最接近的整數。", a: "數值向下取整為小於或等於該數的最接近的整數。", m: [1, 1], p: [{ name: "值", detail: "要向下取整為最接近的整數的數值。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISEVEN", t: 0, d: "檢查所提供的數值是否為偶數。", a: "檢查所提供的數值是否為偶數。", m: [1, 1], p: [{ name: "值", detail: "要驗證其是否為偶數的數值。\n\n如果值為偶數或指向包含偶數的儲存格的引用,ISEVEN將返回TRUE,否則返回FALSE。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ISODD", t: 0, d: "檢查所提供的數值是否為奇數。", a: "檢查所提供的數值是否為奇數。", m: [1, 1], p: [{ name: "值", detail: "要驗證其是否為奇數的數值。\n\n如果值為奇數或指向包含奇數的儲存格,ISODD將返回TRUE,否則返回FALSE。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LCM", t: 0, d: "返回一個或多個整數的最小公倍數。", a: "返回一個或多個整數的最小公倍數。", m: [1, 255], p: [{ name: "值1", detail: "要在求最小公倍數數的計算中檢查其因數的第一項數值或範圍。", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可選] - 在求最小公倍數時要考慮其因數的其他數值或範圍。", example: "3", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LN", t: 0, d: "返回數值以e(歐拉數)為底的對數。", a: "返回數值以e(歐拉數)為底的對數。", m: [1, 1], p: [{ name: "值", detail: "要以e為底數計算其對數的值。\n\n值必須為正數。", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOG", t: 0, d: "根據指定底數返回數位的對數。", a: "根據指定底數返回數位的對數。", m: [1, 2], p: [{ name: "值", detail: "想要計算其對數的正實數。", example: "128", require: "m", repeat: "n", type: "rangenumber" }, { name: "底數", detail: "[可選] - 對數的底數。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "LOG10", t: 0, d: "返回數值以10為底的對數。", a: "返回數值以10為底的對數。", m: [1, 1], p: [{ name: "值", detail: "要計算其以10為底的對數的數值。\n\n值必須為正值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MOD", t: 0, d: "返回兩數相除的餘數,結果的符號與除數相同。", a: "返回兩數相除的餘數。", m: [2, 2], p: [{ name: "被除數", detail: "要將其相除以得到餘數的數值。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "除數", detail: "用於除其他數的數值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MROUND", t: 0, d: "將數值取整為另一整數最接近的整數倍。", a: "將數值取整為另一整數最接近的整數倍。", m: [2, 2], p: [{ name: "值", detail: "要取整為另一整數最接近的整數倍的數值。", example: "21", require: "m", repeat: "n", type: "rangenumber" }, { name: "因數", detail: "值將取此因數的整數倍。", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ODD", t: 0, d: "將數值向上取整為最接近的奇整數。", a: "將數值向上取整為最接近的奇整數。", m: [1, 1], p: [{ name: "值", detail: "要向上取整的數值,取整值為大於此值的最接近的奇數。\n\n如果值為負數,則將其取整為絕對值大於該值的相鄰負奇數", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMSQ", t: 0, d: "返回一組數值和/或儲存格的平方總和。", a: "返回一組數值和/或儲存格的平方總和。", m: [1, 255], p: [{ name: "值1", detail: "要將其平方相加的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 要將其平方與值1的平方相加的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMBIN", t: 0, d: "給定集合中的對象總數和要選擇的對象數量,返回共有多少種不同選擇管道。", a: "給定集合中的對象總數和要選擇的對象數量", m: [2, 2], p: [{ name: "n", detail: "要從中進行選擇的對象集合的大小。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "要選擇的對象數量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUM", t: 0, d: "返回一組數值和/或儲存格的總和。", a: "返回一組數值和/或儲存格的總和。", m: [1, 255], p: [{ name: "值1", detail: "要相加的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可選] - 要相加的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SUBTOTAL", t: 0, d: "使用指定的匯總函數,返回一系列縱向儲存格的分類匯總。", a: "使用指定的匯總函數", m: [2, 256], p: [{ name: "函數程式碼", detail: "用於計算分類匯總的函數。\n\n1代表AVERAGE\n\n2代表COUNT\n\n3代表COUNTA\n\n4代表MAX\n\n5代表MIN\n\n6代表PRODUCT\n\n7代表STDEV\n\n8代表STDEVP\n\n9代表SUM\n\n10代表VAR\n\n11代表VARP\n\n通過在這些2位程式碼前附加10(對於1位程式碼)或1(對於2位程式碼),可以將隱藏值忽略。例如,102代表忽略隱藏儲存格的COUNT,而110則代表忽略隱藏值的VAR。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "範圍1", detail: "要計算分類匯總的第一個範圍。", example: "A2:A5", require: "m", repeat: "n", type: "range" }, { name: "範圍2", detail: "[可選] - 要計算分類匯總的其他範圍。", example: "B2:B8", require: "o", repeat: "y", type: "range" }] }, { n: "ASIN", t: 0, d: "返回數值的反正弦值,以弧度表示。", a: "返回數值的反正弦值", m: [1, 1], p: [{ name: "值", detail: "要計算其反正弦值的數值。必須介於-1和1之間,包括兩端值。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUNTIF", t: 1, d: "返回範圍內滿足某個條件的儲存格的數量。", a: "返回範圍內滿足某個條件的儲存格的數量。", m: [2, 2], p: [{ name: "範圍", detail: "要根據條件進行檢測的範圍。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "條件", detail: "要應用於範圍的模式或測試條件。\n\n如果範圍包含的是要檢測的文字,則條件必須為字串。條件可以包含萬用字元,包括用於匹配單個字元的?或用於匹配零個或連續多個字元的*。要匹配問號星號本身,請在該字元前面加上波浪號(~)首碼(即~?和~*)。字串條件必須用引號括起來。函數會檢查範圍中的每個儲存格與條件是否相等或匹配(如果使用了萬用字元)。\n\n如果範圍包含的是要檢測的數位,則條件可以是字串也可以是數位。如果給定的條件是一個數位,則檢查範圍中的每個儲存格是否等於條件。另外,條件也可能是包含數位的字串(也將對其進行相等檢測),或者帶有以下首碼的數位:=、>、>=、<或<=,這些條件將分別用於檢查範圍中的儲存格是否等於、大於、大於等於、小於、小於等於條件值。", example: '">20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "RADIANS", t: 0, d: "將以度表示的角度值轉換為弧度。", a: "將以度表示的角度值轉換為弧度。", m: [1, 1], p: [{ name: "角度", detail: "要從度轉換為弧度的角度。", example: "180", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RAND", t: 0, d: "返回一個介於0和1之間(包括0但不包括1)的亂數。", a: "返回一個介於0和1之間(包括0但不包括1)的亂數。", m: [0, 0], p: [] }, { n: "COUNTUNIQUE", t: 0, d: "計算一列指定值和範圍中不重複數值的個數。", a: "計算一列指定值和範圍中不重複數值的個數。", m: [1, 255], p: [{ name: "值1", detail: "要檢查其是否唯一的第一個值或範圍。", example: "A1:C100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可選] - 要檢查是否唯一的其他值或範圍。", example: "1", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DEGREES", t: 0, d: "將以弧度表示的角度值轉換為度。", a: "將以弧度表示的角度值轉換為度。", m: [1, 1], p: [{ name: "角度", detail: "要從弧度轉換為度的角度。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ERFC", t: 9, d: "返回數值的互補高斯誤差函數。", a: "返回數值的互補高斯誤差函數。", m: [1, 1], p: [{ name: "z", detail: "要為其計算互補高斯誤差函數的數值。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EVEN", t: 0, d: "將數值向上取整為最接近的偶整數。", a: "將數值向上取整為最接近的偶整數。", m: [1, 1], p: [{ name: "值", detail: "要向上取整的數值,取整值為大於此值的最接近的偶數。\n\n如果值為負數,則將其取整為絕對值大於該值的相鄰負偶數。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EXP", t: 0, d: "返回歐拉數e~2.718)的指定次幂。", a: "返回歐拉數e~2.718)的指定次幂。", m: [1, 1], p: [{ name: "指數", detail: "指定e的自乘幂次值。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACT", t: 0, d: "返回數值的階乘。", a: "返回數值的階乘。", m: [1, 1], p: [{ name: "值", detail: "要計算並返回其階乘的數位或對數位(所在儲存格)的引用。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FACTDOUBLE", t: 0, d: '返回數值的"雙階乘"。', a: '返回數值的"雙階乘"。', m: [1, 1], p: [{ name: "值", detail: "要計算並返回其雙階乘的數位或對數位(所在儲存格)的引用。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PI", t: 0, d: "返回帶有14位小數的PI值。", a: "返回帶有14位小數的PI值。", m: [0, 0], p: [] }, { n: "FLOOR", t: 0, d: "將數值向下取整為指定因數的最接近的整數倍。", a: "將數值向下取整為指定因數的最接近的整數倍。", m: [2, 2], p: [{ name: "值", detail: "要向下舍入為因數的最接近整數倍的數值。", example: "23.25", require: "m", repeat: "n", type: "rangenumber" }, { name: "因數", detail: "要將值舍入到此數的整數倍。\n\n因數不得為0。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GCD", t: 0, d: "返回一個或多個整數的最大公約數。", a: "返回一個或多個整數的最大公約數。", m: [1, 255], p: [{ name: "值1", detail: "要在查找最大公約數的計算中檢查其因數的第一項數值或範圍。", example: "A2:A5", require: "m", repeat: "n", type: "rangeall" }, { name: "值2", detail: "[可選] - 在求最大公約數時要考慮其因數的其他數值或範圍。", example: "96", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANDBETWEEN", t: 0, d: "返回介於兩個整數之間(包括這兩個整數)的亂數。", a: "返回介於兩個整數之間(包括這兩個整數)的亂數。", m: [2, 2], p: [{ name: "下界", detail: "隨機值範圍的下界。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "上界", detail: "隨機值範圍的上界。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUND", t: 0, d: "將數位四捨五入到指定的位數。", a: "將數位四捨五入到指定的位數。", m: [2, 2], p: [{ name: "值", detail: "要四捨五入的數位。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位數", detail: "要進行四捨五入運算的位數。\n\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDDOWN", t: 0, d: "朝著零的方向將數位進行向下舍入。", a: "朝著零的方向將數位進行向下舍入。", m: [2, 2], p: [{ name: "值", detail: "需要向下舍入的任意實數。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位數", detail: "要通過舍入達到的小數位數。\n\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ROUNDUP", t: 0, d: "朝著遠離0(零)的方向將數位進行向上舍入。", a: "朝著遠離0(零)的方向將數位進行向上舍入。", m: [2, 2], p: [{ name: "值", detail: "要將其舍入為位數位數位的值,始終向上舍入。", example: "99.44", require: "m", repeat: "n", type: "rangenumber" }, { name: "位數", detail: "要通過舍入達到的小數位數。\n\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SERIESSUM", t: 0, d: "給定參數x、n、m和a,返回幂級數的和a1xn + a2xn+m+…+ aixn+i-1m,其中i為範圍a中的項數。", a: "給定參數x、n、m和a", m: [4, 4], p: [{ name: "x", detail: "幂級數的輸入值。隨相應的近似類型而變,有可能為角度、指數或其他一些值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "在幂級數中x的初始自乘幂次。", example: "0", require: "m", repeat: "n", type: "rangenumber" }, { name: "m", detail: "x的幂次中的附加增量。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "a", detail: "包含幂級數係數的數組或範圍。", example: "{FACT(0)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIGN", t: 0, d: "給定輸入數值,如果為負返回-1;如果為正返回1;如果為零則返回0。", a: "給定輸入數值", m: [1, 1], p: [{ name: "值", detail: "要返回其符號的數值。", example: "-42", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SIN", t: 0, d: "給定角度(以弧度表示),返回其正弦值。", a: "給定角度(以弧度表示)", m: [1, 1], p: [{ name: "角度", detail: "要返回其正弦值的角度,以弧度表示。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SINH", t: 0, d: "返回給定實數的雙曲正弦值。", a: "返回給定實數的雙曲正弦值。", m: [1, 1], p: [{ name: "值", detail: "要計算其雙曲正弦值的實數值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRT", t: 0, d: "返回一個正數的正平方根。", a: "返回一個正數的正平方根。", m: [1, 1], p: [{ name: "值", detail: "要計算其正平方根的數值。\n\n值必須為正數;如果為負,SQRT將返回#NUM!錯誤。", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SQRTPI", t: 0, d: "返回PI與給定正數乘積的正平方根。", a: "返回PI與給定正數乘積的正平方根。", m: [1, 1], p: [{ name: "值", detail: "要將其與PI相乘並返回該乘積的平方根的數值\n\n值必須為正數;如果為負數,SQRTPI將返回#NUM!錯誤。", example: "9", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GAMMALN", t: 1, d: "返回指定伽瑪函數的以e(歐拉數)為底的對數。", a: "返回指定伽瑪函數的以e(歐拉數)為底的對數。", m: [1, 1], p: [{ name: "值", detail: "伽瑪函數的輸入值。返回的將是伽瑪(值)的自然對數。\n\n值必須為正數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COS", t: 0, d: "返回給定角度的余弦值(角度以弧度表示)。", a: "返回給定角度的余弦值(角度以弧度表示)。", m: [1, 1], p: [{ name: "角度", detail: "要取其余弦值的角度,以弧度表示。", example: "PI()", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRUNC", t: 0, d: "除指定有效位之外的部分,取數據的指定有效位。", a: "除指定有效位之外的部分", m: [1, 2], p: [{ name: "值", detail: "要截取的數據。", example: "3.141592654", require: "m", repeat: "n", type: "rangenumber" }, { name: "位數", detail: '[可選 - 預設值為0] - 小數點右側要保留的有效位數。\n\n如果位數大於值中的有效位數,則將"值"原樣返回。\n\n位數可以取負值,在這種情況下會將小數點左側指定位數的值更改為零。小數點右側的所有位數都會被捨棄。如果值的所有位都被更改為零,則TRUNC會返回0。', example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUOTIENT", t: 0, d: "返回以一個數除以另一個數所得的結果,不包含餘數。", a: "返回以一個數除以另一個數所得的結果", m: [2, 2], p: [{ name: "被除數", detail: "要被除的數值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "除數", detail: "用於除其他數的數值。\n\n除數不得為0", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POWER", t: 0, d: "返回數值的指定次幂。", a: "返回數值的指定次幂。", m: [2, 2], p: [{ name: "底數", detail: "要計算其指數次幂的數值。\n\n如果底數為負,則指數必須為整數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "指數", detail: "指定底數的自乘幂次值。", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMIFS", t: 0, d: "根據多項條件返回範圍之和。", a: "根據多項條件返回範圍之和。", m: [3, 257], p: [{ name: "求和範圍", detail: "要對其求和的範圍。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "條件範圍1", detail: "要在哪個範圍內檢查條件1。", example: " B1:B10", require: "m", repeat: "n", type: "range" }, { name: "條件1", detail: "要應用於條件範圍1的模式或測試條件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "條件範圍2,條件2…", detail: "[ 可選 ] - 要檢查的其他範圍和條件。", example: " C1:C10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTIFS", t: 1, d: "根據多項條件返回範圍中的儲存格數量。", a: "根據多項條件返回範圍中的儲存格數量。", m: [2, 256], p: [{ name: "條件範圍1", detail: "要在哪個範圍內檢查條件1。", example: "A1:A10", require: "m", repeat: "n", type: "range" }, { name: "條件1", detail: "要應用於條件範圍1的模式或測試條件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "條件範圍2,條件2…", detail: "[ 可選 ] - 要檢查的其他範圍和條件,可重複。", example: " B1:B10", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PRODUCT", t: 0, d: "返回將一組數相乘所得的結果。", a: "返回將一組數相乘所得的結果。", m: [1, 255], p: [{ name: "乘數1", detail: "用於計算乘積的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "乘數2 ... 乘數30", detail: "[可選] - 要相乘的其他數值", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HARMEAN", t: 1, d: "計算數據集的調和平均值。", a: "計算數據集的調和平均值。", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "HYPGEOMDIST", t: 1, d: "返回超幾何分佈。如果已知樣本量、總體成功次數和總體大小,則 HYPGEOM.DIST 返回樣本取得已知成功次數的概率。", a: "返回超幾何分佈。", m: [5, 5], p: [{ name: "Sample_s", detail: "樣本中成功的次數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "Number_sample", detail: "樣本量。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "Population_s", detail: "總體中成功的次數。", example: "20", require: "m", repeat: "n", type: "rangenumber" }, { name: "Number_pop", detail: "總體大小。", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函數形式的邏輯值。\n\n如果cumulative為TRUE(),則HYPGEOM.DIST返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "INTERCEPT", t: 1, d: "計算數據集的線性回歸方程直線與 Y 軸的相交點(x=0)的y值。", a: "計算數據集的線性回歸方程直線與 Y 軸的相交點(x=0)的y值。", m: [2, 2], p: [{ name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "KURT", t: 1, d: "計算數據集的峭度,該名額訓示數據集(分佈)的形態,尤其是該形態的陡峭程度。", a: "計算數據集的峭度", m: [1, 255], p: [{ name: "值1", detail: "數據集中的第一個值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LARGE", t: 1, d: "返回數據集中第 n 個最大元素,n 由用戶指定。", a: "返回數據集中第 n 個最大元素", m: [2, 2], p: [{ name: "數據", detail: "包含相關數據集的數組或範圍。", example: "A2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "n", detail: "要返回的元素的排行位置(從大到小順序)。\n\n例如,將n設為4將使LARGE返回數據中排名第4的最大元素。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STDEVA", t: 1, d: "基於樣本計算標準差,將文字取值為0。", a: "基於樣本計算標準差", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2,…", detail: "[可選] - 樣本中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STDEVP", t: 1, d: "基於樣本總體計算標準差。", a: "基於樣本總體計算標準差。", m: [1, 255], p: [{ name: "值1", detail: "數據集中的第一個值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "GEOMEAN", t: 1, d: "計算數據集的幾何平均值。", a: "計算數據集的幾何平均值。", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "RANK_EQ", t: 1, d: "返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回其中的最高排名。", a: "返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回其中的最高排名。", m: [2, 3], p: [{ name: "number", detail: "要確定其排名的值。", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "ref", detail: "包含相關數據集的數組或範圍。", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "order", detail: '[可選-默認為按降序(FALSE())] - 要按昇冪還是按降序考慮"data"中的值。', example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANK_AVG", t: 1, d: "返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回這些項排名的平均值。", a: "返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回這些項排名的平均值。", m: [2, 3], p: [{ name: "number", detail: "要確定其排名的值。", example: "A10", require: "m", repeat: "n", type: "rangenumber" }, { name: "ref", detail: "包含相關數據集的數組或範圍。", example: "A1:A100", require: "m", repeat: "n", type: "range" }, { name: "order", detail: '[可選-默認為按降序(FALSE())] - 要按昇冪還是按降序考慮"data"中的值。', example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PERCENTRANK_EXC", t: 1, d: "以百分數形式返回指定值在給定數據集中的百分比排名(介於0和1之間,不包括兩端值)。", a: "以百分數形式返回指定值在給定數據集中的百分比排名(介於0和1之間,不包括兩端值)。", m: [2, 3], p: [{ name: "data", detail: "包含相關數據集的數組或範圍。", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "x", detail: "要確定其百分比排位的值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significance", detail: "[可選-預設值為3] - 要在計算中使用的有效位數。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTRANK_INC", t: 1, d: "以百分比形式返回指定值在給定數據集中的百分比排名(介於0和1之間,包括兩端值)。", a: "以百分比形式返回指定值在給定數據集中的百分比排名(介於0和1之間,包括兩端值)。", m: [2, 3], p: [{ name: "data", detail: "包含相關數據集的數組或範圍。", example: "A1:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "x", detail: "要確定其百分比排位的值。", example: " A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "significance", detail: "[可選-預設值為3] - 要在計算中使用的有效位數。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FORECAST", t: 1, d: "基於數據集的線性回歸,計算指定 x 的預期 y 值。", a: "基於數據集的線性回歸", m: [3, 3], p: [{ name: "x", detail: "x軸上用於預測的值。", example: "A1", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHERINV", t: 1, d: "返回指定數值的 Fisher 逆變換。", a: "返回指定數值的 Fisher 逆變換。", m: [1, 1], p: [{ name: "y", detail: "要計算其Fisher逆變換的數值。", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FISHER", t: 1, d: "返回指定數值的 Fisher 變換。", a: "返回指定數值的 Fisher 變換。", m: [1, 1], p: [{ name: "x", detail: "要計算其Fisher變換的數值。", example: "0.962", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MODE_SNGL", t: 1, d: "返回數據集中出現次數最多的值。", a: "返回數據集中出現次數最多的值。", m: [1, 255], p: [{ name: "值1", detail: "計算模式時要檢查的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 在計算模式時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "WEIBULL_DIST", t: 1, d: "給定形狀和尺度,返回韋伯分佈函數(或韋伯累積分佈函數)的值。", a: "給定形狀和尺度", m: [4, 4], p: [{ name: "x", detail: "WEIBULL 分佈函數的輸入值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "alpha", detail: "Weibull 分佈函數的形狀參數。\n\n alpha值必須大於0。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "beta", detail: "Weibull 分佈函數的尺度參數。\n\n beta值必須大於0。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "TRUE()表示使用累積分佈函數,FALSE()則表示使用概率密度函數。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "COUNT", t: 1, d: "返回數據集中數值的個數。", a: "返回數據集中數值的個數。", m: [1, 255], p: [{ name: "值1", detail: "計數時要檢查的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 在計數時要檢查的其他值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COUNTA", t: 1, d: "返回數據集中值的數量。", a: "返回數據集中值的數量。", m: [1, 255], p: [{ name: "值1", detail: "計數時要檢查的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 在計數時要檢查的其他值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVEDEV", t: 1, d: "計算數據與數據集平均值之間的偏差大小的平均值。", a: "計算數據與數據集平均值之間的偏差大小的平均值。", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 樣本中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "AVERAGE", t: 1, d: "返回數據集的算術平均值,對文字忽略不計。", a: "返回數據集的算術平均值", m: [1, 255], p: [{ name: "值1", detail: "計算平均值時用到的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 在計算平均值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "AVERAGEA", t: 1, d: "返回數據集的算術平均值。", a: "返回數據集的算術平均值。", m: [1, 255], p: [{ name: "值1", detail: "計算平均值時用到的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 在計算平均值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BINOM_DIST", t: 1, d: "返回一元二項式分佈的概率。", a: "返回一元二項式分佈的概率。", m: [4, 4], p: [{ name: "number_s", detail: "試驗的成功次數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "trials", detail: "獨立檢驗的次數。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一給定檢驗的成功概率。", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "是否使用二項式累積分佈。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BINOM_INV", t: 1, d: "計算累積二項式分佈大於或等於指定條件的最小值。", a: "計算累積二項式分佈大於或等於指定條件的最小值。", m: [3, 3], p: [{ name: "trials", detail: "貝努利試驗次數。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一次給定檢驗的成功概率。", example: "0.005", require: "m", repeat: "n", type: "rangenumber" }, { name: "alpha", detail: "期望的臨界概率。", example: "0.8", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONFIDENCE_NORM", t: 1, d: "計算常态分配的置信區間的一半寬度。", a: "計算常态分配的置信區間的一半寬度。", m: [3, 3], p: [{ name: "alpha", detail: "用來計算置信水准的顯著性水准。\n\n置信水准等於100*1 - alpha%,亦即,如果 alpha 為0.05,則置信水准為 95%。", example: "0.05", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "數據區域的總體標準差。", example: "1.6", require: "m", repeat: "n", type: "rangenumber" }, { name: "size", detail: "樣本總量的大小。", example: "250", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CORREL", t: 1, d: "計算給定數據集的皮爾遜積矩相關係數 r。", a: "計算給定數據集的皮爾遜積矩相關係數 r。", m: [2, 2], p: [{ name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_P", t: 1, d: "計算數據集的總體協方差。", a: "計算數據集的總體協方差。", m: [2, 2], p: [{ name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COVARIANCE_S", t: 1, d: "計算數據集的樣本協方差。", a: "計算數據集的樣本協方差。", m: [2, 2], p: [{ name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DEVSQ", t: 1, d: "基於樣本計算其偏差的平方和。", a: "基於樣本計算其偏差的平方和。", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 樣本中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "EXPON_DIST", t: 1, d: "返回帶有指定 Lambda 和指定值的指數分佈函數的值。", a: "返回帶有指定 Lambda 和指定值的指數分佈函數的值。", m: [3, 3], p: [{ name: "x", detail: "指數分佈函數的輸入值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "lambda", detail: "用於指定指數分佈函數的 lambda 值。", example: "0.5", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "是否使用指數累積分佈。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIF", t: 1, d: "根據條件返回範圍的平均值。", a: "根據條件返回範圍的平均值。", m: [2, 3], p: [{ name: "criteria_range", detail: "要對其檢查 criterion 的範圍。", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion", detail: '要應用於criteria_range的模式或測試條件。\n\n等於:"文字" 或 1 或 "=文字" 或 "=1"\n\n大於:">1"\n\n大於等於:">=1"\n\n小於:"<1"\n\n小於等於:"<=1"\n\n不等於:"<>1"或"<>文字"', example: '">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "average_range", detail: "[可選] - 要計算平均值的範圍。如果未提供此參數,則改用criteria_range來計算平均值。", example: "B1:B10", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AVERAGEIFS", t: 1, d: "根據多項條件返回範圍的平均值。", a: "根據多項條件返回範圍的平均值。", m: [2, 255], p: [{ name: "average_range", detail: "要計算平均值的範圍。", example: "A1:A10", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range1", detail: "要對其檢查 criterion1 的範圍。", example: " B1:B10", require: "m", repeat: "n", type: "rangeall" }, { name: "criterion1", detail: "要應用於criteria_range1的模式或測試條件。", example: ' ">20"', require: "m", repeat: "n", type: "rangeall" }, { name: "criteria_range2, criterion2, ...", detail: "[可選] - 要檢查的其他範圍和條件。", example: " C1:C10", require: "m", repeat: "n", type: "rangeall" }] }, { n: "PERMUT", t: 1, d: "返回可從數位對象中選擇的給定數目對象的排列數。", a: "返回可從數位對象中選擇的給定數目對象的排列數。", m: [2, 2], p: [{ name: "number", detail: "表示對象個數的整數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_chosen", detail: "表示每個排列中對象個數的整數。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRIMMEAN", t: 1, d: "在排除數據集高低兩端的部分數據之後計算所得的平均值。", a: "在排除數據集高低兩端的部分數據之後計算所得的平均值。", m: [2, 2], p: [{ name: "數據", detail: "包含相關數據集的數組或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "排除比例", detail: "要從數據集的極值部分排除的數據占數據集的比例。\n\n排除比例必須大於等於0且小於1。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_EXC", t: 1, d: "返回數組的 K 百分點值,K 介於0到1之間,不含0與1。", a: "返回數組的 K 百分點值,K 介於0到1之間,不含0與1。", m: [2, 2], p: [{ name: "array", detail: "定義相對位置的數組或數據區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "0 到 1 之間的百分點值,不包含 0 和 1。", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PERCENTILE_INC", t: 1, d: "返回數組的 K 百分點值,K 介於 0 到 1 之間,包含 0 與 1。", a: "返回數組的 K 百分點值,K 介於 0 到 1 之間,包含 0 與 1。", m: [2, 2], p: [{ name: "array", detail: "定義相對位置的數組或數據區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "k", detail: "0 到 1 之間的百分點值,包含 0 和 1。", example: "0.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PEARSON", t: 1, d: "回皮爾生(Pearson)乘積矩相關係數 r。", a: "回皮爾生(Pearson)乘積矩相關係數 r。", m: [2, 2], p: [{ name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_INV", t: 1, d: "返回標準正態累積分佈函數的反函數值。該分佈的平均值為0,標準差為1。", a: "返回標準正態累積分佈函數的反函數值。該分佈的平均值為0,標準差為1。", m: [1, 1], p: [{ name: "probability", detail: "對應於常态分配的概率。", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_S_DIST", t: 1, d: "返回標準常态分配函數(該分佈的平均值為0,標準差為1)。", a: "返回標準常态分配函數(該分佈的平均值為0,標準差為1)。", m: [2, 2], p: [{ name: "z", detail: "需要計算其分佈的數值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函數形式的邏輯值。\n\n如果為TRUE(),則返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NORM_INV", t: 1, d: "返回指定平均值和標準差的正態累積分佈函數的反函數值。", a: "返回指定平均值和標準差的正態累積分佈函數的反函數值。", m: [3, 3], p: [{ name: "probability", detail: "對應於常态分配的概率。", example: "0.75", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分佈的算術平均值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分佈的標準差。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NORM_DIST", t: 1, d: "返回指定平均值和標準差的常态分配函數。", a: "返回指定平均值和標準差的常态分配函數。", m: [4, 4], p: [{ name: "x", detail: "需要計算其分佈的數值。", example: "2.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分佈的算術平均值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分佈的標準差。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函數形式的邏輯值。\n\n如果為TRUE(),則返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NEGBINOM_DIST", t: 1, d: "返回負二項式分佈。", a: "返回負二項式分佈。", m: [4, 4], p: [{ name: "number_f", detail: "要類比的失敗次數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "number_s", detail: "要類比的成功次數。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "probability_s", detail: "任一次給定檢驗的成功概率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函數形式的邏輯值。\n\n如果為TRUE(),則返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINA", t: 1, d: "返回數據集中的最小數值。", a: "返回數據集中的最小數值。", m: [1, 255], p: [{ name: "值1", detail: "計算最小值時所用的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可選] - 在計算最小值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MIN", t: 1, d: "返回數值數據集中的最小值。", a: "返回數值數據集中的最小值。", m: [1, 255], p: [{ name: "值1", detail: "計算最小值時所用的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可選] - 在計算最小值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MEDIAN", t: 1, d: "返回數值數據集中的中值。", a: "返回數值數據集中的中值。", m: [1, 255], p: [{ name: "值1", detail: "計算中值時所用的第一個數值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可選] - 在計算中值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAXA", t: 1, d: "返回數據集中的最大數值。", a: "返回數據集中的最大數值。", m: [1, 255], p: [{ name: "值1", detail: "計算最大值時所用的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 在計算最大值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "MAX", t: 1, d: "返回數值數據集中的最大值。", a: "返回數值數據集中的最大值。", m: [1, 255], p: [{ name: "值1", detail: "計算最大值時所用的第一個值或範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2", detail: "[可選] - 在計算最大值時要考慮的其他數值或範圍。", example: "B2:B100", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "LOGNORM_INV", t: 1, d: "返回 x 的對數累積分佈函數的反函數值。", a: "返回 x 的對數累積分佈函數的反函數值。", m: [3, 3], p: [{ name: "probability", detail: "與對數分佈相關的概率,介於0與1之間(不含0與1)。", example: "0.4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "ln(x) 的平均值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "ln(x) 的標準差,正數。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LOGNORM_DIST", t: 1, d: "返回 x 的對數分佈函數。", a: "返回 x 的對數分佈函數。", m: [4, 4], p: [{ name: "x", detail: "用來計算函數的值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "ln(x) 的平均值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "ln(x) 的標準差,正數。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "决定函數形式的邏輯值。\n\n如果為TRUE(),則返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "Z_TEST", t: 1, d: "返回 z 檢驗的單尾 P 值。", a: "返回 z 檢驗的單尾 P 值。", m: [2, 3], p: [{ name: "array", detail: "用來檢驗 x 的數組或數據區域。", example: "A2:A100", require: "m", repeat: "n", type: "range" }, { name: "x", detail: "要測試的值。", example: "B2", require: "m", repeat: "n", type: "rangenumber" }, { name: "sigma", detail: "[可選] - 總體(已知)標準差。如果省略,則使用樣本標準差。", example: "3", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PROB", t: 1, d: "返回區域中的數值落在指定區間內的概率。", a: "返回區域中的數值落在指定區間內的概率。", m: [3, 4], p: [{ name: "x_range", detail: "具有各自相應概率值的 x 數值區域。", example: "A3:A6", require: "m", repeat: "n", type: "range" }, { name: "prob_range", detail: "與 x_range 中的值相關聯的一組概率值。", example: "2", require: "m", repeat: "n", type: "range" }, { name: "lower_limit", detail: "要計算其概率的數值下界。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "upper_limit", detail: "[可選 - 預設值為下界] - 要計算其概率的可選數值上界。\n\n如果省略上界,PROB則計算隨機選取相應值的次數恰好等於下界的概率。", example: "4", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_EXC", t: 1, d: "基於 0 到 1 之間(不包括 0 和 1)的百分點值返回數據集的四分位數。", a: "基於 0 到 1 之間(不包括 0 和 1)的百分點值返回數據集的四分位數。", m: [2, 2], p: [{ name: "array", detail: "要求得四分位數值的數組或數字型儲存格區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quart", detail: "要返回第幾個四分位值。\n\n1返回數據中最靠近第一個四分位值的值(25%標記)。\n\n2返回數據中最接近中值的值(50%標記)。\n\n3返回數據中最接近第三個四分位值的值(75%標記)。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "QUARTILE_INC", t: 1, d: "根據 0 到 1 之間的百分點值(包含 0 和 1)返回數據集的四分位數。", a: "根據 0 到 1 之間的百分點值(包含 0 和 1)返回數據集的四分位數。", m: [2, 2], p: [{ name: "array", detail: "要求得四分位數值的數組或數字型儲存格區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "quart", detail: "要返回第幾個四分位值。\n\n0返回數據中的最小值(0%標記)。\n\n1返回數據中最靠近第一個四分位值的值(25%標記)。\n\n2返回數據中最接近中值的值(50%標記)。\n\n3返回數據中最接近第三個四分位值的值(75%標記)。\n\n4返回數據中的最大值(100%標記)。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "POISSON_DIST", t: 1, d: "返回泊松分布。", a: "返回泊松分布。", m: [3, 3], p: [{ name: "x", detail: "事件數。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "期望值。非負數", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "一 邏輯值,確定所返回的概率分佈的形式。\n\n如果為TRUE(),則返回發生的隨機事件數在零(含零)和x(含x)之間的累積泊松概率;\n\n如果為FALSE(),則返回發生的事件數正好是x的泊松概率密度函數。", example: "FALSE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "RSQ", t: 1, d: "返回皮爾生(Pearson)乘積矩相關係數r的平方。", a: "返回皮爾生(Pearson)乘積矩相關係數r的平方。", m: [2, 2], p: [{ name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST", t: 1, d: "返回學生的左尾 t 分佈。", a: "返回學生的左尾 t 分佈。", m: [3, 3], p: [{ name: "x", detail: "T-分佈函數的輸入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度數值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "决定函數形式的邏輯值。\n\n如果cumulative為TRUE(),則HYPGEOM.DIST返回累積分佈函數;\n\n如果為FALSE(),則返回概率密度函數。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "T_DIST_2T", t: 1, d: "返回學生的雙尾 t 分佈。", a: "返回學生的雙尾 t 分佈。", m: [2, 2], p: [{ name: "x", detail: "T-分佈函數的輸入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度數值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_DIST_RT", t: 1, d: "返回學生的右尾 t 分佈。", a: "返回學生的右尾 t 分佈。", m: [2, 2], p: [{ name: "x", detail: "T-分佈函數的輸入。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom", detail: "自由度數值。", example: "30", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV", t: 1, d: "返回學生的 t 分佈的左尾反函數。", a: "返回學生的 t 分佈的左尾反函數。", m: [2, 2], p: [{ name: "probability", detail: "與學生的 t 分佈相關的概率。\n\n必須大於 0 且小於 1。", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "deg_freedom", detail: "自由度數值。\n\n如果所提供的參數不是整數,將截取其整數部分。\n\n必須大於等於1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_INV_2T", t: 1, d: "返回學生 t 分佈的雙尾反函數。", a: "返回學生 t 分佈的雙尾反函數。", m: [2, 2], p: [{ name: "probability", detail: "與學生的t分佈相關的概率。\n\n必須大於 0 且小於 1。", example: "0.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "deg_freedom", detail: "自由度數值。\n\n如果所提供的參數不是整數,將截取其整數部分。\n\n必須大於等於1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "T_TEST", t: 1, d: "返回與t-檢驗相關的概率。用於判斷兩個樣本是否可能是出自平均值相同的兩個樣本總體。", a: "返回與t-檢驗相關的概率。用於判斷兩個樣本是否可能是出自平均值相同的兩個樣本總體。", m: [4, 4], p: [{ name: "array1", detail: "將用於t檢驗的第一個數據樣本或第一組儲存格。", example: "A1:A4", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "將用於t檢驗的第二個數據樣本或第二組儲存格。", example: "B1:B4", require: "m", repeat: "n", type: "rangenumber" }, { name: "tails", detail: "指定分佈的尾數。\n\n如果為 1:使用單尾分佈。\n\n如果為 2:使用雙尾分佈。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定t檢驗的類型。\n\n如果為 1:執行配對檢驗。\n\n如果為 2:執行雙樣本等方差(同方差)檢驗。\n\n如果為 3:執行雙樣本不等方差(异方差)檢驗。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "F_DIST", t: 1, d: "給定輸入值 x,計算兩個數據集的左尾 F 概率分佈(差异程度)。此分佈也稱為 Fisher-Snedecor 分佈或Snedecor F 分佈。", a: "給定輸入值 x", m: [4, 4], p: [{ name: "x", detail: "用來計算函數的值。", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "分子自由度。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "分母自由度。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "cumulative", detail: "用於確定函數形式的邏輯值。預設值為 FALSE。\n\n如果為 TRUE():F.DIST將返回累積分佈函數值。\n\n如果為FALSE():F.DIST將返回概率密度函數值。", example: "TRUE()", require: "m", repeat: "n", type: "rangeall" }] }, { n: "F_DIST_RT", t: 1, d: "給定輸入x,計算兩個數據集的右尾F概率分佈(差异程度)。此分佈也稱為Fisher-Snedecor分佈或Snedecor F分佈。", a: "給定輸入 x", m: [3, 3], p: [{ name: "x", detail: "用來計算函數的值。", example: "15.35", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom1", detail: "分子自由度。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "degrees_freedom2", detail: "分母自由度。", example: "6", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "VAR_P", t: 1, d: "基於樣本總體計算方差。", a: "基於樣本總體計算方差。", m: [1, 255], p: [{ name: "值1", detail: "數據集中的第一個值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, …", detail: "[可選] - 數據集中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VAR_S", t: 1, d: "基於樣本計算方差。", a: "基於樣本計算方差。", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, …", detail: "[可選] - 樣本中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARA", t: 1, d: "基于样本计算方差,将文本取值为0。", a: "基于样本计算方差", m: [1, 255], p: [{ name: "value1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2, ...", detail: "[可選] - 樣本中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "VARPA", t: 1, d: "基於樣本總體計算方差,將文字取值為0。", a: "基於樣本總體計算方差", m: [1, 255], p: [{ name: "值1", detail: "樣本中的第一項值或範圍。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他數值或範圍。", example: "2", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "STEYX", t: 1, d: "返回通過線性回歸法預測每個 x 的 y 值時所產生的標準誤差。", a: "返回通過線性回歸法預測每個 x 的 y 值時所產生的標準誤差。", m: [2, 2], p: [{ name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "STANDARDIZE", t: 1, d: "給定分佈的平均值和標準差,計算一個隨機變數正態化的相應值。", a: "給定分佈的平均值和標準差,計算一個隨機變數正態化的相應值。", m: [3, 3], p: [{ name: "x", detail: "要正態化的隨機變數值。", example: "96", require: "m", repeat: "n", type: "rangenumber" }, { name: "mean", detail: "分佈的平均值。", example: "80", require: "m", repeat: "n", type: "rangenumber" }, { name: "standard_dev", detail: "分佈的標準差。", example: "6.7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SMALL", t: 1, d: "返回數據集中的第k個最小值。", a: "返回數據集中的第k個最小值。", m: [2, 2], p: [{ name: "array", detail: "需要找到第k個最小值的數組或數值數據區域。", example: "A2:B100", require: "m", repeat: "n", type: "range" }, { name: "k", detail: "要返回的數據在數組或數據區域裏的位置(從小到大)。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SLOPE", t: 1, d: "計算通過數據集的線性回歸得到的直線的斜率。", a: "計算通過數據集的線性回歸得到的直線的斜率。", m: [2, 2], p: [{ name: "數據_y", detail: "代表因變數數據數組或矩陣的範圍。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "數據_x", detail: "代表引數數據數組或矩陣的範圍。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SKEW", t: 1, d: "返回分佈的偏斜度。偏斜度表明分佈相對於平均值的不對稱程度。正偏斜度表明分佈的不對稱尾部趨向於更多正值。負偏斜度表明分佈的不對稱尾部趨向於更多負值。", a: "返回分佈的偏斜度。", m: [1, 255], p: [{ name: "值1", detail: "數據集中的第一個值或範圍。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "SKEW_P", t: 1, d: "返回基於樣本總體的分佈不對稱度:表明分佈相對於平均值的不對稱程度。", a: "返回基於樣本總體的分佈不對稱度:表明分佈相對於平均值的不對稱程度。", m: [1, 255], p: [{ name: "值1", detail: "數據集中的第一個值或範圍。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "值2, ...", detail: "[可選] - 數據集中包含的其他值或範圍。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "VLOOKUP", t: 2, d: "縱向查找。在範圍的第一列中自上而下蒐索某個鍵值,並返回所找到的行中指定儲存格的值。", a: "縱向查找。在範圍的第一列中自上而下蒐索某個鍵值", m: [3, 4], p: [{ name: "蒐索鍵值", detail: '要蒐索的值,如 42、"Cats" 或 I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "範圍", detail: "要進行蒐索的範圍。VLOOKUP 將在該範圍的第一列中蒐索蒐索鍵值中指定的鍵值。", example: "A2:B26", require: "m", repeat: "n", type: "rangeall" }, { name: "索引", detail: "要返回的值的列索引,範圍中的第一列編號為1。\n\n如果索引不是介於1和範圍中的列數之間,將返回#VALUE!。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "已排序", detail: "[預設值為TRUE()] -訓示要蒐索的列(指定範圍的第一列)是否已排序。大多數情况下,建議設為FALSE()。\n\n建議將已排序設為FALSE。如果設為FALSE,將返回完全匹配項。如果存在多個匹配值,將返回找到的第一個值對應的儲存格的內容,如果找不到匹配值,則返回#N/A。\n\n如果將已排序設為TRUE或省略,將返回(小於或等於蒐索鍵值的)最接近的匹配項。如果蒐索的列中所有的值均大於蒐索鍵值,則返回#N/A。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "HLOOKUP", t: 2, d: "橫向查找。在範圍的第一行中蒐索某個鍵值,並返回所找到的列中指定儲存格的值。", a: "橫向查找。在範圍的第一行中蒐索某個鍵值", m: [3, 4], p: [{ name: "蒐索鍵值", detail: '要蒐索的值。例如,42、"Cats"或I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "範圍", detail: "要進行蒐索的範圍。將在該範圍的第一行中蒐索在蒐索鍵值中指定的鍵值。", example: "A2:Z6", require: "m", repeat: "n", type: "rangeall" }, { name: "索引", detail: "要返回的值的行索引,範圍中的第一行編號為1。\n\n如果索引不是介於1和範圍中的行數之間,將返回#VALUE!。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "已排序", detail: "[可選 - 預設值為TRUE()] - 訓示要蒐索的行(指定範圍的第一行)是否已排序。\n\n如果將已排序設為TRUE或省略,將返回最接近的匹配值(小於或等於蒐索鍵值)。如果在蒐索的行中所有的值均大於蒐索鍵值,則返回#N/A。\n\n如果將已排序設為TRUE或將其省略,而範圍的首行並非處於已排序狀態,則返回值可能會是錯誤的。\n\n如果將已排序設為FALSE,則僅返回完全匹配。如果存在多個匹配值,將返回與找到的第一個值對應的儲存格的內容,如果找不到匹配值則返回#N/A。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOOKUP", t: 2, d: "在行或列中查找相應鍵,並將相應儲存格的值返回到與蒐索行或列所在位置相同的結果範圍中。", a: "在行或列中查找相應鍵", m: [2, 3], p: [{ name: "蒐索鍵值", detail: '要在行或列中蒐索的值。例如,42、"Cats" 或 I24。', example: "10003", require: "m", repeat: "n", type: "rangeall" }, { name: "搜索範圍 | 搜索結果數組", detail: "使用LOOKUP的一種方法是給定單行或單列形式的搜索範圍進行蒐索查找,這種管道要用到另一個參數結果範圍。另一種管道是將這兩個參數合併為一個搜索結果數組,其中第一行或第一列用於蒐索,並將返回值放在該數組的最後一行或最後一列中。", example: "A1:A100", require: "m", repeat: "n", type: "rangeall" }, { name: "結果範圍", detail: "[ 可選 ] - 用於存放返回結果的範圍。返回值對應於在搜索範圍中找到蒐索鍵值的位置。此範圍必須僅為單行或單列,而如果您使用的是搜索結果數組管道,則不應提供此參數。", example: "B1:B100", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ADDRESS", t: 2, d: "返回字串形式的儲存格引用。", a: "返回字串形式的儲存格引用。", m: [2, 5], p: [{ name: "row_num", detail: "一個數值,指定要在儲存格引用中使用的行號。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "column_num", detail: "一個數值,指定要在儲存格引用中使用的列號(而非名稱)。A列的編號為1。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "abs_num", detail: "[可選 - 預設值為1] - 一個數值,指定要返回的參考類型。\n\n1表示行列均採用絕對值(例如$A$1);\n\n2表示採用絕對行號,相對列標(例如A$1);\n\n3表示採用相對行號,絕對列標(例如$A1);\n\n4表示行列均採用相對值(例如A1)。", example: "4", require: "o", repeat: "n", type: "rangenumber" }, { name: "A1", detail: "[可選 - 預設值為TRUE()] - 一個布林值,訓示採用A1標記形式(TRUE)還是R1C1標記形式(FALSE)。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }, { name: "sheet_text", detail: "[可選 - 默認預設] - 用於指定地址所指向的工作表名稱。", example: '"Sheet2"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "INDIRECT", t: 2, d: "返回以字串指定的儲存格引用。", a: "返回以字串指定的儲存格引用。", m: [1, 2], p: [{ name: "ref_text", detail: "以帶引號的字串形式提供的儲存格引用。", example: '"Sheet2!"&B10', require: "m", repeat: "n", type: "rangeall" }, { name: "A1", detail: "[可選 - 預設值為TRUE()] - 一個布林值,訓示採用A1標記形式(TRUE)還是R1C1標記形式(FALSE)。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROW", t: 2, d: "返回指定儲存格的行號", a: "返回指定儲存格的行號", m: [0, 1], p: [{ name: "reference", detail: "[可選 - 默認為此公式所在的儲存格] - 要返回其行號的儲存格。\n\n如果儲存格引用指向的範圍其寬度大於一個儲存格,而此公式不是用作數組公式的,這時會僅返回儲存格引用中首行的編號值。", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ROWS", t: 2, d: "返回指定數組或範圍中的行數。", a: "返回指定數組或範圍中的行數。", m: [1, 1], p: [{ name: "array", detail: "要返回其行數的範圍。", example: "A9:A62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COLUMN", t: 2, d: "按照 `A=1` 的規則返回指定儲存格的列號。", a: "按照 `A=1` 的規則返回指定儲存格的列號。", m: [0, 1], p: [{ name: "reference", detail: "[可選 - 默認為包含此公式的儲存格] - 要返回其列號的儲存格。A列對應的編號為1。\n\n如果儲存格引用是寬度超過一個儲存格的範圍,而此公式不是作為數組公式來使用的,囙此將返回儲存格引用中的第一列的位置。", example: "A9", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNS", t: 2, d: "返回指定數組或範圍中的列數。", a: "返回指定數組或範圍中的列數。", m: [1, 1], p: [{ name: "array", detail: "要返回其列數的範圍。", example: "A9:W62", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "OFFSET", t: 2, d: "給定某範圍的起始儲存格引用以及該範圍涵蓋的行列數量,返回該範圍的引用。", a: "給定某範圍的起始儲存格引用以及該範圍涵蓋的行列數量,返回該範圍的引用。", m: [3, 5], p: [{ name: "reference", detail: "用於計算行列偏移量的起點。", example: "A2", require: "m", repeat: "n", type: "range" }, { name: "rows", detail: "要偏移的行數。\n\n行偏移量必須是整數,但也可以是負數。如果提供的參數帶有小數,小數部分將被截去。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "要偏移的列數。\n\n列偏移量必須是整數,但也可以是負數。如果提供的參數帶有小數,小數部分將被截去。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "height", detail: "[可選] - 要從偏移目標開始返回的範圍的高度。", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "width", detail: "[可選] - 要從偏移目標開始返回的範圍的寬度。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MATCH", t: 2, d: "在儲存格中蒐索指定項,然後返回該項在儲存格區域中的相對位置。", a: "在儲存格中蒐索指定項,然後返回該項在儲存格區域中的相對位置。", m: [2, 3], p: [{ name: "lookup_value", detail: "要在 lookup_array 中匹配的值。", example: '"Sunday"', require: "m", repeat: "n", type: "rangeall" }, { name: "lookup_array", detail: "要蒐索的儲存格區域。\n\n如果所用的範圍的高度和寬度均大於1,MATCH將返回#N/A!。", example: "A2:A9", require: "m", repeat: "n", type: "range" }, { name: "match_type", detail: "[可選 - 預設值為1] - 要採用的蒐索管道。\n\n1為默認類型,此時MATCH會假設範圍已按昇冪排序,並返回小於等於蒐索鍵值的最大值。\n\n0表示完全匹配,在範圍未排序的情况下需要使用此管道。\n\n-1讓MATCH假設範圍是按降序排序的,並返回大於等於蒐索鍵值的最小值。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INDEX", t: 2, d: "返回表格或中的元素值,此元素由行號和列號的索引值給定。", a: "返回表格或中的元素值,此元素由行號和列號的索引值給定。", m: [2, 3], p: [{ name: "array", detail: "儲存格區域或數組常數。", example: "A1:C20", require: "m", repeat: "n", type: "range" }, { name: "row_num", detail: "選擇數組中的某行,函數從該行返回數值。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "column_num", detail: "選擇數組中的某列,函數從該列返回數值。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GETPIVOTDATA", t: 2, d: "從與指定行和列標題對應的數據透視錶中選取匯總值。", a: "從與指定行和列標題對應的數據透視錶中選取匯總值。", m: [2, 254], p: [{ name: "data_field", detail: '您想從數據透視錶中獲取其數據的值名稱。\n值名稱必須括在引號中或是指向包含相關文字的任何儲存格的引用。\n如果有多個值欄位,則必須使用數據透視錶中顯示的確切名稱(如"銷售總額")。', example: '"SUM of number of units"', require: "m", repeat: "n", type: "rangeall" }, { name: "pivot_table", detail: "目標數據透視錶中的任何儲存格的引用(推薦位於頂角的儲存格)。", example: "'Pivot table'!A1", require: "m", repeat: "n", type: "rangeall" }, { name: "field1", detail: "[可選] - 源數據集(不是數據透視錶)中列的名稱。", example: '"division"', require: "o", repeat: "y", type: "rangeall" }, { name: "item1", detail: "[可選] - 數據透視錶中顯示的與您要檢索的欄位名稱1相對應的行或列的名稱。", example: '"east"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CHOOSE", t: 2, d: "基於索引返回選項清單中的元素。", a: "基於索引返回選項清單中的元素。", m: [2, 255], p: [{ name: "index_num", detail: "指定要返回哪一項。\n\n如果索引為零、負值或大於提供的選擇數量,將返回#VALUE!錯誤。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value1", detail: "一項可能的返回值。必須提供。可以是儲存格引用或單獨的值。", example: '"A"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "[可選] - 其他可以選擇的值。選擇", example: '"B"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "HYPERLINK", t: 2, d: "在儲存格內創建一個超連結。", a: "在儲存格內創建一個超連結。", p: [{ name: "網址", detail: "以引號括住的連結位置的完整網址,或對包含這種網址的儲存格的引用。\n\n僅允許某些連結類型。其中包括:http://、https://、mailto:、aim:、ftp://、gopher://、telnet://和news://,明確禁用使用其他協定。如果指定的是其他協定,將會在儲存格中顯示連結標籤,但該標籤不會以連結形式呈現。\n\n如果未指定協定,則假設使用http://,並將其作為網址的首碼。", example: '"http://www.google.com/"', require: "m", repeat: "n", type: "rangeall" }, { name: "連結標籤", detail: '[可選-默認為網址] - 要在儲存格中作為連結顯示的文字(用引號括起來的),或者指向包含這種標籤的儲存格的引用。\n\n如果連結標籤是指向某個空儲存格的引用,如果網址有效,就將其作為連結顯示,否則作為純文字顯示。\n\n如果連結標籤為空字串常數(""),所在儲存格顯示的內容將為空白,但通過點擊該儲存格或轉入該儲存格仍然可以訪問連結。', example: '"Google"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TIME", t: 6, d: "將給定的小時、分鐘和秒轉換為時間。", a: "將給定的小時、分鐘和秒轉換為時間。", m: [3, 3], p: [{ name: "小時", detail: "0(零)到 32767 之間的數位,代表小時。\n\n任何大於 23 的值都會除以24,餘數將作為小時值。", example: "11", require: "m", repeat: "n", type: "rangenumber" }, { name: "分鐘", detail: "0(零)到 32767 之間的數位,代表分鐘。\n\n任何大於 59 的值將轉換為小時和分鐘。", example: "40", require: "m", repeat: "n", type: "rangenumber" }, { name: "秒", detail: "0(零)到 32767 之間的數位,代表秒。\n\n任何大於 59 的值將轉換為小時、分鐘和秒。", example: "59", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TIMEVALUE", t: 6, d: "按一天24小時返回該時間的分數表示。", a: "按一天24小時返回該時間的分數表示。", m: [1, 1], p: [{ name: "time_text", detail: "用於表示時間的字串。", example: '"2:15 PM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EOMONTH", t: 6, d: "返回某個月份最後一天的序號,該月份在另一個日期之前或之後的數個月(月數由參數指定)。", a: "返回某個月份最後一天的序號", m: [2, 2], p: [{ name: "start_date", detail: "用於計算結果的參照日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "用於計算的起始日期之前(負)或之後(正)的月數。返回的是計算所得月份的最後那天。", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "EDATE", t: 6, d: "返回表示某個日期的序號,該日期在另一個日期的數月之前/之後。", a: "返回表示某個日期的序號", m: [2, 2], p: [{ name: "start_date", detail: "用於計算結果的參照日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "months", detail: "用於計算的起始日期之前(負)或之後(正)的月數。", example: "7", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SECOND", t: 6, d: "返回時間值的秒數。秒數是0(零)到59範圍內的整數。", a: "返回時間值的秒數。秒數是0(零)到59範圍內的整數。", m: [1, 1], p: [{ name: "時間", detail: "用於計算秒鐘部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "MINUTE", t: 6, d: "以數位格式返回特定時間的分鐘部分。", a: "以數位格式返回特定時間的分鐘部分。", m: [1, 1], p: [{ name: "時間", detail: "用於計算分鐘部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "HOUR", t: 6, d: "以數位格式返回特定時間的小時部分。", a: "以數位格式返回特定時間的小時部分。", m: [1, 1], p: [{ name: "時間", detail: "用於計算小時部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。", example: "TIME(11", require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOW", t: 6, d: "以日期值格式返回當前日期和時間。", a: "以日期值格式返回當前日期和時間。", m: [0, 0], p: [] }, { n: "NETWORKDAYS", t: 6, d: "返回所提供的兩個日期之間的淨工作日天數。", a: "返回所提供的兩個日期之間的淨工作日天數。", m: [2, 3], p: [{ name: "start_date", detail: "用於計算淨工作日天數的時間段開始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "用於計算淨工作日天數的時間段結束日期。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[可選] - 一個範圍或數組常數,其中包含作為節假日的日期序號。\n\n在節假日數組中提供的值必須是日期序號值(例如由N所返回的值)或日期值(例如由DATE、DATEVALUE或TO_DATE返回的值)。由範圍指定的值應該是標準的日期值或日期序數值。", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "NETWORKDAYS_INTL", t: 6, d: "返回給定的兩個日期之間的淨工作日天數(排除指定的週末和節假日)。", a: "返回給定的兩個日期之間的淨工作日天數(排除指定的週末和節假日)。", m: [2, 4], p: [{ name: "start_date", detail: "用於計算淨工作日天數的時間段開始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "用於計算淨工作日天數的時間段結束日期。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "weekend", detail: '[可選-預設值為1] - 用於表示哪些天為週末的數位或字串。\n字串管道:可以使用由0和1組成的字串來指定週末,串中的第一個數位字元代表週一,最後一個則代表周日。零表示這一天是工作日,1 表示這一天為週末。例如,"0000011"表示將週六和周日作為週末。\n數位管道:這種管道不使用上述字串形式,而是使用一個數位。1 =週六/周日為週末,2 =周日/週一為週末,依此類推則7 =週五/週六。11 =周日為唯一週末,12 =週一為唯一週末,依此類推則17 =週六為唯一週末。', example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[可選] - 這是一個範圍或數組常數,其中包含作為節假日的日期。\n在節假日數組內提供的值必須為日期序數值(例如N的返回值)或日期值(例如DATE、DATEVALUE或TO_DATE的返回值)。由範圍指定的值應該是標準的日期值或日期序數值。", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ISOWEEKNUM", t: 6, d: "返回給定日期在全年中的 ISO 周數。", a: "返回給定日期在全年中的 ISO 周數。", m: [1, 1], p: [{ name: "date", detail: "用於日期和時間計算的日期-時間程式碼。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WEEKNUM", t: 6, d: "返回特定日期的周數。", a: "返回特定日期的周數。", m: [1, 2], p: [{ name: "serial_number", detail: "要確定其位於第幾周的日期,必須是對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "return_type", detail: "[可選-預設值為1 ] - 代表一周起始日的數位,系統也使用該數位來確定一年的第一周(1=周日,2=週一)。", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "WEEKDAY", t: 6, d: "返回一個數位,對應於給定日期所在的星期幾。", a: "返回一個數位,對應於給定日期所在的星期幾。", m: [1, 2], p: [{ name: "serial_number", detail: "要為其確定星期幾的日期。必須是對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "return_type", detail: "[可選-預設值為1] -以數位訓示使用哪種編號順序來表示星期幾。默認情况下,按星期日(= 1)開始計算。\n\n如果類型為1,則星期值將從星期日開始算起,並且星期日的值為1,囙此星期六的值就是7。\n\n如果類型為2,則星期值將從星期一開始算起,並且星期一的值為1,囙此星期日的值就是7。\n\n如果類型為3,則星期值將從星期一算起,並且星期一的值為0,囙此星期日的值就是6。", example: "7", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DAY", t: 6, d: "以數位格式返回特定日期所在的當月幾號。", a: "以數位格式返回特定日期所在的當月幾號。", m: [1, 1], p: [{ name: "serial_number", detail: "要從中選取具體幾號的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS", t: 6, d: "返回兩個日期之間的天數。", a: "返回兩個日期之間的天數。", m: [2, 2], p: [{ name: "end_date", detail: "計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "2011-3-15", require: "m", repeat: "n", type: "rangeall" }, { name: "start_date", detail: "計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "2011-2-1", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DAYS360", t: 6, d: "按照每年360天,返回兩個日期之間的差(用於計算利息)。", a: "按照每年360天,返回兩個日期之間的差(用於計算利息)。", m: [2, 3], p: [{ name: "start_date", detail: "計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "method", detail: "[可選 - 默認為FALSE()] - 訓示要使用哪種天數計算方法。\n\nFALSE -採用美國(NASD)方法時,如果起始日期為某月的最後一天,為便於計算,會將起始日期的當月幾號更改為30。此外,如果結束日期是所在月份的最後一天,而且起始日期在其所在月的30號之前,則將結束日期更改為結束日期之後那個月的第一天,否則將結束日期更改為該月的30號。\n\nTRUE -採用歐洲方法時,會將所有日期在31號的起始日期或結束日期更改為當月的30號。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "DATE", t: 6, d: "將提供的年、月、日轉換為日期。", a: "將提供的年、月、日轉換為日期。", m: [3, 3], p: [{ name: "year", detail: "日期的年份部分,包含一到四位數位。\n\n介於0(零)到 1899 之間,會將該值與 1900 相加來計算年份;\n\n介於 1900 到 9999 之間,將使用該數值作為年份;\n\n小於0或大於等於 10000,返回錯誤值#NUM!。", example: "1969", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "日期的月份部分,一個正整數或負整數。\n\n如果 month 大於 12,則 month 會將該月份數與指定年中的第一個月相加。\n\n如果 month 小於 1,month 則從指定年份的一月份開始遞減該月份數,然後再加上 1 個月。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "day", detail: "日期的日部分,一個正整數或負整數。\n\n如果 day 大於月中指定的天數,則 day 會將天數與該月中的第一天相加。\n\n如果 day 小於1,則 day 從指定月份的第一天開始遞減該天數,然後再加上 1 天。", example: "20", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DATEVALUE", t: 6, d: "將提供的日期字串轉換為日期的序號。", a: "將提供的日期字串轉換為日期的序號。", m: [1, 1], p: [{ name: "date_text", detail: "表示日期的字串。", example: '"1969-7-20"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DATEDIF", t: 6, d: "計算兩個日期之間的天數、月數或年數。", a: "計算兩個日期之間的天數、月數或年數。", m: [3, 3], p: [{ name: "起始日期", detail: "計算中要使用的開始日期。必須是對包含DATE值的儲存格的引用、返回DATE類型的函數或數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "結束日期", detail: "計算中要使用的結束日期。必須是對包含DATE值的儲存格的引用、返回DATE類型的函數或數位。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "組織", detail: '時間組織的縮寫文字。例如"M"代表月。有效值包括:"Y"、"M"、"D"、"MD"、"YM"和"YD"。\n\n"Y":返回起始日期和結束日期之間的整年數。\n\n"M":返回起始日期和結束日期之間的整月數。\n\n"D":返回起始日期和結束日期之間的天數。\n\n"MD":返回起始日期和結束日期之間的天數(不計整月數)。\n\n"YM":返回起始日期和結束日期之間的整月數(不計整年數)。\n\n"YD":返回起始日期和結束日期之間的天數(假設起始日期和結束日期的間隔不超過一年)。', example: "16)", require: "m", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY", t: 6, d: "指定工作日天數,計算結束日期。", a: "指定工作日天數,計算結束日期。", m: [2, 3], p: [{ name: "start_date", detail: "計算的開始日期。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "days", detail: "start_date之前或之後不含週末及節假日的天數。\n\n為正值將生成未來日期;\n\n為負值生成過去日期。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "holidays", detail: "[可選] - 一個範圍或數組常數,其中包含作為節假日的日期序號。\n\n在節假日數組中提供的值必須是日期序號值(例如由N所返回的值)或日期值(例如由DATE、DATEVALUE或TO_DATE返回的值)。由範圍指定的值應該是標準的日期值或日期序數值。", example: "16)", require: "o", repeat: "n", type: "rangeall" }] }, { n: "WORKDAY_INTL", t: 6, d: "返回指定的若干個工作日之前或之後的日期的序號(使用自定義週末參數)。 ", a: "返回指定的若干個工作日之前或之後的日期的序號(使用自定義週末參數)。 ", m: [2, 4], p: [{ name: "start_date", detail: "開始日期(將被截尾取整)。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "days", detail: "start_date之前或之後的工作日的天數。\n\n正值表示未來日期;\n\n負值表示過去日期;\n\n零值表示開始日期。", example: "7", require: "m", repeat: "n", type: "rangenumber" }, { name: "weekend", detail: '[可選 - 預設值為1] - 用於表示哪些天為週末的數位或字串。\n字串管道:可以使用由0和1組成的字串來指定週末,串中的第一個數位字元代表週一,最後一個則代表周日。零表示這一天是工作日,1表示這一天為週末。例如,"0000011"表示將週六和周日作為週末。\n數位管道:這種管道不使用上述字串形式,而是使用一個數位。1 =週六/周日為週末,2 =周日/週一為週末,依此類推則7 =週五/週六。11 =周日為唯一週末,12 =週一為唯一週末,依此類推則17 =週六為唯一週末。', example: "16)", require: "o", repeat: "n", type: "rangeall" }, { name: "holidays", detail: "[可選] - 這是一個範圍或數組常數,其中包含作為節假日的日期。\n在節假日數組內提供的值必須為日期序數值(例如N的返回值)或日期值(例如DATE、DATEVALUE或TO_DATE的返回值)。由範圍指定的值應該是標準的日期值或日期序數值。", example: "DATE(1969", require: "o", repeat: "n", type: "rangeall" }] }, { n: "YEAR", t: 6, d: "返回對應於某個日期的年份。Year作為 1900 - 9999 之間的整數返回。", a: "返回對應於某個日期的年份。Year作為 1900 - 9999 之間的整數返回。", m: [1, 1], p: [{ name: "serial_number", detail: "用於計算年份的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "YEARFRAC", t: 6, d: "返回 start_date 和 end_date 之間的天數占全年天數的百分比。", a: "返回 start_date 和 end_date 之間的天數占全年天數的百分比。", m: [2, 3], p: [{ name: "start_date", detail: "計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "end_date", detail: "計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "7", require: "m", repeat: "n", type: "rangeall" }, { name: "basis", detail: '[可選 - 默認為0] - 要使用的日計數基準類型。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "16)", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "TODAY", t: 6, d: "以日期值格式返回當前日期。", a: "以日期值格式返回當前日期。", m: [0, 0], p: [] }, { n: "MONTH", t: 6, d: "返回日期(以序列數表示)中的月份。月份是介於1(一月)到12(十二月)之間的整數。", a: "返回日期(以序列數表示)中的月份。月份是介於1(一月)到12(十二月)之間的整數。", m: [1, 1], p: [{ name: "serial_number", detail: "要從中選取月份的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EFFECT", t: 8, d: "根據名義利率及每年的複利計息期數來計算實際年利率。", a: "根據名義利率及每年的複利計息期數來計算實際年利率。", m: [2, 2], p: [{ name: "nominal_rate", detail: "每年的名義利率。", example: "0.99", require: "m", repeat: "n", type: "rangenumber" }, { name: "npery", detail: "每年的複利計算期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLAR", t: 12, d: "將數位格式設定為與語言區域相對應的貨幣格式。", a: "將數位格式設定為與語言區域相對應的貨幣格式。", m: [1, 2], p: [{ name: "number", detail: "要設定格式的值。", example: "1.2351", require: "m", repeat: "n", type: "rangenumber" }, { name: "decimals", detail: "[可選 - 預設值為2] - 要顯示的小數位數。\n\n如果這是負數,則將數位四捨五入到小數點左側。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARDE", t: 8, d: "將以整數部分和分數部分轉換為以小數部分表示的金額數位", a: "將以整數部分和分數部分轉換為以小數部分表示的金額數位", m: [2, 2], p: [{ name: "fractional_dollar", detail: "以整數部份和分數部分表示的數位,用小數點隔開。", example: "100.10", require: "m", repeat: "n", type: "rangenumber" }, { name: "fraction", detail: "用作分數中的分母的整數。", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DOLLARFR", t: 8, d: "將小數轉換為分數表示的金額數位。", a: "將小數轉換為分數表示的金額數位。", m: [2, 2], p: [{ name: "decimal_dollar", detail: "小數。", example: "100.125", require: "m", repeat: "n", type: "rangenumber" }, { name: "fraction", detail: "用作分數中的分母的整數。", example: "32", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DB", t: 8, d: "使用固定餘額遞減法,返回指定期間內某項固定資產的折舊值。", a: "使用固定餘額遞減法,返回指定期間內某項固定資產的折舊值。", m: [4, 5], p: [{ name: "cost", detail: "資產原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折舊末尾時的值(有時也稱為資產殘值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "資產的折舊期數(有時也稱作資產的使用壽命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限內要計算折舊的折舊期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "month", detail: "[可選 - 預設值為12] - 折舊第一年中的月數。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DDB", t: 8, d: "用雙倍餘額遞減法,返回指定期間內某項固定資產的折舊值。", a: "用雙倍餘額遞減法,返回指定期間內某項固定資產的折舊值。", m: [4, 5], p: [{ name: "cost", detail: "资产原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折舊末尾時的值(有時也稱為資產殘值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "資產的折舊期數(有時也稱作資產的使用壽命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限內要計算折舊的折舊期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "factor", detail: "[可選 - 預設值為2] - 折舊的遞減係數。", example: "2.25", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RATE", t: 8, d: "返回年金每期的利率。", a: "返回年金每期的利率。", m: [3, 6], p: [{ name: "nper", detail: "年金的付款總期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "每期的付款金額,在年金週期內不能更改。", example: "-100", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值即一系列未來付款當前值的總和。", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "guess", detail: "[可選 - 預設值為0.1] - 預期利率。", example: "0.1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "CUMPRINC", t: 8, d: "基於等額分期付款和固定利率,計算投資在多個付款期內的累計本金償還額。", a: "基於等額分期付款和固定利率,計算投資在多個付款期內的累計本金償還額。", m: [6, 6], p: [{ name: "rate", detail: "利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "總付款期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "年金的現值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_period", detail: "開始累計計算的付款期序號。\n\n首期必須大於等於1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_period", detail: "結束累計計算的付款期序號。\n\n末期必須大於首期。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPNUM", t: 8, d: "返回在結算日和到期日之間的付息次數,向上舍入到最近的整數", a: "返回在結算日和到期日之間的付息次數,向上舍入到最近的整數", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "02", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SYD", t: 8, d: "返回在指定期間內資產按年限總和折舊法計算的折舊。", a: "返回在指定期間內資產按年限總和折舊法計算的折舊。", m: [4, 4], p: [{ name: "cost", detail: "資產原值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折舊末尾時的值(有時也稱為資產殘值)。", example: "50", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "資產的折舊期數(有時也稱作資產的使用壽命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }, { name: "period", detail: "在使用期限內要計算折舊的折舊期。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLEQ", t: 8, d: "基於貼現率計算美國政府短期債券的等效年化收益率。", a: "基於貼現率計算美國政府短期債券的等效年化收益率。", m: [3, 3], p: [{ name: "settlement", detail: "債券的結算日期,此日期為債券發行後交付給買家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "債券的到期或結束日期,届時可將其以面值或票面價值贖回。", example: "1", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "債券購買時的貼現率。", example: "2)", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLYIELD", t: 8, d: "基於價格計算美國政府短期債券的收益率。", a: "基於價格計算美國政府短期債券的收益率。", m: [3, 3], p: [{ name: "settlement", detail: "債券的結算日期,此日期為債券發行後交付給買家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "債券的到期或結束日期,届時可將其以面值或票面價值贖回。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "債券的購買價格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TBILLPRICE", t: 8, d: "基於貼現率計算美國政府短期債券的價格。", a: "基於貼現率計算美國政府短期債券的價格。", m: [3, 3], p: [{ name: "settlement", detail: "債券的結算日期,此日期為債券發行後交付給買家的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "債券的到期或結束日期,届時可將其以面值或票面價值贖回。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "債券購買時的貼現率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PV", t: 8, d: "基於等額分期付款和固定利率,計算年金投資的現值。", a: "基於等額分期付款和固定利率,計算年金投資的現值。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款總期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "每期的付款金額,在年金週期內不能更改。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "D2", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ACCRINT", t: 8, d: "返回定期付息證券的應計利息。", a: "返回定期付息證券的應計利息。", m: [6, 8], p: [{ name: "issue", detail: "有價證券的發行日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "first_interest", detail: "有價證券的首次計息日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有價證券的年息票利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "par", detail: "證券的票面值。", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示""歐洲30/360"方法"-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "calc_method", detail: "[可選 - 默認為TRUE()] - 一個邏輯值,指定當結算日期晚於首次計息日期時用於計算總應計利息的方法。\n\n如果值為TRUE,則返回從發行日到結算日的總應計利息。\n\n如果值為FALSE,則返回從首次計息日到結算日的應計利息。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "ACCRINTM", t: 8, d: "返回在到期日支付利息的有價證券的應計利息。", a: "返回在到期日支付利息的有價證券的應計利息。", m: [4, 5], p: [{ name: "issue", detail: "有價證券的發行日。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "settlement", detail: "有價證券的到期日。", example: "DATE(1969", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有價證券的年息票利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "par", detail: "證券的票面值。", example: "1000", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYBS", t: 8, d: "返回從付息期開始到結算日的天數。", a: "返回從付息期開始到結算日的天數。", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYS", t: 8, d: "返回結算日所在的付息期的天數。", a: "返回結算日所在的付息期的天數。", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] -訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPDAYSNC", t: 8, d: "返回從結算日到下一票息支付日之間的天數。", a: "返回從結算日到下一票息支付日之間的天數。", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPNCD", t: 8, d: "計算結算日之後的下一票息或利息派發日期。", a: "計算結算日之後的下一票息或利息派發日期。", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COUPPCD", t: 8, d: "計算結算日之前的最後一個票息或利息支付日。", a: "計算結算日之前的最後一個票息或利息支付日。", m: [3, 4], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4 。", example: "01)", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "DATE(2019", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FV", t: 8, d: "基於等額分期付款和固定利率,計算年金投資的未來價值。", a: "基於等額分期付款和固定利率,計算年金投資的未來價值。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款總期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "各期所應支付的金額,在整個年金期間保持不變。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "[可選 - 預設值為0 ] - 現值,或一系列未來付款的當前值的累積和。", example: "400", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0 ] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "FVSCHEDULE", t: 8, d: "返回應用一系列複利率計算的初始本金的未來值。", a: "返回應用一系列複利率計算的初始本金的未來值。", m: [2, 2], p: [{ name: "principal", detail: "現值。", example: "10000", require: "m", repeat: "n", type: "rangenumber" }, { name: "schedule", detail: "用於計算本金複利的一組利率。\n\n利率錶必須是範圍或數組,其中包含要用於計算複利的一組利率。這些利率值應該以十進位小數形式表示,或者使用UNARY_PERCENT以百分比形式表示,即表示為0.09或UNARY_PERCENT9,而不要表示為9。", example: "A2:A100", require: "m", repeat: "n", type: "range" }] }, { n: "YIELD", t: 8, d: "返回定期支付利息的債券的收益率。", a: "返回定期支付利息的債券的收益率。", m: [6, 7], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有價證券的年息票利率。", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "pr", detail: "有價證券的價格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有價證券的清償價值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "YIELDDISC", t: 8, d: "基於價格計算折價發行的(不帶息)債券的年收益率。", a: "基於價格計算折價發行的(不帶息)債券的年收益率。", m: [4, 5], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "有價證券的價格。", example: "95", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有價證券的清償價值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "NOMINAL", t: 8, d: "基於給定的實際利率和年複利期數,返回名義年利率。", a: "基於給定的實際利率和年複利期數,返回名義年利率。", m: [2, 2], p: [{ name: "effect_rate", detail: "每年的實際利率。", example: "0.85", require: "m", repeat: "n", type: "rangenumber" }, { name: "npery", detail: "每年的複利期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "XIRR", t: 8, d: "返回一組不一定定期發生的現金流的內部收益率。", a: "返回一組不一定定期發生的現金流的內部收益率。", m: [2, 3], p: [{ name: "values", detail: "其中含有投資相關收益或支出的數組或範圍。\n\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "dates", detail: "與現金流數額參數中的現金流對應的日期數組或範圍。", example: "C2:C25", require: "m", repeat: "n", type: "range" }, { name: "guess", detail: "[可選 - 預設值為0.1] - 對內部回報率的估算值。", example: "250", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MIRR", t: 8, d: "返回一系列定期現金流的修改後內部收益率。", a: "返回一系列定期現金流的修改後內部收益率。", m: [3, 3], p: [{ name: "values", detail: "其中含有投資相關收益或支出的數組或範圍。\n\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "finance_rate", detail: "現金流中使用的資金支付的利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "reinvest_rate", detail: "將現金流再投資的收益率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IRR", t: 8, d: "返回由值中的數位表示的一系列現金流的內部收益率。 ", a: "返回由值中的數位表示的一系列現金流的內部收益率。 ", m: [1, 2], p: [{ name: "values", detail: "其中含有投資相關收益或支出的數組或範圍。\n\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。", example: "A2:A25", require: "m", repeat: "n", type: "range" }, { name: "guess", detail: "[可選 - 默認為0.1] - 內部收益率的估值。", example: "200", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPV", t: 8, d: "使用貼現率和一系列未來支出(負值)和收益(正值)來計算一項投資的淨現值。", a: "使用貼現率和一系列未來支出(負值)和收益(正值)來計算一項投資的淨現值。", m: [2, 255], p: [{ name: "rate", detail: "某一期間的貼現率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "value1", detail: "第一筆支出(負值)和收益(正值)。", example: "200", require: "m", repeat: "n", type: "rangeall" }, { name: "value2, ...", detail: "[可選] - 其他支出(負值)和收益(正值)。", example: "250", require: "o", repeat: "y", type: "rangeall" }] }, { n: "XNPV", t: 8, d: "返回一組現金流的淨現值,這些現金流不一定定期發生。", a: "返回一組現金流的淨現值,這些現金流不一定定期發生。", m: [3, 3], p: [{ name: "rate", detail: "應用於現金流的貼現率。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "values", detail: "與dates中的支付時間相對應的一系列現金流。", example: "B2:B25", require: "m", repeat: "n", type: "range" }, { name: "dates", detail: "與現金流支付相對應的支付日期錶。", example: "C2:C25", require: "m", repeat: "n", type: "range" }] }, { n: "CUMIPMT", t: 8, d: "基於等額分期付款和固定利率,計算投資在一系列付款期內的累計利息。", a: "基於等額分期付款和固定利率,計算投資在一系列付款期內的累計利息。", m: [6, 6], p: [{ name: "rate", detail: "利息率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "總付款期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "start_period", detail: "開始累計計算的付款期序號。\n\n首期必須大於等於1。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "end_period", detail: "結束累計計算的付款期序號。\n\n末期必須大於首期。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "0", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PMT", t: 8, d: "用於根據固定付款額和固定利率計算貸款的付款額。", a: "用於根據固定付款額和固定利率計算貸款的付款額。", m: [3, 5], p: [{ name: "rate", detail: "貸款利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "該項貸款的付款總數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值,或一系列未來付款額現在所值的總額,也叫本金。", example: " 100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "D2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "IPMT", t: 8, d: "基於固定利率及等額分期付款管道,返回給定期數內對投資的利息償還額。", a: "基於固定利率及等額分期付款管道,返回給定期數內對投資的利息償還額。", m: [4, 6], p: [{ name: "rate", detail: "各期利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "per", detail: "用於計算其利息數額的期數,必須在1到nper之間。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款總期數。", example: "12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值,或一系列未來付款的當前值的累積和。", example: "80000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "E2", require: "m", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "1", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PPMT", t: 8, d: "返回根據定期固定付款和固定利率而定的投資在已知期間內的本金償付額。", a: "返回根據定期固定付款和固定利率而定的投資在已知期間內的本金償付額。", m: [4, 6], p: [{ name: "rate", detail: "各期利率。", example: "0.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "per", detail: "指定期數,該值必須在 1 到 nper 範圍內。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "nper", detail: "年金的付款總期數。", example: "3*12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值即一系列未來付款當前值的總和。", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "INTRATE", t: 8, d: "返回完全投資型證券的利率。", a: "返回完全投資型證券的利率。", m: [4, 5], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "有價證券的投資額。", example: "100000", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "有價證券到期時的兌換值。", example: "101200", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "12", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "PRICE", t: 8, d: "返回定期付息的面值¥100的有價證券的價格。", a: "返回定期付息的面值¥100的有價證券的價格。", m: [6, 7], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有價證券的年息票利率。", example: "0.057", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有價證券的年收益率。", example: "0.065", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值¥100的有價證券的清償價值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEDISC", t: 8, d: "返回折價發行的面值¥100的有價證券的價格。", a: "返回折價發行的面值¥100的有價證券的價格。", m: [4, 5], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "discount", detail: "有价证券的贴现率。", example: "0.0525", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值¥100的有價證券的清償價值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "PRICEMAT", t: 8, d: "返回到期付息的面值¥100的有價證券的價格。", a: "返回到期付息的面值¥100的有價證券的價格。", m: [5, 6], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "issue", detail: "有價證券的發行日。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "rate", detail: "有價證券在發行日的利率。", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有價證券的年收益率。", example: "0.061", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "RECEIVED", t: 8, d: "返回一次性付息的有價證券到期收回的金額。", a: "返回一次性付息的有價證券到期收回的金額。", m: [4, 5], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "investment", detail: "有價證券的投資額。", example: "10000000", require: "m", repeat: "n", type: "rangenumber" }, { name: "discount", detail: "有價證券的貼現率。", example: "0.0575", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DISC", t: 8, d: "返回有價證券的貼現率。", a: "返回有價證券的貼現率。", m: [4, 5], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "pr", detail: "有價證券的價格(按面值為¥100計算)。", example: "97.975", require: "m", repeat: "n", type: "rangenumber" }, { name: "redemption", detail: "面值¥100的有價證券的清償價值。", example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "12", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "NPER", t: 8, d: "基於固定利率及等額分期付款管道,返回某項投資的總期數。", a: "基於固定利率及等額分期付款管道,返回某項投資的總期數。", m: [3, 5], p: [{ name: "rate", detail: "各期利率。", example: "0.12", require: "m", repeat: "n", type: "rangenumber" }, { name: "pmt", detail: "各期所應支付的金額,在整個年金期間保持不變。", example: "500", require: "m", repeat: "n", type: "rangenumber" }, { name: "pv", detail: "現值,或一系列未來付款的當前值的累積和。", example: "40000", require: "m", repeat: "n", type: "rangenumber" }, { name: "fv", detail: "[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。", example: "0", require: "o", repeat: "n", type: "rangenumber" }, { name: "type", detail: "[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\n\n0表示期末;\n\n1表示期初。", example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SLN", t: 8, d: "返回一個期間內的資產的直線折舊。", a: "返回一個期間內的資產的直線折舊。", m: [3, 3], p: [{ name: "cost", detail: "資產原值。", example: "300000", require: "m", repeat: "n", type: "rangenumber" }, { name: "salvage", detail: "折舊末尾時的值(有時也稱為資產殘值)。", example: "75000", require: "m", repeat: "n", type: "rangenumber" }, { name: "life", detail: "資產的折舊期數(有時也稱作資產的使用壽命)。", example: "10", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DURATION", t: 8, d: "返回假設面值¥100的定期付息有價證券的修正期限。", a: "返回假設面值¥100的定期付息有價證券的修正期限。", m: [5, 6], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "coupon", detail: "有價證券的年息票利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有價證券的年收益率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "MDURATION", t: 8, d: "返回假設面值¥100的有價證券的Macauley修正期限。", a: "返回假設面值¥100的有價證券的Macauley修正期限。", m: [5, 6], p: [{ name: "settlement", detail: "有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "maturity", detail: "有價證券的到期日。到期日是有價證券有效期截止時的日期。", example: "DATE(2010", require: "m", repeat: "n", type: "rangeall" }, { name: "coupon", detail: "有價證券的年息票利率。", example: "0.08", require: "m", repeat: "n", type: "rangenumber" }, { name: "yld", detail: "有價證券的年收益率。", example: "0.09", require: "m", repeat: "n", type: "rangenumber" }, { name: "frequency", detail: "年付息次數。\n\n如果按年支付,frequency = 1\n\n按半年期支付,frequency = 2\n\n按季支付,frequency = 4。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "basis", detail: '[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\n\n0表示"美國(NASD30/360"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\n\n1表示"實際/實際"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\n\n2表示"實際/360"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\n\n3表示"實際/365"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\n\n4表示"歐洲30 / 360"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。', example: "0", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2DEC", t: 9, d: "將二進位數轉換為十進位數。", a: "將二進位數轉換為十進位數。", m: [1, 1], p: [{ name: "number", detail: '要轉換為十進位數的帶符號的10位二進位數值(以字串形式提供)。\n\n帶符號的二進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\n\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2DEC100)和BIN2DEC"100")得出的結果相同,均為4。', example: "101", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIN2HEX", t: 9, d: "將二進位數轉換為十六進位數。", a: "將二進位數轉換為十六進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的十六進位數的帶符號的10位二進位數值(以字串形式提供)。\n\n帶符號的二進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\n\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2HEX11111)和BIN2HEX"11111")得出的結果相同,均為1F。', example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: '[ 可選 ] -結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。例如,BIN2HEX"11111",8)所得的結果值為0000001F。\n\n如果帶符號的二進位數的最高位為1,則忽略此值;即當提供的帶符號的二進位數大於等於1000000000時忽略此值。', example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "BIN2OCT", t: 9, d: "二進位數轉換為八進制數。", a: "二進位數轉換為八進制數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的八進制數的帶符號的10位二進位數值(以字串形式提供)。\n\n帶符號的二進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\n\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2OCT11111)和BIN2OCT"11111")得出的結果相同,均為37。', example: "101", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: '[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。例如,BIN2OCT"11111")得到的結果值為00000037。\n\n如果帶符號的二進位數的最高位為1,則忽略此值;即當提供的帶符號的二進位數大於等於1000000000時忽略此值。', example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2BIN", t: 9, d: "將十進位數轉換為二進位數。", a: "將十進位數轉換為二進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的二進位數的十進位數值(以字串形式提供)。\n\n對於此函數,最大的正數輸入值為511,最小的負數輸入值為-512。\n\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2BIN199)和DEC2BIN"199")得出的結果相同,均為11000111。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果十進位數為負數,則忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2HEX", t: 9, d: "將十進位數轉換為十六進位數。", a: "將十進位數轉換為十六進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的十六進位數的十進位數值(以字串形式提供)。\n\n此函數可接受的最大正數值為549755813887,最小負數值為-549755814888。\n\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2HEX100)和DEC2HEX"100")得出的結果相同,均為64。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果十進位數為負數,則忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DEC2OCT", t: 9, d: "將十進位數轉換為八進制數。", a: "將十進位數轉換為八進制數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的八進制數的十進位數值(以字串形式提供)。\n\n此函數可接受的最大正數值為536870911,最小負數值為-53687092。\n\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2OCT199)和DEC2OCT"199")得出的結果相同,均為307。', example: "100", require: "m", repeat: "n", type: "rangenumber" }, { name: "places", detail: "[ 可選 ] -結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果十進位數為負數,則忽略此值 。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2BIN", t: 9, d: "將十六進位數轉換為二進位數。", a: "將十六進位數轉換為二進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的二進位數的帶符號的40位十六進位數值(以字串形式提供)。\n\n帶符號的十六進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為1FF,最小負數值為FFFFFFFE00。\n\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2BIN199)和HEX2BIN"199")得出的結果相同,均為110011001。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果帶符號的十六進位數的最高位為1,則忽略此值;即當提供的帶符號的十六進位數大於等於8000000000時忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "HEX2DEC", t: 9, d: "將十六進位數轉換為十進位數。", a: "將十六進位數轉換為十進位數。", m: [1, 1], p: [{ name: "number", detail: '要轉換為十進位數的帶符號的40位十六進位數值(以字串形式提供)。\n\n帶符號的十六進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為7fffffffff,最小負數值為8000000000。\n\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2DEC199)和HEX2DEC"199")得出的結果相同,均為409 。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "HEX2OCT", t: 9, d: "將十六進位數轉換為八進制數。", a: "將十六進位數轉換為八進制數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的八進制數的帶符號的40位十六進位數值(以字串形式提供)。\n\n帶符號的十六進位數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為1FFFFFFF,最小負數值為FFE0000000。\n\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2OCT199)和HEX2OCT"199")得出的結果相同,均為631。', example: '"f3"', require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果帶符號的十六進位數的最高位為1,則忽略此值;即當給定的帶符號的十六進位數大於等於8000000000時忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2BIN", t: 9, d: "將八進制數轉換為二進位數。", a: "將八進制數轉換為二進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的二進位數的帶符號的30位八進制數值(以字串形式提供)。\n\n帶符號的八進制數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為777,最小負數值為7777777000。\n\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2BIN177)和OCT2BIN"177")得出的結果相同,均為1111111。', example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果帶符號的八進制數的最高位為1,則忽略此值;即當給定的帶符號的八進制數大於等於4000000000時忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "OCT2DEC", t: 9, d: "將八進制數轉換為十進位數。", a: "將八進制數轉換為十進位數。", m: [1, 1], p: [{ name: "number", detail: '要轉換為十進位數的帶符號的30位八進制數值(以字串形式提供)。\n\n帶符號的ba進制數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為3777777777,最小負數值為4000000000。\n\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2DEC177)和OCT2DEC"177")得出的結果相同,均為127。', example: "37", require: "m", repeat: "n", type: "rangeall" }] }, { n: "OCT2HEX", t: 9, d: "將八進制數轉換為十六進位數。", a: "將八進制數轉換為十六進位數。", m: [1, 2], p: [{ name: "number", detail: '要轉換為帶符號的十六進位數的帶符號的30位八進制數值(以字串形式提供)。\n\n帶符號的ba進制數的最高位是符號位;也就是說,負數是以二的補數形式表示的。\n\n此函數可接受的最大正數值為3777777777,最小負數值為4000000000。\n\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2HEX177)和OCT2HEX"177")得出的結果相同,均為7F。', example: "37", require: "m", repeat: "n", type: "rangeall" }, { name: "places", detail: "[ 可選 ] - 結果中要確保的有效位數。\n\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\n\n如果帶符號的八進制數的最高位為1,則忽略此值;即當給定的帶符號的八進制數大於等於4000000000時忽略此值。", example: "8", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "COMPLEX", t: 9, d: "將實係數及虛係數轉換為 x+yi 或 x+yj 形式的複數。", a: "將實係數及虛係數轉換為 x+yi 或 x+yj 形式的複數。", m: [2, 3], p: [{ name: "real_num", detail: "複數的實係數。", example: "3", require: "m", repeat: "n", type: "rangenumber" }, { name: "i_num", detail: "複數的虛係數。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "suffix", detail: '[可選 - 默認為"i"] - 複數中虛係數的尾碼。', example: '"j"', require: "o", repeat: "n", type: "rangestring" }] }, { n: "IMREAL", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的複數的實係數。", a: "返回以 x+yi 或 x+yj 文本格式表示的複數的實係數。", m: [1, 1], p: [{ name: "inumber", detail: "需要計算其實係數的複數。", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMAGINARY", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的複數的虛係數。", a: "返回以 x+yi 或 x+yj 文本格式表示的複數的虛係數。", m: [1, 1], p: [{ name: "inumber", detail: "需要計算其虛係數的複數。", example: '"4+5i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMCONJUGATE", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的複數的共軛複數。", a: "返回以 x+yi 或 x+yj 文本格式表示的複數的共軛複數。", m: [1, 1], p: [{ name: "inumber", detail: "需要計算其共軛數的複數。", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMABS", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的複數的絕對值(模)。", a: "返回以 x+yi 或 x+yj 文本格式表示的複數的絕對值(模)。", m: [1, 1], p: [{ name: "inumber", detail: "要計算其絕對值的複數。", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "DELTA", t: 9, d: "檢驗兩個值是否相等。如果 number1=number2,則返回1;否則返回0。", a: "檢驗兩個值是否相等。如果 number1=number2,則返回1;否則返回0。", m: [1, 2], p: [{ name: "number1", detail: "第一個數位。", example: "2", require: "m", repeat: "n", type: "rangenumber" }, { name: "number2", detail: "[可選 - 默認為0] - 第二個數位。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "IMSUM", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的和。", a: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的和。", m: [1, 255], p: [{ name: "inumber1", detail: "要相加的第一個複數", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2, …", detail: "[可選] -要與值1相加的其他複數", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMSUB", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的兩個複數的差。", a: "返回以 x+yi 或 x+yj 文本格式表示的兩個複數的差。", m: [2, 2], p: [{ name: "inumber1", detail: "從(複)數中减去 inumber2。", example: '"6+5i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2", detail: "從 inumber1 中减(複)數。", example: '"2+3i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IMPRODUCT", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的乘積。", a: "返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的乘積。", m: [1, 255], p: [{ name: "inumber1", detail: "用於計算乘積的第一個複數", example: '"3+4i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2, …", detail: "[可選] -要相乘的其他複數。", example: '"5-3i"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IMDIV", t: 9, d: "返回以 x+yi 或 x+yj 文本格式表示的兩個複數的商。", a: "返回以 x+yi 或 x+yj 文本格式表示的兩個複數的商。", m: [2, 2], p: [{ name: "inumber1", detail: "複數分子或被除數。", example: '"11+16i"', require: "m", repeat: "n", type: "rangeall" }, { name: "inumber2", detail: "複數分母或除數。", example: '"3+2i"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NOT", t: 10, d: '返回某個邏輯值的相反值-"NOTTRUE())"將返回FALSE"NOTFALSE())"將返回TRUE。', a: '返回某個邏輯值的相反值-"NOTTRUE())"將返回FALSE"NOTFALSE())"將返回TRUE。', m: [1, 1], p: [{ name: "logical", detail: "計算結果為TRUE或FALSE的任何值或運算式。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRUE", t: 10, d: "返回邏輯值 TRUE。", a: "返回邏輯值 TRUE。", m: [0, 0], p: [] }, { n: "FALSE", t: 10, d: "返回邏輯值 FALSE。", a: "返回邏輯值 FALSE。", m: [0, 0], p: [] }, { n: "AND", t: 10, d: "所有參數的計算結果為TRUE時,返回TRUE;只要有一個參數的計算結果為FALSE,即返回FALSE。", a: "所有參數的計算結果為TRUE時,返回TRUE;只要有一個參數的計算結果為FALSE,即返回FALSE。", m: [1, 255], p: [{ name: "logical1", detail: "要測試的第一個條件,其計算結果可以為TRUE或FALSE。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "logical2,...", detail: "[可選] - 要測試的其他條件,其計算結果可以為TRUE或FALSE,最多可包含255個條件。", example: 'A3 = "bar"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "IFERROR", t: 10, d: "如果第一個參數不是錯誤值,就返回第一個參數;否則,返回第二個參數。", a: "如果第一個參數不是錯誤值", m: [2, 2], p: [{ name: "value", detail: "檢查是否存在錯誤的參數。", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_error", detail: "公式的計算結果錯誤時返回的值。計算以下錯誤類型:#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?或#NULL!。", example: '"Error in cell A1"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "IF", t: 10, d: "當邏輯運算式的值為TRUE時返回一個值,而當其為FALSE時返回另一個值。", a: "當邏輯運算式的值為TRUE時返回一個值,而當其為FALSE時返回另一個值。", m: [2, 3], p: [{ name: "logical_test", detail: "一個運算式或對包含運算式的儲存格的引用,該運算式代表某種邏輯值(即TRUE或FALSE)。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_true", detail: "當邏輯運算式為TRUE時的返回值。", example: '"A2 is foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "value_if_false", detail: "[可選 - 默認為空白] - 當邏輯運算式等於FALSE時的函數返回值。", example: '"A2 was false"', require: "o", repeat: "n", type: "rangeall" }] }, { n: "OR", t: 10, d: "只要有一個參數的計算結果為TRUE時,返回TRUE;所有參數的計算結果為FALSE,即返回FALSE。", a: "只要有一個參數的計算結果為TRUE時,返回TRUE;所有參數的計算結果為FALSE,即返回FALSE。", m: [1, 255], p: [{ name: "logical1", detail: "要測試的第一個條件,其計算結果可以為TRUE或FALSE。", example: 'A2 = "foo"', require: "m", repeat: "n", type: "rangeall" }, { name: "邏輯運算式2", detail: "[可選] - 其他運算式或對包含運算式的儲存格的引用,這些運算式代表某種邏輯值(即TRUE或FALSE)或者可以強制轉換為邏輯值。", example: ' A3 = "bar"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "NE", t: 11, d: '如果指定的值不相等,則返回"TRUE";否則返回"FALSE"。相當於"<>"運算子。', a: '如果指定的值不相等,則返回"TRUE";否則返回"FALSE"。相當於"<>"運算子。', m: [2, 2], p: [{ name: "value1", detail: "第一個值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要檢查是否與 value1 不相等的值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "EQ", t: 11, d: '如果指定的值相等,則返回"TRUE";否則返回"FALSE"。相當於"="運算子。', a: '如果指定的值相等,則返回"TRUE";否則返回"FALSE"。相當於"="運算子。', m: [2, 2], p: [{ name: "value1", detail: "第一個值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要檢查是否與value1相等的值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GT", t: 11, d: !1, a: !1, m: [2, 2], p: [{ name: "value1", detail: "要測試其是否大於 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二個值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "GTE", t: 11, d: '如果第一個參數大於或等於第二個,則返回TRUE;否則返回FALSE。相當於">="運算子。', a: '如果第一個參數大於或等於第二個,則返回TRUE;否則返回FALSE。相當於">="運算子。', m: [2, 2], p: [{ name: "value1", detail: "要测试其是否大于等于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二個值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LT", t: 11, d: '如果第一個參數嚴格小於第二個,則返回TRUE;否則返回FALSE。相當於"<"運算子。', a: '如果第一個參數嚴格小於第二個,則返回TRUE;否則返回FALSE。相當於"<"運算子。', m: [2, 2], p: [{ name: "value1", detail: "要测试其是否小于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二個值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LTE", t: 11, d: '如果第一個參數小於或等於第二個,則返回TRUE;否則返回FALSE。相當於"<="運算子。', a: '如果第一個參數小於或等於第二個,則返回TRUE;否則返回FALSE。相當於"<="運算子。', m: [2, 2], p: [{ name: "value1", detail: "要测试其是否小于等于 value2 的值。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "第二個值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ADD", t: 11, d: '返回兩個數值之和。相當於"+"運算子。', a: '返回兩個數值之和。相當於"+"運算子。', m: [2, 2], p: [{ name: "value1", detail: "第一個加數。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "第二個加數。", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINUS", t: 11, d: '返回兩個數值之差。相當於"-"運算子。', a: '返回兩個數值之差。相當於"-"運算子。', m: [2, 2], p: [{ name: "value1", detail: "被減數,即要對其計减的數值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "減數,即要從value1中减除的數值。", example: "A3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MULTIPLY", t: 11, d: '返回兩個數的乘積。相當於"*"運算子。', a: '返回兩個數的乘積。相當於"*"運算子。', m: [2, 2], p: [{ name: "value1", detail: "第一個乘數。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "第二個乘數。", example: "B2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DIVIDE", t: 11, d: "返回兩個參數相除所得的結果。相當於`/`運算子。", a: "返回兩個參數相除所得的結果。相當於`/`運算子。", m: [2, 2], p: [{ name: "value1", detail: "要被除的數值。", example: "4", require: "m", repeat: "n", type: "rangenumber" }, { name: "value2", detail: "用於除其他數的數值。\n\n除數不得為0。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCAT", t: 11, d: "返回兩個值的串聯。相當於`&`運算子。", a: "返回兩個值的串聯。相當於`&`運算子。", m: [2, 2], p: [{ name: "value1", detail: "value2 將附於其後的值。", example: '"de"', require: "m", repeat: "n", type: "rangeall" }, { name: "value2", detail: "要附於 value1 之後的值。", example: '"mystify"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UNARY_PERCENT", t: 11, d: '返回按百分比解釋的數值。例如,"UNARY_PERCENT100"等於1。', a: '返回按百分比解釋的數值。例如,"UNARY_PERCENT100"等於1。', m: [1, 1], p: [{ name: "number", detail: "要作為百分比解釋的數值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CONCATENATE", t: 12, d: "將兩個或多個文字字串聯接為一個字串。", a: "將兩個或多個文字字串聯接為一個字串。", m: [1, 255], p: [{ name: "text1", detail: "初始字串。", example: '"Super"', require: "m", repeat: "n", type: "rangeall" }, { name: "text2…", detail: "[可選] - 要按順序連接在一起的其他字串。", example: '"calla"', require: "o", repeat: "y", type: "rangeall" }] }, { n: "CODE", t: 12, d: "返回所提供的字串中首字元的Unicode映射值。", a: "返回所提供的字串中首字元的Unicode映射值。", m: [1, 1], p: [{ name: "text", detail: "要返回其首字元的Unicode映射值的字串。", example: '"a"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CHAR", t: 12, d: "按照當前Unicode編碼表,將數位轉換為對應的字元。", a: "按照當前Unicode編碼表,將數位轉換為對應的字元。", m: [1, 1], p: [{ name: "number", detail: "介於1到255之間的數位。", example: "97", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "ARABIC", t: 12, d: "將羅馬數字轉換為阿拉伯數字。", a: "將羅馬數字轉換為阿拉伯數字。", m: [1, 1], p: [{ name: "text", detail: "要轉換格式的羅馬數字", example: '"XIV"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "ROMAN", t: 12, d: "將數位格式設定為羅馬數字形式。", a: "將數位格式設定為羅馬數字形式。", m: [1, 1], p: [{ name: "number", detail: "要設定格式的數位,介於1到3999之間(包括這兩個數位)。", example: "499", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "REGEXEXTRACT", t: 12, d: "按照規則運算式選取匹配的子串。", a: "按照規則運算式選取匹配的子串。", m: [2, 2], p: [{ name: "text", detail: "輸入文字。", example: '"Needle in a haystack"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "此函數將返回文字中符合此運算式的第一個子串。", example: '".e{2}dle"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXMATCH", t: 12, d: "判斷一段文字是否與規則運算式相匹配。", a: "判斷一段文字是否與規則運算式相匹配。", m: [2, 2], p: [{ name: "text", detail: "要用規則運算式測試的文字。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "用來測試文字的規則運算式。", example: '"S.r"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REGEXREPLACE", t: 12, d: "使用規則運算式將文字字串中的一部分替換為其他文字字串。", a: "使用規則運算式將文字字串中的一部分替換為其他文字字串。", m: [3, 3], p: [{ name: "text", detail: "要對其局部進行替換操作的文字。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "regular_expression", detail: "規則運算式。text中所有匹配的實例都將被替換。", example: '"S.*d"', require: "m", repeat: "n", type: "rangeall" }, { name: "replacement", detail: "要插入到原有文字中的文字。", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "T", t: 12, d: "返回文本格式的字串參數。", a: "返回文本格式的字串參數。", m: [1, 1], p: [{ name: "value", detail: "要轉換為文字的參數。\n\n如果值為文字,T將返回值本身。\n\n如果值為指向包含文字的儲存格的引用,T將返回值中的內容。\n\n如果值為錯誤值或包含錯誤值的儲存格,T將返回該錯誤值。\n\n對於所有其他情况,T將返回空串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "FIXED", t: 12, d: "以固定的小數位數設定數位的格式。", a: "以固定的小數位數設定數位的格式。", m: [1, 3], p: [{ name: "number", detail: "要進行舍入並轉換為文字的數位。", example: "3.141592653", require: "m", repeat: "n", type: "rangenumber" }, { name: "decimals", detail: "[可選-預設值為2] - 結果中要顯示的小數位數。\n\n如果數值的有效位數小於小數位數,將以零填充。如果數值的有效位數大於小數位數,則將其舍入到所需的小數位數而不是將其截斷。", example: "2", require: "o", repeat: "n", type: "rangenumber" }, { name: "no_commas", detail: "[可選-預設值為FALSE()] - 一個邏輯值,如果為TRUE(),則會禁止FIXED在返回的文字中包含逗號。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FIND", t: 12, d: "返回字串在文字中首次出現的位置(區分大小寫)。", a: "返回字串在文字中首次出現的位置(區分大小寫)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要蒐索的文字中查找的字串。", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中蒐索蒐索字串的首次出現位置的文字。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[可選-預設值為1] - 要在要蒐索的文字中開始蒐索的字元位置。", example: "14", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "FINDB", t: 12, d: "返回某個字串在文字中首次出現的位置(每個雙位元組字元占兩個位置)。", a: "返回某個字串在文字中首次出現的位置(每個雙位元組字元占兩個位置)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要蒐索的文字中查找的字串。", example: '"新"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中蒐索蒐索字串的首次出現位置的文字。", example: '"農曆新年"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[可選-預設值為1] - 要在要蒐索的文字中開始蒐索的字元位置。", example: "2", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "JOIN", t: 12, d: "將一個或多個使用指定定界符的一維數組的元素連接到一起。", a: "將一個或多個使用指定定界符的一維數組的元素連接到一起。", m: [2, 255], p: [{ name: "separator", detail: "置於相互連接的值之間的字元或字串。\n\n定界符可以為空,例如JOIN,{1,2,3})。", example: '"and-a"', require: "m", repeat: "n", type: "rangeall" }, { name: "array1", detail: "要使用定界符連接的一個或多個值。", example: "{1", require: "m", repeat: "n", type: "rangeall" }, { name: "array2,…", detail: "[可選] - 要使用定界符連接的其他值或數組。", example: "2", require: "o", repeat: "y", type: "rangeall" }] }, { n: "LEFT", t: 12, d: "從文字字串的第一個字元開始返回指定個數的字元。", a: "從文字字串的第一個字元開始返回指定個數的字元。", m: [1, 2], p: [{ name: "text", detail: "包含要選取的字元的文字字串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "num_chars", detail: "[可選-預設值為1] - 指定要由LEFT選取的字元的數量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "RIGHT", t: 12, d: "根據所指定的字元數返回文字字串中最後一個或多個字元。", a: "根據所指定的字元數返回文字字串中最後一個或多個字元。", m: [1, 2], p: [{ name: "text", detail: "包含要選取的字元的文字字串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "num_chars", detail: "[可選-預設值為1] - 指定要由RIGHT選取的字元的數量。", example: "2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MID", t: 12, d: "返回文字字串中從指定位置開始的特定數目的字元。", a: "返回文字字串中從指定位置開始的特定數目的字元。", m: [3, 3], p: [{ name: "text", detail: "包含要選取的字元的文字字串。", example: '"get this"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "要從字串中開始選取的位置。字串中第一個字元的索引為1。", example: "5", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_chars", detail: "指定要由MID選取的字元的數量。\n\n如果選取的字元數尚不足選取長度個字元時就到達了字串尾部,則MID返回從開始位置到字串尾部的字元。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "LEN", t: 12, d: "返回給定字串的長度。", a: "返回給定字串的長度。", m: [1, 1], p: [{ name: "text", detail: "要返回其長度的字串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LENB", t: 12, d: "返回文字中所包含的字元數。與雙位元組字元集(DBCS)一起使用。", a: "返回文字中所包含的字元數。與雙位元組字元集(DBCS)一起使用。", m: [1, 1], p: [{ name: "text", detail: "要返回其位元組數的字串。(一個漢字為兩個位元組數)", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LOWER", t: 12, d: "將指定字串中的字母轉換為小寫。", a: "將指定字串中的字母轉換為小寫。", m: [1, 1], p: [{ name: "text", detail: "要轉換為小寫的字串。", example: '"LOREM IPSUM"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "UPPER", t: 12, d: "將指定字串中的字母轉換為大寫。", a: "將指定字串中的字母轉換為大寫。", m: [1, 1], p: [{ name: "text", detail: "要轉換為大寫的字串。", example: '"lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "EXACT", t: 12, d: "比較兩個字串是否相同。", a: "比較兩個字串是否相同。", m: [2, 2], p: [{ name: "text1", detail: "要比較的第一個字串。", example: "A1", require: "m", repeat: "n", type: "rangeall" }, { name: "text2", detail: "要比較的第二個字串。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPLACE", t: 12, d: "將文字字串的一部分替換為其他文字字串。", a: "將文字字串的一部分替換為其他文字字串。", m: [4, 4], p: [{ name: "old_text", detail: "要對其局部進行替換操作的文字。", example: '"Spreadsheets"', require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "開始進行替換操作的位置(文字開頭位置為1)。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "num_chars", detail: "要在文字中替換的字元個數。", example: "6", require: "m", repeat: "n", type: "rangenumber" }, { name: "new_text", detail: "要插入到原有文字中的文字。", example: '"Bed"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "REPT", t: 12, d: "返回指定文字的多次重複。", a: "返回指定文字的多次重複。", m: [2, 2], p: [{ name: "text", detail: "要重複的字元或字串。", example: '"ha"', require: "m", repeat: "n", type: "rangeall" }, { name: "number_times", detail: "要重複的文字要在返回值中出現的次數。\n\n最大重複次數為100。即使重複次數大於100,REPT也僅將相應文字重複100次。", example: "4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SEARCH", t: 12, d: "返回字串在文字中首次出現的位置(不區分大小寫)。", a: "返回字串在文字中首次出現的位置(不區分大小寫)。", m: [2, 3], p: [{ name: "find_text", detail: "要在要蒐索的文字中查找的字串。", example: '"n"', require: "m", repeat: "n", type: "rangeall" }, { name: "within_text", detail: "要在其中蒐索蒐索字串的首次出現位置的文字。", example: "A2", require: "m", repeat: "n", type: "rangeall" }, { name: "start_num", detail: "[可選-預設值為1 ] - 要在要蒐索的文字中開始蒐索的字元位置。", example: "14", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUBSTITUTE", t: 12, d: "在文字字串中用new_text替換old_text。", a: "在文字字串中用new_text替換old_text。", m: [3, 4], p: [{ name: "text", detail: "需要替換其中字元的文字,或對含有文字(需要替換其中字元)的儲存格的引用。", example: '"search for it"', require: "m", repeat: "n", type: "rangeall" }, { name: "old_text", detail: "需要替換的文字。", example: '"search for"', require: "m", repeat: "n", type: "rangeall" }, { name: "new_text", detail: "用於替換old_text的文字。", example: '"Google"', require: "m", repeat: "n", type: "rangeall" }, { name: "instance_num", detail: "[可選] - 指定要用new_text替換old_text的事件。如果指定了instance_num,則只有滿足要求的old_text被替換。否則,文字中出現的所有old_text都會更改為new_text。", example: "3", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "CLEAN", t: 12, d: "移除文字中的不可列印ASCII字元後將其返回。", a: "移除文字中的不可列印ASCII字元後將其返回。", m: [1, 1], p: [{ name: "text", detail: "要移除其中不可列印字元的文字。", example: '"AF"&amp;CHAR31', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TEXT", t: 12, d: "按照指定格式將數位轉換為文字。", a: "按照指定格式將數位轉換為文字。", m: [2, 2], p: [{ name: "value", detail: "要設定格式的數位、日期或時間。", example: "1.23", require: "m", repeat: "n", type: "rangenumber" }, { name: "format_text", detail: '以括弧括起來的模式串,將按該模式設定數位的格式。\n\n0表示在數值位數少於格式指定的位數時必定以零填充。例如,TEXT12.3,“000.00")將返回012.30。當數值的小數位數超過模式指定的小數位數時,四捨五入為指定的小數位數。例如,TEXT12.305,“00.00")將返回12.31。\n\n#類似於0,但並不是在小數點的兩側都以零填充。例如,TEXT12.3,“###.##")將返回12.3。', example: '"$0.00"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "TRIM", t: 12, d: "删除指定字串前後的空格。", a: "删除指定字串前後的空格。", m: [1, 1], p: [{ name: "text", detail: "要修剪的字串或指向包含該字串的儲存格的引用。", example: '"lorem ipsum"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "VALUE", t: 12, d: "將可識別的任何日期、時間或數位格式的字串轉換為數位。", a: "將可識別的任何日期、時間或數位格式的字串轉換為數位。", m: [1, 1], p: [{ name: "text", detail: "包含要轉換的值的字串。", example: '"123"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "PROPER", t: 12, d: "將指定字串中每個單詞的首字母轉為大寫。", a: "將指定字串中每個單詞的首字母轉為大寫。", m: [1, 1], p: [{ name: "text", detail: "要轉換的文字,其中每個單詞的首字母都將轉為大寫,所有其他字母則轉為小寫。", example: '"united states"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "CONVERT", t: 13, d: "將數位從一種度量系統轉換為另一種度量系統。", a: "將數位從一種度量系統轉換為另一種度量系統。", m: [3, 3], p: [{ name: "number", detail: "是以from_unit為組織的需要進行轉換的數值。", example: "5.1", require: "m", repeat: "n", type: "rangenumber" }, { name: "from_unit", detail: "是數值的組織。", example: '"g"', require: "m", repeat: "n", type: "rangeall" }, { name: "to_unit", detail: "是結果的組織。", example: '"kg"', require: "m", repeat: "n", type: "rangeall" }] }, { n: "SUMX2MY2", t: 14, d: "返回兩數組中對應數值的平方差之和。", a: "返回兩數組中對應數值的平方差之和。", m: [2, 2], p: [{ name: "array_x", detail: "第一個數組或數值區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二個數組或數值區域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMX2PY2", t: 14, d: "返回兩數組中對應數值的平方和之和。", a: "返回兩數組中對應數值的平方和之和。", m: [2, 2], p: [{ name: "array_x", detail: "第一個數組或數值區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二個數組或數值區域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMXMY2", t: 14, d: "返回兩數組中對應數值之差的平方和。", a: "返回兩數組中對應數值之差的平方和。", m: [2, 2], p: [{ name: "array_x", detail: "第一個數組或數值區域。", example: "A2:A100", require: "m", repeat: "n", type: "rangenumber" }, { name: "array_y", detail: "第二個數組或數值區域。", example: "B2:B100", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TRANSPOSE", t: 14, d: "將數組或儲存格範圍的行列轉置。", a: "將數組或儲存格範圍的行列轉置。", m: [1, 1], p: [{ name: "array", detail: "要將其行列互換的數組或範圍。", example: "{1,2}", require: "m", repeat: "n", type: "range" }] }, { n: "TREND", t: 14, d: "返回線性趨勢值。", a: "返回線性趨勢值。", m: [1, 4], p: [{ name: "known_y", detail: "關係運算式y = mx + b 中已知的y值集合。\n\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可選-默認該數組為{1,2,3,…},其大小與known_y相同] -關係運算式y = mx + b 中已知的可選x值集合。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_x", detail: "[可選 - 默認與known_x相同] - 需要函數TREND返回對應y值的新x值。", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可選 - 預設值為TRUE()] - 一個邏輯值,用於指定是否將常數b強制設為0。\n\nTRUE()表示b將按正常計算;\n\nFALSE()表示b將被設為0(零),m 將被調整以使y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FREQUENCY", t: 14, d: "計算數值在某個區域內的出現頻率,然後返回一個垂直數組。", a: "計算數值在某個區域內的出現頻率,然後返回一個垂直數組。", m: [2, 2], p: [{ name: "data_array", detail: "要對其頻率進行計數的一組數值或對這組數值的引用。", example: "A2:A40", require: "m", repeat: "n", type: "rangenumber" }, { name: "bins_array", detail: "要將data_array中的值插入到的間隔數組或對間隔的引用。\n\n為清晰起見,應將類別排序,但如果未排序,FREQUENCY會在內部對這些指定的值進行排序並返回正確結果。", example: "B2:B5", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "GROWTH", t: 14, d: "使用現有數據計算預測的指數等比。", a: "使用現有數據計算預測的指數等比。", m: [1, 4], p: [{ name: "known_y", detail: "關係運算式y = b*m^x 中已知的y值集合。\n\n如果已知數據_y為二維陣列或範圍,則已知數據_x的維數必須與之相同,或者省略此參數。\n\n如果已知數據_y為一維數組或範圍,已知數據_x則可代表二維陣列或範圍中的多個引數。也就是說,如果已知數據_y為單行,則將已知數據_x中的每行解釋為各自獨立的值,類似情况也適用於已知數據_y為單列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = b*m^x 中已知的可選x值集合。\n\n如果已知數據_y為一維數組或範圍,已知數據_x則可代表二維陣列或範圍中的多個引數。也就是說,如果已知數據_y為單行,則將已知數據_x中的每行解釋為各自獨立的值,類似情况也適用於已知數據_y為單列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "new_x", detail: "[可選 - 默認與known_x相同] - 需要函數GROWTH返回對應y值的新x值。", example: "A11:A13", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可選 - 預設值為TRUE()] - 一個邏輯值,用於指定是否將常數b強制設為1。\n\nTRUE()表示b將按正常計算;\n\nFALSE()表示b將被設為1,m將被調整以使y = m^x。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LINEST", t: 14, d: "可通過使用最小二乘法計算與現有數據最佳擬合的直線,來計算某直線的統計值,然後返回描述此直線的數組。", a: "可通過使用最小二乘法計算與現有數據最佳擬合的直線,來計算某直線的統計值,然後返回描述此直線的數組。", m: [1, 4], p: [{ name: "known_y", detail: "關係運算式y = mx + b 中已知的y值集合。\n\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = mx + b中已知的可選x值集合。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可選 - 預設值為TRUE()] - 一個邏輯值,用於指定是否將常數b強制設為0。\n\nTRUE()表示b將按正常計算;\n\nFALSE()表示b將被設為0(零),m將被調整以使y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "stats", detail: "[可選 - 預設值為FALSE()] - 一個邏輯值,用於指定是否返回附加回歸統計值。\n\n如果詳細為TRUE,除了對應於每個引數的一組線性係數和y截距之外,LINEST還返回以下資訊:\n\n每項係數和截距的標準誤差、\n\n限定係數(介於0和1之間,1表示完全相關)、\n\n因變數值的標准誤差、\n\nF統計或F觀測值,訓示所觀測到的因變數和引數變數之間的關係是隨機的還是線性的、\n\n自由度,用於在參照錶中查找F統計值以估算可信度、\n\n回歸平方和,以及\n\n殘差平方和。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "LOGEST", t: 14, d: "在回歸分析中,計算最符合數據的指數回歸擬合曲線,並返回描述該曲線的數值數組。", a: "在回歸分析中,計算最符合數據的指數回歸擬合曲線,並返回描述該曲線的數值數組。", m: [1, 4], p: [{ name: "known_y", detail: "關係運算式y = mx + b 中已知的y值集合。\n\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "B2:B10", require: "m", repeat: "n", type: "rangenumber" }, { name: "known_x", detail: "[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = mx + b中已知的可選x值集合。\n\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。", example: "A2:A10", require: "o", repeat: "n", type: "rangenumber" }, { name: "const", detail: "[可選 - 預設值為TRUE()] - 一個邏輯值,用於指定是否將常數b強制設為0。\n\nTRUE()表示b將按正常計算;\n\nFALSE()表示b將被設為0(零),m將被調整以使y = mx。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "stats", detail: "[可選 - 預設值為FALSE()] - 一個邏輯值,用於指定是否返回附加回歸統計值。\n\n如果詳細為TRUE,則除了為每個引數和係數b返回一組指數值之外,LOGEST還將返回以下數據:\n\n每項指數和係數的標準誤差、\n\n限定係數(介於0和1之間,1表示完全相關)、\n\n因變數值的標准誤差、\n\nF統計或F觀測值,訓示所觀測到的因變數和引數之間的關係是隨機的還是指數的、\n\n自由度-用於在參照錶中查找F統計值以估算可信度、\n\n回歸平方和,以及\n\n殘差平方和。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "MDETERM", t: 14, d: "返回一個數組的矩陣行列式的值。", a: "返回一個數組的矩陣行列式的值。", m: [1, 1], p: [{ name: "array", detail: "行數和列數相等的數值數組。", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MINVERSE", t: 14, d: "返回數組中存儲的矩陣的逆矩陣。", a: "返回數組中存儲的矩陣的逆矩陣。", m: [1, 1], p: [{ name: "array", detail: "行數和列數相等的數值數組。", example: "A1:D4", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "MMULT", t: 14, d: "返回兩個數組的矩陣乘積。結果矩陣的行數與array1的行數相同,矩陣的列數與array2的列數相同。", a: "返回兩個數組的矩陣乘積。結果矩陣的行數與array1的行數相同,矩陣的列數與array2的列數相同。", m: [2, 2], p: [{ name: "array1", detail: "要進行矩陣乘法運算的第一個矩陣數組。\n\narray1列數必須與array2的行數相同", example: "A1:B3", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "要進行矩陣乘法運算的第二個矩陣數組。\n\narray2的行數必須與array1列數相同", example: "C1:F2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "SUMPRODUCT", t: 14, d: "在給定的幾組數組中,將數組間對應的元素相乘,並返回乘積之和。", a: "在給定的幾組數組中,將數組間對應的元素相乘,並返回乘積之和。", m: [1, 255], p: [{ name: "array1", detail: "其相應元素需要進行相乘並求和的第一個數組參數。", example: "A2:C5", require: "m", repeat: "n", type: "rangenumber" }, { name: "array2", detail: "[可選] - 其相應元素需要進行相乘並求和的其它數組參數。", example: "D2:F5", require: "o", repeat: "y", type: "rangenumber" }] }, { n: "ISFORMULA", t: 15, d: "檢查公式是否位於引用的儲存格中。", a: "檢查公式是否位於引用的儲存格中。", m: [1, 1], p: [{ name: "cell", detail: "要檢查是否存在公式的儲存格。\n\n如果 cell 為包含公式的儲存格,則 ISFORMULA 將返回TRUE。如果 cell 為相應儲存格範圍,則當該範圍內的首個儲存格包含公式時,系統會返回TRUE。如果是任何其他值,系統都將返回FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "CELL", t: 15, d: "返回有關儲存格的格式、位置或內容的資訊。", a: "返回有關儲存格的格式、位置或內容的資訊。", m: [2, 2], p: [{ name: "info_type", detail: "一個文字值,指定要返回的儲存格資訊的類型。", example: '"type"', require: "m", repeat: "n", type: "rangeall" }, { name: "reference", detail: "需要其相關資訊的儲存格。", example: "C2", require: "m", repeat: "n", type: "range" }] }, { n: "NA", t: 15, d: "返回錯誤值#N/A。", a: "返回錯誤值#N/A。", m: [0, 0], p: [] }, { n: "ERROR_TYPE", t: 15, d: "返回與其他儲存格中的錯誤值相對應的數位。", a: "返回與其他儲存格中的錯誤值相對應的數位。", m: [1, 1], p: [{ name: "error_val", detail: "用於查找錯誤號的儲存格,雖然您也可以直接提供錯誤值。", example: "A3", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISBLANK", t: 15, d: "檢查所引用的儲存格是否為空。", a: "檢查所引用的儲存格是否為空。", m: [1, 1], p: [{ name: "value", detail: "對要檢查其是否為空的儲存格的引用。\n\n如果是空儲存格,則TRUE;否則返回FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISERR", t: 15, d: "檢查某個值是否為#N/A以外的錯誤值。", a: "檢查某個值是否為#N/A以外的錯誤值。", m: [1, 1], p: [{ name: "value", detail: "要驗證其是否為#N/A以外的錯誤類型的值。\n\n如果值是除#N/A之外的任何錯誤(包括#DIV/0!、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!),ISERR將返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISERROR", t: 15, d: "檢查某個值是否為錯誤值。", a: "檢查某個值是否為錯誤值。", m: [1, 1], p: [{ name: "value", detail: "要驗證其是否為錯誤類型的值。\n\n只要值是某種錯誤值(包括#DIV/0!、#N/A、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!),ISERROR就會返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISLOGICAL", t: 15, d: "檢查某個值是TRUE還是FALSE。", a: "檢查某個值是TRUE還是FALSE。", m: [1, 1], p: [{ name: "value", detail: "要驗證其為邏輯 TRUE 還是邏輯 FALSE 的值。\n\n*如果值為TRUE或FALSE,或為指向值為TRUE或FALSE的儲存格的引用,ISLOGICAL將返回TRUE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNA", t: 15, d: "檢查某個值是否為錯誤值#N/A。", a: "檢查某個值是否為錯誤值#N/A。", m: [1, 1], p: [{ name: "value", detail: "要與錯誤值#N/A進行比較的值。\n\n*如果值為#N/A或指向包含#N/A的儲存格的引用,則ISNA將返回TRUE,否則返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNONTEXT", t: 15, d: "檢查某個值是否為非文字。", a: "檢查某個值是否為非文字。", m: [1, 1], p: [{ name: "value", detail: "要檢查的文字。\n\n*如果參數為文字值或指向包含文字的儲存格的引用,ISNONTEXT將返回FALSE,否則返回TRUE。\n\n當值為指向空儲存格的引用時,ISNONTEXT會返回TRUE。\n\n當值為空字串時,ISNONTEXT將返回FALSE,因為空串被視作文字。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISNUMBER", t: 15, d: "檢查某個值是否為數位。", a: "檢查某個值是否為數位。", m: [1, 1], p: [{ name: "value", detail: "要驗證其是否為數位的值。\n\n*如果參數為數位或指向內容為數位值的儲存格的引用,ISNUMBER將返回TRUE,否則返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISREF", t: 15, d: "檢查某個值是否為有效的儲存格引用。", a: "檢查某個值是否為有效的儲存格引用。", m: [1, 1], p: [{ name: "value", detail: "要驗證其是否為儲存格引用的值。\n\n*如果參數是有效的儲存格引用,ISREF將返回TRUE,否則返回FALSE。", example: "A2", require: "m", repeat: "n", type: "range" }] }, { n: "ISTEXT", t: 15, d: "檢查某個值是否為文字。", a: "檢查某個值是否為文字。", m: [1, 1], p: [{ name: "value", detail: "要驗證其是否為文字的值。\n\n如果參數為文字值或指向包含文字值的儲存格的引用,ISTEXT將返回TRUE,否則返回FALSE。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TYPE", t: 15, d: "返回數值的類型。", a: "返回數值的類型。", m: [1, 1], p: [{ name: "value", detail: "要確定其類型的數據。\n\n數位返回1;\n\n文字返回2;\n\n邏輯值返回4;\n\n錯誤值返回16\n\n數組返回64", example: "C4", require: "m", repeat: "n", type: "rangeall" }] }, { n: "N", t: 15, d: "返回轉化為數值後的值。", a: "返回轉化為數值後的值。", m: [1, 1], p: [{ name: "value", detail: "要轉換為數位的參數。\n\n如果值為數位,則返回該數位。\n\n如果值為日期,則返回該日期的序號。\n\n如果值為TRUE,則返回1。\n\n如果值為FALSE,則返回0。\n\n如果值為錯誤值,則返回錯誤值。\n\n如果值為其他值,則返回0。", example: "A2", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DATE", t: 16, d: "將指定的數位轉換為日期。", a: "將指定的數位轉換為日期。", m: [1, 1], p: [{ name: "value", detail: "要轉換為日期的參數或其儲存格引用。\n\n如果值為數位或指向內容為數值的儲存格的引用,TO_DATE會將值轉換為相應的日期並返回,值代表從十二月30日到對應的日期之間的天數,\n\n負值表示對應的日期在十二月30日之前,而小數值則代表一天中從午夜算起的時間。\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_DATE將在不做任何修改的情况下返回值。", example: "25405", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PURE_NUMBER", t: 16, d: "將給定的日期/時間、百分比、貨幣金額或其他格式的數值轉換為不帶格式的純數位。", a: "將給定的日期/時間、百分比、貨幣金額或其他格式的數值轉換為不帶格式的純數位。", m: [1, 1], p: [{ name: "value", detail: "要轉換為純數位的參數或其儲存格引用。\n\n如果值為數位或指向包含數值的儲存格的引用,TO_PURE_NUMBER將以不帶任何格式與解釋的形式返回值。\n\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_PERCENT將在不做任何修改的情况下返回值。", example: "50%", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_TEXT", t: 16, d: "將給定的數位值轉換為文本格式。", a: "將給定的數位值轉換為文本格式。", m: [1, 1], p: [{ name: "value", detail: "要轉換為文字的參數或其儲存格引用。\n\n如果值為數位或指向包含數值的儲存格的引用,TO_TEXT將返回字串形式的值,並保持現有格式。即原為貨幣的仍為貨幣,原為十進位數的仍為十進位數,原為百分比的仍為百分比,原為日期的仍為日期。\n\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_TEXT將在不做任何修改的情况下返回值。", example: "24", require: "m", repeat: "n", type: "rangeall" }] }, { n: "TO_DOLLARS", t: 16, d: "將指定的數位轉換為美元金額。", a: "將指定的數位轉換為美元金額。", m: [1, 1], p: [{ name: "value", detail: "要轉換為美元金額的參數或其儲存格引用。\n\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_DOLLARS將在不做任何修改的情况下返回值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "TO_PERCENT", t: 16, d: "將指定的數位轉換為百分比。", a: "將指定的數位轉換為百分比。", m: [1, 1], p: [{ name: "value", detail: "要轉換為百分比的參數或其儲存格引用。\n\n如果值為數位或指向包含數值的儲存格的引用,TO_PERCENT會以1 = 100%為標準,將值轉換為百分比。\n\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_PERCENT將在不做任何修改的情况下返回值。", example: "A2", require: "m", repeat: "n", type: "rangenumber" }] }, { n: "DGET", t: 17, d: "使用SQL式査詢,從清單或資料庫的列中選取符合指定條件的單個值。", a: "使用SQL式査詢,從清單或資料庫的列中選取符合指定條件的單個值。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMAX", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的最大數位。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的最大數位。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DMIN", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的最小數位。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的最小數位。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DAVERAGE", t: 17, d: "使用SQL式査詢,對清單或資料庫中滿足指定條件的記錄欄位(列)中的數值求平均值。", a: "使用SQL式査詢,對清單或資料庫中滿足指定條件的記錄欄位(列)中的數值求平均值。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNT", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中包含數位的儲存格的個數。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中包含數位的儲存格的個數。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DCOUNTA", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的非空儲存格的個數。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的非空儲存格的個數。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DPRODUCT", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的數值的乘積。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的數值的乘積。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEV", t: 17, d: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為一個樣本估算出的總體標準差。", a: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為一個樣本估算出的總體標準差。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSTDEVP", t: 17, d: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為樣本總體計算出的總體標準差。", a: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為樣本總體計算出的總體標準差。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DSUM", t: 17, d: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的數位之和。", a: "使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位(列)中的數位之和。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVAR", t: 17, d: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為一個樣本估算出的總體方差。", a: "使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位作為一個樣本估算出的總體方差。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "DVARP", t: 17, d: "使用SQL式査詢,通過使用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位計算樣本總體的樣本總體方差。", a: "使用SQL式査詢,通過使用清單或資料庫中滿足指定條件的記錄欄位(列)中的數位計算樣本總體的樣本總體方差。", m: [3, 3], p: [{ name: "database", detail: "構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。", example: "A2:F20", require: "m", repeat: "n", type: "range" }, { name: "field", detail: "指定database中的哪一列包含要選取和用於計算的值。\n\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。", example: "G2", require: "m", repeat: "n", type: "rangeall" }, { name: "criteria", detail: "包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。", example: "A22:D23", require: "m", repeat: "n", type: "range" }] }, { n: "AGE_BY_IDCARD", t: "3", d: "據中國身份證號計算出年齡。支持15位或18位身份證", a: "據中國身份證號計算出年齡", m: [1, 2], p: [{ name: "身份證號", example: "A1", detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }, { name: "截止日期", example: '"2017-10-01"', detail: "年齡計算的截止日期或範圍,默認為當日。", require: "o", repeat: "n", type: "rangedatetime" }] }, { n: "SEX_BY_IDCARD", t: "3", d: "根據中國身份證號計算出性別。支持15位或18位身份證", a: "根據身份證號得到性別。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "BIRTHDAY_BY_IDCARD", t: "3", d: "根據中國身份證號計算出生日。支持15位或18位身份證", a: "根據身份證號得到生日。", m: [1, 2], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }, { name: "生日格式", example: "0", detail: "日期類型,默認0:[1900/01/01],1:[1900-01-01],2:[1900年1月1日]", require: "o", repeat: "n", type: "rangeall" }] }, { n: "PROVINCE_BY_IDCARD", t: "3", d: "根據中國身份證號計算出籍貫的省份。支持15位或18位身份證", a: "根據身份證號得到籍貫的省份。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "CITY_BY_IDCARD", t: "3", d: "根據中國身份證號計算出籍貫的都市。支持15位或18位身份證", a: "根據身份證號得到籍貫的都市。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "STAR_BY_IDCARD", t: "3", d: "根據中國身份證號計算出星座。支持15位或18位身份證", a: "根據身份證號得到星座。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ANIMAL_BY_IDCARD", t: "3", d: "根據中國身份證號計算出生肖(鼠、牛、虎、兔…)。支持15位或18位身份證", a: "根據身份證號得到生肖。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "ISIDCARD", t: "3", d: "驗證身份證的格式是否正確。支持15位或18位身份證", a: "驗證身份證格式正確性。", m: [1, 1], p: [{ name: "身份證號", example: '"31033519900101XXXX"', detail: "15位或者18位的身份證號或範圍。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "DM_TEXT_CUTWORD", t: "4", d: "文字分詞。把一連串文字折開為一系列單獨詞語", a: "中文文字分詞。", m: [1, 2], p: [{ name: "文字", example: '"我來到北京清華大學"', detail: "任意需要分詞的文字。", require: "m", repeat: "n", type: "rangeall" }, { name: "分詞模式", example: "0", detail: "默認為0[精確模式]1[全模式]2[搜尋引擎模式]。", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TFIDF", t: "4", d: "採用tf-idf算灋進行關鍵字選取。從一連串文字中識別關鍵字", a: "tf-idf關鍵字識別。", m: [1, 3], p: [{ name: "文字", example: '"我來到北京清華大學"', detail: "任意需要分詞的文字。", require: "m", repeat: "n", type: "rangeall" }, { name: "關鍵字個數", example: "20", detail: "算灋返回的關鍵字個數,默認20", require: "o", repeat: "n", type: "rangenumber" }, { name: "語料庫", example: "1", detail: "選擇特定領域的語料庫,默認0[通用],1[金融]2[醫療]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DM_TEXT_TEXTRANK", t: "4", d: "採用TextRank算灋進行關鍵字選取。從一連串文字中識別關鍵字", a: "TextRank關鍵字識別。", m: [1, 3], p: [{ name: "文字", example: '"我來到北京清華大學"', detail: "任意需要分詞的文字。", require: "m", repeat: "n", type: "rangeall" }, { name: "關鍵字個數", example: "20", detail: "算灋返回的關鍵字個數,默認20", require: "o", repeat: "n", type: "rangenumber" }, { name: "語料庫", example: "1", detail: "選擇特定領域的語料庫,默認0[通用],1[金融]2[醫療]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_CLOSE", t: "5", d: "根據股票代碼和日期,返回A股對應股票收盤價。", a: "返回A股對應股票收盤價。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默認為最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_OPEN", t: "5", d: "根據股票代碼和日期,返回A股對應股票開盤價。", a: "返回A股對應股票開盤價。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默認為最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MAX", t: "5", d: "根據股票代碼和日期,返回A股對應股票最高價。", a: "返回A股對應股票最高價。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默認為最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_MIN", t: "5", d: "根據股票代碼和日期,返回A股對應股票最低價。", a: "返回A股對應股票最低價。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默认为最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_VOLUMN", t: "5", d: "根據股票代碼和日期,返回A股對應股票成交量。", a: "返回A股對應股票成交量。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默認為最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "DATA_CN_STOCK_AMOUNT", t: "5", d: "根據股票代碼和日期,返回A股對應股票成交額。", a: "返回A股對應股票成交額。", m: [1, 3], p: [{ name: "股票代碼", example: '"000001"', detail: "6位股票代碼,必填項。", require: "m", repeat: "n", type: "rangeall" }, { name: "日期", example: "2015-01-08", detail: "股票的交易日,默認為最新交易日", require: "o", repeat: "n", type: "rangedate" }, { name: "複權除權", example: "0", detail: "選擇股票的除權複權類型,默認0[前複權],1[原始價格]2[後複權]", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "ISDATE", t: "6", d: "驗證日期的格式是否正確。支持多種日期格式", a: "驗證日期格式正確性。", m: [1, 1], p: [{ name: "日期", example: '"1990-01-01"', detail: "日期值,例如1990/01/01, 1990年1月1日等。", require: "m", repeat: "n", type: "rangeall" }] }, { n: "LINESPLINES", t: "3", d: "生成嵌入在儲存格內的折線圖sparklines,用於描述數據的連續走勢", a: "生成儲存格折線圖", m: [1, 8], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20{1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "線條顏色", example: "#2ec7c9", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "線條粗細", example: "1", detail: "折線圖線段粗細,默認為1px", require: "o", repeat: "n", type: "rangeall" }, { name: "輔助線", example: "avg", detail: "一條橫線,可以是min、max、avg、median、範圍或自定義數值,默認0無", require: "o", repeat: "n", type: "rangeall" }, { name: "輔助線顏色", example: "#000", detail: "輔助線的顏色設定,同線條顏色配寘,默認#000", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值標識", example: "#fc5c5c", detail: "標識線圖最大值,同線條顏色配寘,默認0不顯示", require: "o", repeat: "n", type: "rangeall" }, { name: "最小值標識", example: "#fc5c5c", detail: "標識線圖最小值,同線條顏色配寘,默認0不顯示", require: "o", repeat: "n", type: "rangeall" }, { name: "標識大小", example: "1.5", detail: "最大值和最小值的標識大小設定,默認為1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "AREASPLINES", t: "3", d: "生成嵌入在儲存格內的面積圖sparklines,一般用於描述數據的連續累積值走勢", a: "生成儲存格面積圖", m: [1, 5], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20{1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "線條顏色", example: "#2ec7c9", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "填充顏色", example: "#CCF3F4", detail: "形成面積圖,同線條顏色配寘,默認0不顯示", require: "o", repeat: "n", type: "rangeall" }, { name: "線條粗細", example: "1", detail: "折線圖線段粗細,默認為1px", require: "o", repeat: "n", type: "rangeall" }, { name: "輔助線", example: "avg", detail: "一條橫線,可以是min、max、avg、median、範圍或自定義數值,默認0無", require: "o", repeat: "n", type: "rangeall" }, { name: "輔助線顏色", example: "#000", detail: "輔助線的顏色設定,同線條顏色配寘,默認#000", require: "o", repeat: "n", type: "rangeall" }] }, { n: "COLUMNSPLINES", t: "3", d: "生成嵌入在儲存格內的垂直柱狀圖sparklines,一般用於描述離散數據之間的大小情况", a: "生成儲存格垂直柱狀圖", m: [1, 6], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20{1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱條間隔", example: "1", detail: "柱條之間的間隔距離,默認為1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱條顏色", example: "#fc5c5c", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "負向柱條顏色", example: "#97b552", detail: "負向柱條顏色設定,代表負值的顏色,同柱條顏色配寘,默認#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "柱圖最大值,用於規範柱圖長度,默認為自動計算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "調色板可以單獨設定每個柱條的顏色,可設定多個,支持兩種格式:1顏色例如#000,代表第一個柱的顏色是黑色;2數值範圍:顏色,例如-2:#000表示數值為-2的柱為黑色,0:5:#000表示數值0-5的柱為黑色,默認為空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKCOLUMNSPLINES", t: "3", d: "生成嵌入在儲存格內的累積垂直柱狀圖sparklines,一般用於描述離散數據多個維度的數值大小", a: "生成儲存格累積垂直柱狀圖", m: [1, 5], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20{1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "按列堆積", example: "1", detail: "如果需要按行堆積則本項設為false或0,默認為是1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱條間隔", example: "1", detail: "柱條之間的間隔距離,默認為1", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "累積柱圖最大值,用於規範柱圖長度,默認為自動計算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "累積色板", example: "#97b552", detail: "調色板可以單獨設定每個維度的柱條顏色,可設定為A1:A10等範圍,默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BARSPLINES", t: "3", d: "生成嵌入在儲存格內的橫向條形圖sparklines,一般用於描述離散數據之間的大小情况", a: "生成儲存格橫向條形圖", m: [1, 6], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱條間隔", example: "1", detail: "柱條之間的間隔距離,默認為1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱條顏色", example: "#fc5c5c", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "負向柱條顏色", example: "#97b552", detail: "負向柱條顏色設定,代表負值的顏色,同柱條顏色配寘,默認#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "柱圖最大值,用於規範柱圖長度,默認為自動計算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "調色板可以單獨設定每個柱條的顏色,可設定多個,支持兩種格式:1顏色例如#000,代表第一個柱的顏色是黑色;2數值範圍:顏色,例如-2:#000表示數值為-2的柱為黑色,0:5:#000表示數值0-5的柱為黑色,默認為空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "STACKBARSPLINES", t: "3", d: "生成嵌入在儲存格內的累積橫向條形圖sparklines,一般用於描述離散數據多個維度的數值大小", a: "生成儲存格累積橫向條形圖", m: [1, 5], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "按列堆積", example: "1", detail: "如果需要按行堆積則本項設為false或0,默認為是1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱條間隔", example: "1", detail: "柱條之間的間隔距離,默認為1", require: "o", repeat: "n", type: "rangeall" }, { name: "最大值", example: "100", detail: "累積柱圖最大值,用於規範柱圖長度,默認為自動計算false、auto、null", require: "o", repeat: "n", type: "rangeall" }, { name: "累積色板", example: "#97b552", detail: "調色板可以單獨設定每個維度的柱條顏色,可設定為A1:A10等範圍,默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "DISCRETESPLINES", t: "3", d: "生成嵌入在儲存格內的離散圖sparklines,一般用於描述離散數據走勢", a: "生成儲存格離散圖", m: [1, 4], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "分割閾值", example: "1", detail: "離散圖柱形顏色的區分,例如:該值為0,則大於0為藍色,小於0為紅色,默認為0", require: "o", repeat: "n", type: "rangeall" }, { name: "閾值以上顏色", example: "#2ec7c9", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#2ec7c9", require: "o", repeat: "n", type: "rangeall" }, { name: "閾值以下顏色", example: "#fc5c5c", detail: "閾值以下柱條顏色設定,同閾值以上顏色,默認#fc5c5c", require: "o", repeat: "n", type: "rangeall" }] }, { n: "TRISTATESPLINES", t: "3", d: "生成嵌入在儲存格內的三態圖sparklines,一般用於描述三種態勢的走勢例如勝負平", a: "生成儲存格三態圖", m: [1, 6], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "柱條間隔", example: "1", detail: "柱條之間的間隔距離,默認為1", require: "o", repeat: "n", type: "rangeall" }, { name: "柱條顏色", example: "#fc5c5c", detail: "線圖的線條顏色,可以是否個範圍A1、色錶索引數值或者具體顏色值,設定為0或false則不顯示,支持regx、rgb、rgba等。默認#fc5c5c", require: "o", repeat: "n", type: "rangeall" }, { name: "负向柱條顏色", example: "#97b552", detail: "負向柱條顏色設定,代表負值的顏色,同柱條顏色配寘,默認#97b552", require: "o", repeat: "n", type: "rangeall" }, { name: "零值柱條顏色", example: "#999", detail: "零值柱條顏色設定,代表0值顏色,同柱條顏色配寘,默認#999", require: "o", repeat: "n", type: "rangeall" }, { name: "色板", example: "#97b552", detail: "調色板可以單獨設定每個柱條的顏色,可設定多個,支持兩種格式:1顏色例如#000,代表第一個柱的顏色是黑色;2數值範圍:顏色,例如-2:#000表示數值為-2的柱為黑色,0-5:#000表示數值0-5的柱為黑色,默認為空", require: "o", repeat: "y", type: "rangeall" }] }, { n: "PIESPLINES", t: "3", d: "生成嵌入在儲存格內的餅圖sparklines,一般用於描述數據占比", a: "生成儲存格餅圖", m: [1, 5], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "旋轉角度", example: "0", detail: "餅圖的旋轉角度,默認為0", require: "o", repeat: "n", type: "rangeall" }, { name: "餅圖邊框", example: "0", detail: "餅圖邊框大小,默認為無0", require: "o", repeat: "n", type: "rangeall" }, { name: "邊框顏色", example: "#000", detail: "餅圖邊框顏色,默認為#000", require: "o", repeat: "n", type: "rangeall" }, { name: "餅圖色板", example: "#97b552", detail: "調色板可以設定切片的顏色,可設定為A1:A10等範圍,默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...", require: "o", repeat: "y", type: "rangeall" }] }, { n: "BOXSPLINES", t: "3", d: "生成嵌入在儲存格內的箱線圖sparklines,一般用於描述數據集的統計分佈", a: "生成儲存格箱線圖", m: [1, 4], p: [{ name: "數據範圍", example: "A1:A20", detail: "數據範圍,數值才能被有效計算,例如A1:A20, {1,2,3,4,5}等。", require: "m", repeat: "n", type: "rangeall" }, { name: "離群點比例", example: "1.5", detail: "離群點的閾值範圍,如果為0或false則不顯示,默認為1.5倍", require: "o", repeat: "n", type: "rangeall" }, { name: "目標點值", example: "10", detail: "箱線圖上的目標值設定,默認為false不顯示", require: "o", repeat: "n", type: "rangeall" }, { name: "數據點大小", example: "1.5", detail: "目標點和離群點的半徑大小設定,默認為1.5", require: "o", repeat: "n", type: "rangeall" }] }, { n: "BULLETSPLINES", t: "3", d: "生成嵌入在儲存格內的子彈圖sparklines,一般用於描述任務達成率", a: "生成儲存格子彈圖", m: [2, 3], p: [{ name: "目標", example: "10", detail: "達成的目標值,數值才能被有效計算,例如A1,100等。", require: "m", repeat: "n", type: "rangeall" }, { name: "實際完成", example: "8", detail: "現時完成值,數值才能被有效計算,例如A1,100等。", require: "m", repeat: "n", type: "rangeall" }, { name: "對比值", example: "12", detail: "對比值,例如超額、最低、獲獎底線等,數值才能被有效計算,例如A1,100等。可以設定最多9個對比值", require: "o", repeat: "y", type: "rangeall" }] }, { n: "COMPOSESPLINES", t: "3", d: "支持多個類型的圖畫在同一個儲存格,每個參數代表一個sparklines圖", a: "組合sparklines圖到一個儲存格", m: [1, 1], p: [{ name: "圖設定", example: "PIESPLINES(A1:A20)", detail: "sparklines圖設定,例如A1:A20,一個完成的餅圖、線圖設定等。", require: "m", repeat: "y", type: "rangeall" }] }, { n: "SORT", t: "14", d: "返回數組中元素的排序數組。返回的數組與提供的數組參數形狀相同。", a: "返回數組中元素的排序數組。返回的數組與提供的數組參數形狀相同。", m: [1, 4], p: [{ name: "array", detail: "要排序的範圍或數組。", example: "A2:A17", require: "m", repeat: "n", type: "rangenumber" }, { name: "sort_index", detail: "[可選] - 表示要排序的行或列的數位。(默認row1/col1", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "sort_order", detail: "[可選] - 表示所需排序順序的數位;1表示昇冪(默認),-1表示降序。", example: "-1", require: "o", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[可選] - 表示所需排序方向的邏輯值;按行排序為FALSE()(默認),按列排序為TRUE()。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "FILTER", t: "14", d: "基於一個布林(真/假)數組過濾一個數組。", a: "基於一個布林(真/假)數組過濾一個數組。", m: [2, 3], p: [{ name: "array", detail: "要篩選的數組或範圍。", example: "A5:D20", require: "m", repeat: "n", type: "range" }, { name: "include", detail: "布林數組,其高度或寬度與數組相同", example: "1", require: "m", repeat: "n", type: "range" }, { name: "if_empty", detail: "[可選] - 如果包含數組中的所有值都為空(filter不返回任何值),則返回的值。", example: '""', require: "o", repeat: "n", type: "rangeall" }] }, { n: "UNIQUE", t: "14", d: "返回列表或區域中的唯一值的清單。", a: "返回列表或區域中的唯一值的清單。", m: [1, 3], p: [{ name: "array", detail: "從其返回唯一值的數組或區域。", example: "A2:B26", require: "m", repeat: "n", type: "rangenumber" }, { name: "by_col", detail: "[可選] - 邏輯值,訓示如何比較;按行= FALSE()或省略;按列= TRUE()。", example: "TRUE()", require: "o", repeat: "n", type: "rangeall" }, { name: "occurs_once", detail: "[可選] - 邏輯值,僅返回唯一值中出現一次= TRUE();包括所有唯一值= FALSE()或省略。", example: "FALSE()", require: "o", repeat: "n", type: "rangeall" }] }, { n: "RANDARRAY", t: "14", d: "返回0到1之間的隨機數位數組。", a: "返回0到1之間的隨機數位數組", m: [0, 2], p: [{ name: "rows", detail: "[可選] - 要返回的行數。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "[可選] - 要返回的列數。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "SEQUENCE", t: "14", d: "生成數位序列的清單。", a: "生成數位序列的清單。", m: [1, 4], p: [{ name: "rows", detail: "要返回的行數。", example: "1", require: "m", repeat: "n", type: "rangenumber" }, { name: "cols", detail: "[可選] - 要返回的列數。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "start", detail: "[可選] - 序列中的第一個數位。", example: "1", require: "o", repeat: "n", type: "rangenumber" }, { name: "step", detail: "[可選] -序列中每個序列值的增量。", example: "1", require: "o", repeat: "n", type: "rangenumber" }] }, { n: "EVALUATE", t: "3", d: "對以文字表示的公式或者表達式求值,並返回結果。", a: "根據文字公式或者表達式求值。", m: [1, 1], p: [{ name: "公式", example: '"A1+5*2^2"', detail: "公式或表達式", require: "m", repeat: "n", type: "rangeall" }] }], toolbar: { undo: "撤銷", redo: "重做", paintFormat: "格式刷", currencyFormat: "貨幣格式", percentageFormat: "百分比格式", numberDecrease: "减少小數位數", numberIncrease: "新增小數位數", moreFormats: "更多格式", font: "字體", fontSize: "字型大小", bold: "粗體(Ctrl+B", italic: "斜體(Ctrl+I", strikethrough: "删除線(Alt+Shift+5", underline: "底線", textColor: "文字顏色", chooseColor: "顏色選擇", resetColor: "重置顏色", customColor: "自定義", alternatingColors: "交替顏色", confirmColor: "確定顏色", cancelColor: "取消", collapse: "收起", fillColor: "儲存格顏色", border: "邊框", borderStyle: "邊框類型", mergeCell: "合併儲存格", chooseMergeType: "選擇合併類型", horizontalAlign: "水准對齊", verticalAlign: "垂直對齊", alignment: "對齊管道", textWrap: "文字換行", textWrapMode: "換行管道", textRotate: "文字旋轉", textRotateMode: "旋轉管道", freezeTopRow: "凍結首行", sortAndFilter: "排序和篩選", findAndReplace: "查找替換", sum: "求和", autoSum: "自動求和", moreFunction: "更多函數", conditionalFormat: "條件格式", postil: "批註", pivotTable: "數據透視錶", chart: "圖表", screenshot: "截圖", splitColumn: "分列", insertImage: "插入圖片", insertLink: "插入連結", dataVerification: "數據驗證", protection: "保護工作表內容", clearText: "清除顏色選擇", noColorSelectedText: "沒有顏色被選擇", toolMore: "更多", toolLess: "少於", toolClose: "收起", toolMoreTip: "更多功能", moreOptions: "更多選項", cellFormat: "設定儲存格格式", print: "列印" }, alternatingColors: { applyRange: "應用範圍", selectRange: "選擇應用範圍", header: "頁眉", footer: "頁腳", errorInfo: "不能對多重選擇區域執行此操作,請選擇單個區域,然後再試", textTitle: "格式樣式", custom: "自定義", close: "關閉", selectionTextColor: "選擇文字顏色", selectionCellColor: "選擇儲存格顏色", removeColor: "移除交替顏色", colorShow: "顏色", currentColor: "當前顏色", tipSelectRange: "請選擇交替顏色應用範圍", errorNoRange: "您選擇的應用範圍不是選區!", errorExistColors: "您選擇的應用範圍已存在交替顏色且不屬於你要編輯的應用範圍!" }, button: { confirm: "確定", cancel: "取消", close: "關閉", update: "Update", delete: "Delete", insert: "新建" }, paint: { start: "格式刷開啟", end: "ESC鍵退出", tipSelectRange: "請選擇需要複製格式的區域", tipNotMulti: "無法對多重選擇區域執行此操作" }, format: { moreCurrency: "更多貨幣格式", moreDateTime: "更多日期與時間格式", moreNumber: "更多數位格式", titleCurrency: "貨幣格式", decimalPlaces: "小數位數", titleDateTime: "日期與時間格式", titleNumber: "數位格式" }, info: { detailUpdate: "新打開", detailSave: "已恢復本地緩存", row: "行", column: "列", loading: "渲染中", copy: "副本", return: "返回", rename: "重命名", tips: "表格重命名", noName: "無標題的試算表", wait: "待更新", add: "添加", addLast: "在底部添加", backTop: "回到頂部", pageInfo: "共${total}條,${totalPage}頁,當前已顯示${currentPage}頁", nextPage: "下一頁", tipInputNumber: "請輸入數位", tipInputNumberLimit: "新增範圍限制在1-100", tipRowHeightLimit: "行高必須在0 ~ 545之間", tipColumnWidthLimit: "列寬必須在0 ~ 2038之間", pageInfoFull: "共${total}條,${totalPage}頁,已顯示全部數據" }, currencyDetail: { RMB: "人民幣", USdollar: "美元", EUR: "歐元", GBP: "英鎊", HK: "港元", JPY: "日元", AlbanianLek: "阿爾巴尼亞列克", AlgerianDinar: "阿爾及利亞第納爾", Afghani: "阿富汗尼", ArgentinePeso: "阿根廷比索", UnitedArabEmiratesDirham: "阿拉伯聯合大公國迪拉姆", ArubanFlorin: "阿魯巴弗羅林", OmaniRial: "阿曼裡亞爾", Azerbaijanimanat: "阿塞拜疆馬納特", EgyptianPound: "埃及鎊", EthiopianBirr: "衣索比亞比爾", AngolaKwanza: "安哥拉寬紮", AustralianDollar: "澳大利亞元", Patacas: "澳門元", BarbadosDollar: "巴巴多斯元", PapuaNewGuineaKina: "巴布亞新幾內亞基那", BahamianDollar: "巴哈馬元", PakistanRupee: "巴基斯坦盧比", ParaguayanGuarani: "巴拉圭瓜拉尼", BahrainiDinar: "巴林第納爾", PanamanianBalboa: "巴拿馬巴波亞", Brazilianreal: "巴西裏亞伊", Belarusianruble: "白俄羅斯盧布", BermudianDollar: "百慕大元", BulgarianLev: "保加利亞列弗", IcelandKrona: "冰島克朗", BosniaHerzegovinaConvertibleMark: "波黑可兌換馬克", PolishZloty: "波蘭茲羅提", Boliviano: "玻利維亞諾", BelizeDollar: "貝裡斯元", BotswanaPula: "波劄那普拉", NotDannuzhamu: "不丹努紮姆", BurundiFranc: "布隆迪法郎", NorthKoreanWon: "朝鮮圓", DanishKrone: "丹麥克朗", EastCaribbeanDollar: "東加勒比元", DominicaPeso: "多明尼加比索", RussianRuble: "俄國盧布", EritreanNakfa: "厄利垂亞納克法", CFAfranc: "非洲金融共同體法郎", PhilippinePeso: "菲律賓比索", FijiDollar: "斐濟元", CapeVerdeEscudo: "佛得角埃斯庫多", FalklandIslandsPound: "福克蘭群島鎊", GambianDalasi: "岡比亞達拉西", Congolesefranc: "剛果法郎", ColombianPeso: "哥倫比亞比索", CostaRicanColon: "哥斯大黎加科朗", CubanPeso: "古巴比索", Cubanconvertiblepeso: "古巴可兌換比索", GuyanaDollar: "蓋亞那元", KazakhstanTenge: "哈薩克共和國堅戈", Haitiangourde: "海地古德", won: "韓元", NetherlandsAntillesGuilder: "荷屬安的列斯盾", Honduraslempiras: "洪都拉斯拉倫皮拉", DjiboutiFranc: "吉布提法郎", KyrgyzstanSom: "吉爾吉斯斯坦索姆", GuineaFranc: "幾內亞法郎", CanadianDollar: "加拿大元", GhanaianCedi: "加納塞地", Cambodianriel: "高棉瑞爾", CzechKoruna: "捷克克朗", ZimbabweDollar: "辛巴威元", QatariRiyal: "卡塔爾裡亞爾", CaymanIslandsDollar: "開曼群島元", Comorianfranc: "科摩羅法郎", KuwaitiDinar: "科威特第納爾", CroatianKuna: "克羅地亞庫納", KenyanShilling: "肯雅先令", LesothoLoti: "萊索托洛蒂", LaoKip: "老撾基普", LebanesePound: "黎巴嫩鎊", Lithuanianlitas: "立陶宛立特", LibyanDinar: "利比亞第納爾", LiberianDollar: "利比亞元", RwandaFranc: "盧安達法郎", RomanianLeu: "羅馬尼亞列伊", MalagasyAriary: "馬拉加西阿裏亞裏", MaldivianRufiyaa: "瑪律地夫拉菲亞", MalawiKwacha: "馬拉威克瓦查", MalaysianRinggit: "馬來西亞林吉特", MacedoniawearingDinar: "馬其頓戴第納爾", MauritiusRupee: "模裡西斯盧比", MauritanianOuguiya: "茅利塔尼亞烏吉亞", MongolianTugrik: "蒙古圖格裡克", BangladeshiTaka: "孟加拉塔卡", PeruvianNuevoSol: "秘魯新索爾", MyanmarKyat: "緬甸開亞特", MoldovanLeu: "莫爾達瓦列伊", MoroccanDirham: "摩洛哥迪拉姆", MozambiqueMetical: "莫三比克梅蒂卡爾", MexicanPeso: "墨西哥比索", NamibianDollar: "納米比亞元", SouthAfricanRand: "南非蘭特", SouthSudanesePound: "南蘇丹鎊", NicaraguaCordoba: "尼加拉瓜科多巴", NepaleseRupee: "尼泊爾盧比", NigerianNaira: "奈及利亞奈拉", NorwegianKrone: "挪威克朗", GeorgianLari: "喬治亞拉瑞", RMBOffshore: "人民幣(離岸)", SwedishKrona: "瑞典克朗", SwissFranc: "瑞士法郎", SerbianDinar: "塞爾維亞第納爾", SierraLeone: "塞拉里昂利昂", SeychellesRupee: "塞舌耳盧比", SaudiRiyal: "沙特裡亞爾", SaoTomeDobra: "聖多美多布拉", SaintHelenapound: "聖赫倫那群島磅", SriLankaRupee: "斯里蘭卡盧比", SwazilandLilangeni: "史瓦濟蘭裏蘭吉尼", SudanesePound: "蘇丹鎊", Surinamesedollar: "蘇利南元", SolomonIslandsDollar: "所羅門群島元", SomaliShilling: "索馬利亞先令", TajikistanSomoni: "塔吉克共和國索莫尼", PacificFranc: "太平洋法郎", ThaiBaht: "泰國銖", TanzanianShilling: "坦尚尼亞先令", TonganPaanga: "東加潘加", TrinidadandTobagoDollar: "千裡達托貝哥元", TunisianDinar: "突尼斯第納爾", TurkishLira: "土耳其里拉", VanuatuVatu: "瓦努阿圖瓦圖", GuatemalanQuetzal: "瓜地馬拉格查爾", CommissionBolivar: "委內瑞拉博利瓦", BruneiDollar: "汶萊元", UgandanShilling: "烏干達先令", UkrainianHryvnia: "烏克蘭格裡夫尼亞", UruguayanPeso: "烏拉圭比索", Uzbekistansom: "烏茲別克蘇姆", WesternSamoaTala: "薩摩亞塔拉", SingaporeDollar: "新加坡元", NT: "新臺幣", NewZealandDollar: "新西蘭元", HungarianForint: "匈牙利福林", SyrianPound: "敘利亞鎊", JamaicanDollar: "牙買加元", ArmenianDram: "亞美尼亞德拉姆", YemeniRial: "葉門裡亞爾", IraqiDinar: "伊拉克第納爾", IranianRial: "伊朗裡亞爾", NewIsraeliShekel: "以色列新謝克爾", IndianRupee: "印度盧比", IndonesianRupiah: "印尼盧比", JordanianDinar: "約旦第納爾", VND: "越南盾", ZambianKwacha: "尚比亞克瓦查", GibraltarPound: "直布羅陀鎊", ChileanPeso: "智利比索", CFAFrancBEAC: "中非金融合作法郎" }, defaultFmt: [{ text: "自動", value: "General", example: "" }, { text: "純文字", value: "@", example: "" }, { text: "", value: "split", example: "" }, { text: "數位", value: "##0.00", example: "1000.12" }, { text: "百分比", value: "#0.00%", example: "12.21%" }, { text: "科學計數", value: "0.00E+00", example: "1.01E+5" }, { text: "", value: "split", example: "" }, { text: "會計", value: "¥(0.00)", example: "¥(1200.09)" }, { text: "萬元", value: "w", example: "1亿2000万2500" }, { text: "貨幣", value: "¥0.00", example: "¥1200.09" }, { text: "萬元2位小數", value: "w0.00", example: "2万2500.55" }, { text: "", value: "split", example: "" }, { text: "日期", value: "yyyy-MM-dd", example: "2017-11-29" }, { text: "時間", value: "hh:mm AM/PM", example: "3:00 PM" }, { text: "時間24H", value: "hh:mm", example: "15:00" }, { text: "日期時間", value: "yyyy-MM-dd hh:mm AM/PM", example: "2017-11-29 3:00 PM" }, { text: "日期時間24H", value: "yyyy-MM-dd hh:mm", example: "2017-11-29 15:00" }, { text: "", value: "split", example: "" }, { text: "自定義格式", value: "fmtOtherSelf", example: "more" }], 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" }], fontFamily: { MicrosoftYaHei: "Microsoft YaHei" }, fontarray: ["Times New Roman", "Arial", "Tahoma", "Verdana", "微軟雅黑", "宋體", "黑體", "楷體", "仿宋", "新宋體", "華文新魏", "華文行楷", "華文隸書"], fontjson: { "times new roman": 0, arial: 1, tahoma: 2, verdana: 3, "微軟雅黑": 4, "microsoft yahei": 4, "宋體": 5, simsun: 5, "黑體": 6, simhei: 6, "楷體": 7, kaiti: 7, "仿宋": 8, fangsong: 8, "新宋體": 9, nsimsun: 9, "華文新魏": 10, stxinwei: 10, "華文行楷": 11, stxingkai: 11, "華文隸書": 12, stliti: 12 }, border: { borderTop: "上框線", borderBottom: "下框線", borderLeft: "左框線", borderRight: "右框線", borderNone: "無", borderAll: "所有", borderOutside: "外側", borderInside: "內側", borderHorizontal: "內側橫線", borderVertical: "內側分隔號", borderColor: "邊框顏色", borderSize: "邊框粗細" }, merge: { mergeAll: "全部合併", mergeV: "垂直合併", mergeH: "水平合併", mergeCancel: "取消合併", overlappingError: "不能合併重疊區域", partiallyError: "無法對部分合併儲存格執行此操作" }, align: { left: "左對齊", center: "中間對齊", right: "右對齊", top: "頂部對齊", middle: "居中對齊", bottom: "底部對齊" }, textWrap: { overflow: "溢出", wrap: "自動換行", clip: "截斷" }, rotation: { none: "無旋轉", angleup: "向上傾斜", angledown: "向下傾斜", vertical: "豎排文字", rotationUp: "向上90°", rotationDown: "向下90°" }, freezen: { default: "凍結首行", freezenRow: "凍結首行", freezenColumn: "凍結首列", freezenRC: "凍結行列", freezenRowRange: "凍結行到選區", freezenColumnRange: "凍結列到選區", freezenRCRange: "凍結行列到選區", freezenCancel: "取消凍結", noSeletionError: "没有選區" }, sort: { asc: "昇冪", desc: "降序", custom: "自定義排序", hasTitle: "數據具有標題行", sortBy: "排序依據", addOthers: "添加其他排序列", close: "關閉", confirm: "排序", columnOperation: "列", secondaryTitle: "次要排序", sortTitle: "排序範圍", sortRangeTitle: "排序範圍從", sortRangeTitleTo: "到", noRangeError: "不能對多重選擇區域執行此操作,請選擇單個區域,然後再試", mergeError: "選區有合併儲存格,無法執行此操作!" }, filter: (pn = { filter: "篩選", clearFilter: "清除篩選", sortByAsc: "以A-Z昇冪排列", sortByDesc: "以Z-A降序排列", filterByColor: "按顏色篩選", filterByCondition: "按條件過濾", filterByValues: "按值過濾", filiterInputNone: "無", filiterInputTip: "輸入篩選值", filiterRangeStartTip: "範圍開始", filiterRangeEndTip: "範圍结束", filterValueByAllBtn: "全選", filterValueByClearBtn: "清除", filterValueByInverseBtn: "反選", filterValueByTip: "按照值進行篩選", filterConform: "確 認", filterCancel: "取 消" }, Ia(pn, "clearFilter", "清除篩選"), Ia(pn, "conditionNone", "無"), Ia(pn, "conditionCellIsNull", "儲存格為空"), Ia(pn, "conditionCellNotNull", "儲存格有數據"), Ia(pn, "conditionCellTextContain", "文字包含"), Ia(pn, "conditionCellTextNotContain", "文字不包含"), Ia(pn, "conditionCellTextStart", "文字開頭為"), Ia(pn, "conditionCellTextEnd", "文字結尾為"), Ia(pn, "conditionCellTextEqual", "文字等於"), Ia(pn, "conditionCellDateEqual", "日期等於"), Ia(pn, "conditionCellDateBefore", "日期早於"), Ia(pn, "conditionCellDateAfter", "日期晚於"), Ia(pn, "conditionCellGreater", "大於"), Ia(pn, "conditionCellGreaterEqual", "大於等於"), Ia(pn, "conditionCellLess", "小於"), Ia(pn, "conditionCellLessEqual", "小于等於"), Ia(pn, "conditionCellEqual", "等於"), Ia(pn, "conditionCellNotEqual", "不等於"), Ia(pn, "conditionCellBetween", "介於"), Ia(pn, "conditionCellNotBetween", "不在其中"), Ia(pn, "filiterMoreDataTip", "數據量大!請稍後"), Ia(pn, "filiterMonthText", "月"), Ia(pn, "filiterYearText", "年"), Ia(pn, "filiterByColorTip", "按儲存格顏色篩選"), Ia(pn, "filiterByTextColorTip", "按儲存格字體顏色篩選"), Ia(pn, "filterContainerOneColorTip", "本列僅包含一種顏色"), Ia(pn, "filterDateFormatTip", "日期格式"), Ia(pn, "valueBlank", "(空白)"), Ia(pn, "mergeError", "篩選選區有合併儲存格,無法執行此操作!"), pn), rightclick: { copy: "複製", copyAs: "複製為", paste: "粘貼", insert: "插入", delete: "删除", deleteCell: "删除儲存格", deleteSelected: "删除選中", hide: "隱藏", hideSelected: "隱藏選中", showHide: "顯示隱藏", to: "向", left: "左", right: "右", top: "上", bottom: "下", moveLeft: "左移", moveUp: "上移", add: "新增", row: "行", column: "列", width: "寬", height: "高", number: "數位", confirm: "確認", orderAZ: "A-Z順序排列", orderZA: "Z-A降序排列", clearContent: "清除內容", matrix: "矩陣操作選區", sortSelection: "排序選區", filterSelection: "篩選選區", chartGeneration: "圖表生成", firstLineTitle: "首行為標題", untitled: "無標題", array1: "一維數組", array2: "二維陣列", array3: "多元數組", diagonal: "對角線", antiDiagonal: "反對角線", diagonalOffset: "對角偏移", offset: "偏移量", boolean: "布林值", flip: "翻轉", upAndDown: "上下", leftAndRight: "左右", clockwise: "順時針", counterclockwise: "逆時針", transpose: "轉置", matrixCalculation: "矩陣計算", plus: "加", minus: "减", multiply: "乘", divided: "除", power: "次方", root: "次方根", log: "log", delete0: "删除兩端0值", removeDuplicate: "删除重複值", byRow: "按行", byCol: "按列", generateNewMatrix: "生成新矩陣" }, comment: { insert: "新建批註", edit: "編輯批註", delete: "删除", showOne: "顯示/隱藏批註", showAll: "顯示/隱藏所有批註" }, screenshot: { screenshotTipNoSelection: "請框選需要截圖的範圍", screenshotTipTitle: "提示!", screenshotTipHasMerge: "無法對合併儲存格執行此操作", screenshotTipHasMulti: "無法對多重選擇區域執行此操作", screenshotTipSuccess: "截取成功", screenshotImageName: "截圖", downLoadClose: "關閉", downLoadCopy: "複製到剪切板", downLoadBtn: "下載", browserNotTip: "下載功能IE瀏覽器不支持!", rightclickTip: "請在圖片上右鍵點擊'複製'", successTip: "已成功複製(如果粘貼失敗,請在圖片上右鍵點擊'複製圖片'" }, splitText: { splitDelimiters: "分割符號", splitOther: "其它", splitContinueSymbol: "連續分隔符號視為單個處理", splitDataPreview: "數據預覽", splitTextTitle: "文字分列", splitConfirmToExe: "此處已有數據,是否替換它?", tipNoMulti: "能對多重選擇區域執行此操作,請選擇單個區域,然後再試", tipNoMultiColumn: "一次只能轉換一列數據,選定區域可以有多行,但不能有多列,請在選定單列區域以後再試" }, imageText: { imageSetting: "圖片設定", close: "關閉", conventional: "常規", moveCell1: "移動並調整儲存格大小", moveCell2: "移動並且不調整儲存格的大小", moveCell3: "不要移動儲存格並調整其大小", fixedPos: "固定位置", border: "邊框", width: "寬度", radius: "半徑", style: "樣式", solid: "實線", dashed: "虛線", dotted: "點狀", double: "雙線", color: "顏色" }, punctuation: { tab: "Tab 鍵", semicolon: "分號", comma: "逗號", space: "空格" }, findAndReplace: { find: "查找", replace: "替換", goto: "轉到", location: "定位條件", formula: "公式", date: "日期", number: "數位", string: "字元", error: "錯誤", condition: "條件格式", rowSpan: "間隔行", columnSpan: "間隔列", locationExample: "定位", lessTwoRowTip: "請選擇最少兩行", lessTwoColumnTip: "請選擇最少兩行", findTextbox: "查找内容", replaceTextbox: "替換內容", regexTextbox: "規則運算式匹配", wholeTextbox: "整詞匹配", distinguishTextbox: "區分大小寫匹配", allReplaceBtn: "全部替換", replaceBtn: "替換", allFindBtn: "查找全部", findBtn: "查找下一個", noFindTip: "沒有查找到該內容", modeTip: "該模式下不可進行此操作", searchTargetSheet: "工作表", searchTargetCell: "儲存格", searchTargetValue: "值", searchInputTip: "請輸入查找內容", noReplceTip: "沒有可替換的內容", noMatchTip: "找不到匹配項", successTip: "已經幫您蒐索並進行了${xlength}處替換", locationConstant: "常數", locationFormula: "公式", locationDate: "日期", locationDigital: "數位", locationString: "字元", locationBool: "邏輯值", locationError: "錯誤", locationNull: "空值", locationCondition: "條件格式", locationRowSpan: "間隔行", locationColumnSpan: "間隔列", locationTiplessTwoRow: "請選擇最少兩行", locationTiplessTwoColumn: "請選擇最少兩列", locationTipNotFindCell: "未找到儲存格" }, sheetconfig: { delete: "删除", copy: "複製", rename: "重命名", changeColor: "更改顏色", hide: "隱藏", unhide: "取消隱藏", moveLeft: "向左移", moveRight: "向右移", resetColor: "重置顏色", cancelText: "取消", chooseText: "確定顏色", tipNameRepeat: "籤頁的名稱不能重複!請重新修改", noMoreSheet: "工作薄內至少含有一張可視工作表。若需删除選定的工作表,請先插入一張新工作表或顯示一張隱藏的工作表。。", confirmDelete: "是否删除", redoDelete: "可以通過Ctrl+Z撤銷删除", noHide: "不能隱藏,至少保留一個sheet標籤", chartEditNoOpt: "圖表編輯模式下不允許該操作!", sheetNameSpecCharError: "名稱不能包含:[ ] : ? * / ' \"", sheetNamecannotIsEmptyError: "名稱不能為空" }, conditionformat: { conditionformat_greaterThan: "條件格式——大於", conditionformat_greaterThan_title: "為大於以下值的儲存格設定格式", conditionformat_lessThan: "條件格式——小於", conditionformat_lessThan_title: "為小於以下值的儲存格設定格式", conditionformat_betweenness: "條件格式——介於", conditionformat_betweenness_title: "為介於以下值的儲存格設定格式", conditionformat_equal: "條件格式——等於", conditionformat_equal_title: "為等於以下值的儲存格設定格式", conditionformat_textContains: "條件格式——文字包含", conditionformat_textContains_title: "為包含以下文字的儲存格設定格式", conditionformat_occurrenceDate: "條件格式——發生日期", conditionformat_occurrenceDate_title: "為包含以下日期的儲存格設定格式", conditionformat_duplicateValue: "條件格式——重複值", conditionformat_duplicateValue_title: "為包含以下類型值的儲存格設定格式", conditionformat_top10: "條件格式——前10項", conditionformat_top10_percent: "條件格式——前10%", conditionformat_top10_title: "為值最大的那些儲存格設定格式", conditionformat_last10: "條件格式——最後10項", conditionformat_last10_percent: "條件格式——最後10%", conditionformat_last10_title: "為值最小的那些儲存格設定格式", conditionformat_AboveAverage: "條件格式——高於平均值", conditionformat_AboveAverage_title: "為高於平均值的儲存格設定格式", conditionformat_SubAverage: "條件格式——低於平均值", conditionformat_SubAverage_title: "為低於平均值的儲存格設定格式", rule: "規則", newRule: "新建規則", editRule: "編輯規則", deleteRule: "删除規則", deleteCellRule: "清除所選儲存格的規則", deleteSheetRule: "清除整個工作表的規則", manageRules: "管理規則", showRules: "顯示其格式規則", highlightCellRules: "突出顯示儲存格規則", itemSelectionRules: "項目選取規則", conditionformatManageRules: "條件格式規則管理器", format: "格式", setFormat: "設定格式", setAs: "設定為", setAsByArea: "針對選定區域,設定為", applyRange: "應用範圍", selectRange: "點擊選擇應用範圍", selectRange_percent: "所選範圍的百分比", selectRange_average: "選定範圍的平均值", selectRange_value: "選定範圍中的數值", pleaseSelectRange: "請選擇應用範圍", selectDataRange: "點擊選擇數據範圍", selectCell: "選擇儲存格", pleaseSelectCell: "請選擇儲存格", pleaseSelectADate: "請選擇日期", pleaseEnterInteger: "請輸入一個介於1和1000之間的整數", onlySingleCell: "只能對單個儲存格進行引用", conditionValueCanOnly: "條件值只能是數位或者單個儲存格", ruleTypeItem1: "基於各自值設定所有儲存格的格式", ruleTypeItem2: "只為包含以下內容的儲存格設定格式", ruleTypeItem2_title: "只為滿足以下條件的儲存格", ruleTypeItem3: "僅對排名靠前或靠後的數值設定格式", ruleTypeItem3_title: "為以下排名內的值", ruleTypeItem4: "僅對高於或低於平均值的數值設定格式", ruleTypeItem4_title: "為滿足以下條件的值", ruleTypeItem5: "僅對唯一值或重複值設定格式", ruleTypeItem6: "使用公式確定要設置格式的單元格", formula: "公式", textColor: "文字顏色", cellColor: "儲存格顏色", confirm: "確定", confirmColor: "確定顏色", cancel: "取消", close: "關閉", clearColorSelect: "清除顏色選擇", sheet: "錶", currentSheet: "當前工作表", dataBar: "數據條", dataBarColor: "數據條顏色", gradientDataBar_1: "藍-白漸變數據條", gradientDataBar_2: "綠-白漸變數據條", gradientDataBar_3: "紅-白漸變數據條", gradientDataBar_4: "柳丁-白漸變數據條", gradientDataBar_5: "淺藍-白漸變數據條", gradientDataBar_6: "紫-白漸變數據條", solidColorDataBar_1: "藍色數據條", solidColorDataBar_2: "綠色數據條", solidColorDataBar_3: "紅色數據條", solidColorDataBar_4: "橙色數據條", solidColorDataBar_5: "淺藍色數據條", solidColorDataBar_6: "紫色數據條", colorGradation: "色階", colorGradation_1: "綠-黃-紅色階", colorGradation_2: "紅-黃-綠色階", colorGradation_3: "綠-白-紅色階", colorGradation_4: "紅-白-綠色階", colorGradation_5: "藍-白-紅色階", colorGradation_6: "紅-白-藍色階", colorGradation_7: "白-紅色階", colorGradation_8: "紅-白色階", colorGradation_9: "綠-白色階", colorGradation_10: "白-綠色階", colorGradation_11: "綠-黃色階", colorGradation_12: "黃-綠色階", icons: "圖標集", pleaseSelectIcon: "請點擊選擇一組圖標:", cellValue: "儲存格值", specificText: "特定文字", occurrence: "發生日期", greaterThan: "大於", lessThan: "小於", between: "介於", equal: "等於", in: "和", to: "到", between2: "之間", contain: "包含", textContains: "文字包含", duplicateValue: "重複值", uniqueValue: "唯一值", top: "前", top10: "前10項", top10_percent: "前10%", last: "後", last10: "後10項", last10_percent: "後10%", oneself: "個", above: "高於", aboveAverage: "高於平均值", below: "低於", belowAverage: "低於平均值", all: "全部", yesterday: "昨天", today: "今天", tomorrow: "明天", lastWeek: "上周", thisWeek: "本周", lastMonth: "上月", thisMonth: "本月", lastYear: "去年", thisYear: "本年", last7days: "最近7天", last30days: "最近30天", next7days: "未來7天", next30days: "未來30天", next60days: "未來60天", chooseRuleType: "選擇規則類型", editRuleDescription: "編輯規則說明", newFormatRule: "新建格式規則", editFormatRule: "編輯格式規則", formatStyle: "格式樣式", fillType: "填充類型", color: "顏色", twocolor: "雙色", tricolor: "三色", multicolor: "彩色", grayColor: "灰色", gradient: "漸變", solid: "實心", maxValue: "最大值", medianValue: "中間值", minValue: "最小值", direction: "方向", threeWayArrow: "三向箭頭", fourWayArrow: "四向箭頭", fiveWayArrow: "五向箭頭", threeTriangles: "3個三角形", shape: "形狀", threeColorTrafficLight: "三色交通燈", fourColorTrafficLight: "四色交通燈", threeSigns: "三標誌", greenRedBlackGradient: "綠-紅-黑漸變", rimless: "無邊框", bordered: "有邊框", mark: "標記", threeSymbols: "三個符號", tricolorFlag: "三色旗", circled: "有圓圈", noCircle: "無圓圈", grade: "等級", grade4: "四等級", grade5: "五等級", threeStars: "3個星形", fiveQuadrantDiagram: "五象限圖", fiveBoxes: "5個框" }, insertLink: { linkText: "文字", linkType: "連結類型", external: "外部連結", internal: "内部連結", linkAddress: "連結地址", linkSheet: "工作表", linkCell: "儲存格引用", linkTooltip: "提示", placeholder1: "請輸入網頁連結位址", placeholder2: "請輸入要引用的儲存格,例A1", placeholder3: "請輸入提示內容", tooltipInfo1: "請輸入有效的連結", tooltipInfo2: "請輸入正確的儲存格引用" }, dataVerification: { cellRange: "儲存格範圍", selectCellRange: "點擊選擇儲存格範圍", selectCellRange2: "請選擇儲存格範圍", verificationCondition: "驗證條件", dropdown: "下拉清單", checkbox: "核取方塊", number: "數位", number_integer: "數位-整數", number_decimal: "數位-小數", text_content: "文字-內容", text_length: "文字-長度", date: "日期", validity: "有效性", placeholder1: "請輸入選項,以英文逗號分隔,如1,2,3,4,5", placeholder2: "請輸入內容", placeholder3: "數值,如10", placeholder4: "請輸入指定的文字", placeholder5: "請輸入選中儲存格時顯示的提示語", selected: "選擇時", notSelected: "未選擇", between: "介於", notBetween: "不介於", equal: "等於", notEqualTo: "不等於", moreThanThe: "大於", lessThan: "小於", greaterOrEqualTo: "大於等於", lessThanOrEqualTo: "小於等於", include: "包括", exclude: "不包括", earlierThan: "早於", noEarlierThan: "不早於", laterThan: "晚於", noLaterThan: "不晚於", identificationNumber: "身份證號碼", phoneNumber: "手機號", remote: "自動遠程獲取選項", prohibitInput: "輸入數據無效時禁止輸入", hintShow: "選中儲存格時顯示提示語", deleteVerification: "删除驗證", tooltipInfo1: "下拉清單選項不可為空", tooltipInfo2: "核取方塊內容不可為空", tooltipInfo3: "輸入的值不是數值類型", tooltipInfo4: "數值2不能小於數值1", tooltipInfo5: "文字內容不能為空", tooltipInfo6: "輸入的值不是日期類型", tooltipInfo7: "日期2不能小於日期1" }, formula: { sum: "求和", average: "平均值", count: "計數", max: "最大值", min: "最小值", ifGenerate: "if公式生成器", find: "更多函數", tipNotBelongToIf: "該儲存格函數不屬於if公式!", tipSelectCell: "請選擇儲存格插入函數", ifGenCompareValueTitle: "比较值", ifGenSelectCellTitle: "點擊選擇儲存格", ifGenRangeTitle: "範圍", ifGenRangeTo: "至", ifGenRangeEvaluate: "範圍評估", ifGenSelectRangeTitle: "點擊選擇範圍", ifGenCutWay: "劃分管道", ifGenCutSame: "劃分值相同", ifGenCutNpiece: "劃分为N份", ifGenCutCustom: "自定義輸入", ifGenCutConfirm: "生成", ifGenTipSelectCell: "選擇儲存格", ifGenTipSelectCellPlace: "請選擇儲存格", ifGenTipSelectRange: "選擇單範圍", ifGenTipSelectRangePlace: "請選擇範圍", ifGenTipNotNullValue: "比較值不能為空!", ifGenTipLableTitile: "標籤", ifGenTipRangeNotforNull: "範圍不能為空!", ifGenTipCutValueNotforNull: "劃分值不能為空!", ifGenTipNotGenCondition: "沒有生成可用的條件!" }, formulaMore: { valueTitle: "值", tipSelectDataRange: "選取數據範圍", tipDataRangeTile: "數據範圍", findFunctionTitle: "查找函數", tipInputFunctionName: "請輸入您要查找的函數名稱或函數功能的簡要描述", Array: "數組", Database: "資料來源", Date: "日期", Engineering: "工程計算", Filter: "篩檢程式", Financial: "財務", luckysheet: "Luckysheet內寘", other: "其它", Logical: "邏輯", Lookup: "查找", Math: "數學", Operator: "運算子", Parser: "轉換工具", Statistical: "統計", Text: "文字", dataMining: "資料挖掘", selectFunctionTitle: "選擇函數", calculationResult: "計算結果", tipSuccessText: "成功", tipParamErrorText: "參數類型錯誤", helpClose: "關閉", helpCollapse: "收起", helpExample: "示例", helpAbstract: "摘要", execfunctionError: '提示", "公式存在錯誤', execfunctionSelfError: "公式不可引用其本身的儲存格", execfunctionSelfErrorResult: "公式不可引用其本身的儲存格,會導致計算結果不準確", allowRepeatText: "可重複", allowOptionText: "可選", selectCategory: "或選擇類別" }, drag: { noMerge: "無法對合併儲存格執行此操作", affectPivot: "無法對所選儲存格進行此更改,因為它會影響數據透視錶!", noMulti: "無法對多重選擇區域執行此操作,請選擇單個區域", noPaste: "無法在此處粘貼此內容,請選擇粘貼區域的一個儲存格,然後再次嘗試粘貼", noPartMerge: "無法對部分合併儲存格執行此操作", inputCorrect: "請輸入正確的數值", notLessOne: "行列數不能小於1", offsetColumnLessZero: "偏移列不能為負數!", pasteMustKeybordAlert: "Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut", pasteMustKeybordAlertHTMLTitle: "Copy and paste in the Sheet", pasteMustKeybordAlertHTML: "<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut" }, pivotTable: { title: "數據透視錶", closePannel: "關閉", editRange: "編輯範圍", tipPivotFieldSelected: "選擇需要添加到數據透視錶的欄位", tipClearSelectedField: "清除所有已選欄位", btnClearSelectedField: "清除", btnFilter: "篩選", titleRow: "行", titleColumn: "列", titleValue: "數值", tipShowColumn: "統計欄位顯示為列", tipShowRow: "統計欄位顯示為行", titleSelectionDataRange: "選取數據範圍", titleDataRange: "數據範圍", valueSum: "總計", valueStatisticsSUM: "求和", valueStatisticsCOUNT: "數值計數", valueStatisticsCOUNTA: "計數", valueStatisticsCOUNTUNIQUE: "去重計數", valueStatisticsAVERAGE: "平均值", valueStatisticsMAX: "最大值", valueStatisticsMIN: "最小值", valueStatisticsMEDIAN: "中位數", valueStatisticsPRODUCT: "乘積", valueStatisticsSTDEV: "標準差", valueStatisticsSTDEVP: "整體標準差", valueStatisticslet: "方差", valueStatisticsVARP: "整體方差", errorNotAllowEdit: "非編輯模式下禁止該操作!", errorNotAllowMulti: "不能對多重選擇區域執行此操作,請選擇單個區域,然後再試", errorSelectRange: "請選擇新建透視錶的區域", errorIsDamage: "此數據透視錶的源數據已損壞!", errorNotAllowPivotData: "不可選擇數據透視錶為源數據!", errorSelectionRange: "選擇失敗,輸入範圍錯誤!", errorIncreaseRange: "請擴大選擇的數據範圍!", titleAddColumn: "添加列到數據透視錶", titleMoveColumn: "移動該列到下方白框", titleClearColumnFilter: "清除該列的篩選條件", titleFilterColumn: "篩選該列", titleSort: "排序", titleNoSort: "無排序", titleSortAsc: "昇冪", titleSortDesc: "降序", titleSortBy: "排序依據", titleShowSum: "顯示總計", titleStasticTrue: "是", titleStasticFalse: "否" }, dropCell: { copyCell: "複製儲存格", sequence: "填充序列", onlyFormat: "僅填充格式", noFormat: "不帶格式填充", day: "以天數填充", workDay: "以工作日填充", month: "以月填充", year: "以年填充", chineseNumber: "以中文小寫數位填充" }, imageCtrl: { borderTile: "圖片邊框顏色選擇", borderCur: "當前顏色" }, protection: { protectiontTitle: "保護工作表", enterPassword: "請輸入密碼(可留空)", enterHint: "您試圖更改的儲存格或圖表位於受保護的工作表中。若要更改,請取消工作表保護。您可能需要輸入密碼", swichProtectionTip: "保護工作表及鎖定的儲存格內容", authorityTitle: "允許此工作表的用戶進行:", selectLockedCells: "定鎖定儲存格", selectunLockedCells: "選定解除鎖定的儲存格", formatCells: "設定儲存格格式", formatColumns: "設定列格式", formatRows: "設定行格式", insertColumns: "插入列", insertRows: "插入行", insertHyperlinks: "插入超連結", deleteColumns: "删除列", deleteRows: "删除行", sort: "排序", filter: "使用自動篩選", usePivotTablereports: "使用數據透視錶和報表", editObjects: "編輯對象", editScenarios: "編輯方案", allowRangeTitle: "允許用戶編輯區域", allowRangeAdd: "新建...", allowRangeAddTitle: "標題", allowRangeAddSqrf: "引用儲存格", selectCellRange: "點擊選擇儲存格範圍", selectCellRangeHolder: "請輸入儲存格範圍", allowRangeAddTitlePassword: "密碼", allowRangeAddTitleHint: "提示", allowRangeAddTitleHintTitle: "設置密碼後,提示用戶輸入密碼(可留空)", allowRangeAddtitleDefault: "請輸入區域名稱", rangeItemDblclick: "按兩下進行編輯", rangeItemHasPassword: "已設置密碼", rangeItemErrorTitleNull: "標題不能為空", rangeItemErrorRangeNull: "儲存格範圍不能為空", rangeItemErrorRange: "儲存格範圍格式錯誤", validationTitle: "驗證提示", validationTips: "需要輸入密碼來撤銷工作表的保護", validationInputHint: "請輸入密碼", checkPasswordNullalert: "密碼不能為空!", checkPasswordWrongalert: "密碼錯誤,請重試!", checkPasswordSucceedalert: "解鎖成功,可以編輯該區域!", defaultRangeHintText: "該儲存格正在受密碼保護", defaultSheetHintText: "該儲存格或圖表位於受保護的工作表中,若要進行更改,請取消工作表保護,您可能需要輸入密碼。" }, cellFormat: { cellFormatTitle: "設定儲存格格式", protection: "保護", locked: "鎖定儲存格", hidden: "隱藏公式", protectionTips: "只有保護工作表功能(在功能表列點擊保護工作表按鈕進行設定)開啟後,鎖定儲存格或隱藏公式才能生效", tipsPart: "部分選中", tipsAll: "全部選中", selectionIsNullAlert: "請選擇一個範圍!", sheetDataIsNullAlert: "數據為空無法設定!" }, print: { normalBtn: "常規視圖", layoutBtn: "頁面佈局", pageBtn: "分頁預覽", menuItemPrint: "列印(Ctrl+P)", menuItemAreas: "列印區域", menuItemRows: "列印標題行", menuItemColumns: "列印標題列" }, edit: { typing: "正在輸入" }, websocket: { success: "WebSocket連接成功", refresh: "WebSocket連接發生錯誤,請刷新頁面!", wait: "WebSocket連接發生錯誤,請耐心等待!", close: "WebSocket連接關閉", contact: "服務器通信發生錯誤,請刷新頁面後再試,如若不行請聯系管理員!", support: "當前瀏覽器不支持WebSocket" } } }; function gn() { return fn[ga.lang] } function vn() { var e = gn(), t = e.rightclick, a = e.toolbar, r = function () { var e = { copy: !0, copyAs: !0, paste: !0, insertRow: !0, insertColumn: !0, deleteRow: !0, deleteColumn: !0, deleteCell: !0, hideRow: !0, hideColumn: !0, rowHeight: !0, columnWidth: !0, clear: !0, matrix: !0, sort: !0, filter: !0, chart: !0, image: !0, link: !0, data: !0, cellFormat: !0 }; "{}" !== JSON.stringify(fa.cellRightClickConfig) && Object.assign(e, fa.cellRightClickConfig); return fa.cellRightClickConfig = e, e }(), n = !0; r.insertRow || r.insertColumn || r.deleteRow || r.deleteColumn || r.deleteCell || (n = !1); var l = !0; return r.clear || r.matrix || r.sort || r.filter || r.chart || r.image || r.link || r.data || r.cellFormat || (l = !1), '<div id="luckysheet-rightclick-menu" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel">\n <div id="luckysheet-copy-btn" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-copy-btn" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" style="display:'.concat(r.copy ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.copy, '</div>\n </div>\n <div id="luckysheetcopyfor" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(r.copyAs ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.copyAs, '<span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;"></span>\n </div>\n </div>\n <div id="luckysheet-copy-paste" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.paste ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.paste, '</div>\n </div>\n <div id="luckysheet-cols-rows-handleincell">\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator" style="display:').concat(n ? "block" : "none", ';"></div>\n <div id="luckysheetColsRowsHandleAdd_row" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.insertRow ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.insert).concat(t.row, '<span class="luckysheet-submenu-arrow" style="user-select: none;"></span>\n </div>\n </div>\n <div id="luckysheetColsRowsHandleAdd_column" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.insertColumn ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.insert).concat(t.column, '<span class="luckysheet-submenu-arrow" style="user-select: none;"></span>\n </div>\n </div>\n <div id="luckysheet-delRows" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(r.deleteRow ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteSelected).concat(t.row, '<span class="luckysheet-submenu-arrow" style="user-select: none;"></span>\n </div>\n </div>\n <div id="luckysheet-delCols" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(r.deleteColumn ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteSelected).concat(t.column, '<span class="luckysheet-submenu-arrow" style="user-select: none;"></span>\n </div>\n </div>\n \x3c!-- cell right click remove hide button\n <div id="luckysheetColsRowsHandleHid" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.hide, '<span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;"></span>\n </div>\n </div>\n --\x3e\n <div id="luckysheetCellsHandleDel" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(r.deleteCell ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteCell, '<span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;"></span>\n </div>\n </div>\n </div>\n <div id="luckysheet-cols-rows-add">\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>\n <div id="luckysheet-top-left-add-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to, '\n <span class="luckysheet-cols-rows-shift-left">').concat(t.left, "</span>\n ").concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align:center;margin-left:5px;"/>\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div id="luckysheet-bottom-right-add-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to, '\n <span class="luckysheet-cols-rows-shift-right">').concat(t.right, "</span>\n ").concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div id="luckysheet-del-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteSelected, '\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div id="luckysheet-hide-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.hideSelected, '\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div id="luckysheet-show-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.showHide, '\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div id="luckysheet-column-row-width-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n <span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">').concat(t.column, '</span>\n <span class="luckysheet-cols-rows-shift-size luckysheet-mousedown-cancel">').concat(t.width, '</span>\n <input type="number" class="luckysheet-mousedown-cancel rcsize" min="0" max="255" placeholder="').concat(t.number, '" value="" style="width:50px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;">\n px\n </div>\n </div>\n </div>\n <div id="luckysheet-cols-rows-shift">\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator" style="display:').concat(r.sort ? "block" : "none", ';"></div>\n <div id="luckysheetorderbyasc" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.sort ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.orderAZ, '</div>\n </div>\n <div id="luckysheetorderbydesc" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.sort ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.orderZA, '</div>\n </div>\n </div>\n <div id="luckysheet-cols-rows-data">\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator" style="display:').concat(l ? "block" : "none", ';"></div>\n <div id="luckysheet-delete-text" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.clear ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.clearContent, '</div>\n </div>\n <div id="luckysheetmatrix" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(r.matrix ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.matrix, '<span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;"></span>\n </div>\n </div>\n <div id="luckysheetorderby" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.sort ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.sortSelection, '</div>\n </div>\n <div id="luckysheetfilter" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.filter ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.filterSelection, '</div>\n </div>\n <div id="luckysheetdatavisual" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.chart ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.chartGeneration, '</div>\n </div>\n <div id="luckysheetInsertImage" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.image ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(a.insertImage, '</div>\n </div>\n <div id="luckysheetInsertLink" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.link ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(a.insertLink, '</div>\n </div>\n <div id="luckysheetDataVerification" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.data ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(a.dataVerification, '</div>\n </div>\n <div id="luckysheetCellFormatRightClickMenu" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(r.cellFormat ? "block" : "none", ';">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(a.cellFormat, '</div>\n </div>\n </div>\n </div>\n <div id="luckysheetcopyfor_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div id="luckysheet-copy-json-head" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">Json ').concat(t.firstLineTitle, '</div>\n </div>\n <div id="luckysheet-copy-json-nohead" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">Json ').concat(t.untitled, '</div>\n </div>\n <div id="luckysheet-copy-array1" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.array1, '</div>\n </div>\n <div id="luckysheet-copy-array2" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.array2, '</div>\n </div>\n <div id="luckysheet-copy-arraymore-confirm" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n <span class="luckysheet-mousedown-cancel">').concat(t.array3, '</span>\n <input type="number" id="luckysheet-copy-arraymore-row" min="1" class="luckysheet-mousedown-cancel" placeholder="').concat(t.row, '" style="width:40px;height:20px;box-sizing:border-box;text-align: center;"/>\n ×\n <input type="number" id="luckysheet-copy-arraymore-col" min="1" class="luckysheet-mousedown-cancel" placeholder="').concat(t.column, '" style="width:40px;height:20px;box-sizing:border-box;text-align: center;"/>\n </div>\n </div>\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>\n <div id="luckysheet-copy-diagonal" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.diagonal, '</div>\n </div>\n <div id="luckysheet-copy-antidiagonal" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.antiDiagonal, '</div>\n </div>\n <div id="luckysheet-copy-diagonaloffset" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.diagonalOffset, '\n <input type="number" id="luckysheet-copy-diagonaloffset-value" class="luckysheet-mousedown-cancel" placeholder="').concat(t.offset, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n ').concat(t.column, '\n </div>\n </div>\n <div id="luckysheet-copy-boolvalue" data-clipboard-action="copy" data-clipboard-target="#luckysheet-copy-content" class="luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.boolean, '</div>\n </div>\n </div>\n \n \x3c!-- Revision: modeled on google sheet\n \n <div id="luckysheetColsRowsHandleAdd_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to).concat(t.top).concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n <span class="luckysheet-mousedown-cancel">').concat(t.row, '</span>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to).concat(t.bottom).concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n <span class="luckysheet-mousedown-cancel">').concat(t.row, '</span>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to).concat(t.left).concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n <span class="luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.to).concat(t.right).concat(t.add, '\n <input type="text" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n <span class="luckysheet-mousedown-cancel">').concat(t.column, '</span>\n </div>\n </div>\n </div>\n \n --\x3e\n\n \x3c!-- delete row or column\n \n <div id="luckysheetColsRowsHandleDel_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div id="luckysheet-delRows" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteSelected).concat(t.row, '\n </div>\n </div>\n <div id="luckysheet-delCols" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.deleteSelected).concat(t.column, '\n </div>\n </div>\n </div>\n \n --\x3e\n\n \x3c!--\n <div id="luckysheetColsRowsHandleHid_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div id="luckysheet-hidRows" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.hideSelected).concat(t.row, '\n </div>\n </div>\n <div id="luckysheet-showHidRows" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.showHide).concat(t.row, '\n </div>\n </div>\n <div id="luckysheet-hidCols" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.hideSelected).concat(t.column, '\n </div>\n </div>\n <div id="luckysheet-showHidCols" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.showHide).concat(t.column, '\n </div>\n </div>\n </div>\n\n --\x3e\n\n <div id="luckysheetCellsHandleDel_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div id="luckysheet-delCellsMoveLeft" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.moveLeft, '\n </div>\n </div>\n <div id="luckysheet-delCellsMoveUp" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.moveUp, '\n </div>\n </div>\n </div>\n <div id="luckysheetmatrix_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.flip, '\n <button id="luckysheet-matrix-turn-up" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.upAndDown, '</button>\n <button id="luckysheet-matrix-turn-left" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.leftAndRight, '</button>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.flip, '\n <button id="luckysheet-matrix-turn-cw" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.clockwise, '</button>\n <button id="luckysheet-matrix-turn-anticw" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.counterclockwise, '</button>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div id="luckysheet-matrix-turn-trans" class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(t.transpose, '</div>\n </div>\n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>\n <div id="luckysheet-matrix-cal-confirm" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n <div class="luckysheet-mousedown-cancel">').concat(t.matrixCalculation, '</div>\n <div class="luckysheet-mousedown-cancel">\n <select id="luckysheet-matrix-cal-type" class="luckysheet-mousedown-cancel" style="height:20px;">\n <option value="plus">').concat(t.plus, '</option>\n <option value="minus">').concat(t.minus, '</option>\n <option value="multiply">').concat(t.multiply, '</option>\n <option value="divided">').concat(t.divided, '</option>\n <option value="power">').concat(t.power, '</option>\n <option value="root">').concat(t.root, '</option>\n <option value="log">').concat(t.log, '</option>\n </select>\n <input type="number" id="luckysheet-matrix-cal-value" class="luckysheet-mousedown-cancel" placeholder="').concat(t.number, '" value="2" style="width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;"/>\n </div>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.delete0, '\n <button id="luckysheet-matrix-delezero-row" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.byRow, '</button>\n <button id="luckysheet-matrix-delezero-column" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.byCol, '</button>\n </div>\n </div>\n <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">\n ').concat(t.removeDuplicate, '\n <button id="luckysheet-matrix-delerpt-row" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.byRow, '</button>\n <button id="luckysheet-matrix-delerpt-column" class="btn btn-primary luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">').concat(t.byCol, "</button>\n </div>\n </div>\n </div>") } var yn = '<div style="${style}" id="luckysheet-sheets-item${index}" data-index="${index}" class="luckysheet-sheets-item ${active}"><span class="luckysheet-sheets-item-name" spellcheck ="false" contenteditable="false">${name}</span> <span class="luckysheet-sheets-item-menu luckysheet-mousedown-cancel"><i class="fa fa-sort-desc luckysheet-mousedown-cancel"></i></span>${colorset}</div>', bn = '<div id="${id}" style="${style}" class="luckysheet-modal-dialog ${addclass}" tabindex="0" role="dialog" aria-labelledby=":41e" dir="ltr"> <div class="luckysheet-modal-dialog-title luckysheet-modal-dialog-title-draggable"> <span class="luckysheet-modal-dialog-title-text" role="heading">${title}</span>\t <span class="luckysheet-modal-dialog-title-close" role="button" tabindex="0" aria-label="${close}"><i class="fa fa-times" aria-hidden="true"></i></span> </div> <div class="luckysheet-modal-dialog-content">${content}</div> <div class="luckysheet-modal-dialog-buttons">\t ${botton} </div></div>'; function kn() { var e = gn().sheetconfig, t = function () { var e = { delete: !0, copy: !0, rename: !0, color: !0, hide: !0, move: !0 }; "{}" !== JSON.stringify(fa.sheetRightClickConfig) && Object.assign(e, fa.sheetRightClickConfig); return fa.sheetRightClickConfig = e, e }(); if (Object.values(t).every((function (e) { return !e }))) return $("#luckysheet-sheet-container-c").addClass("luckysheet-sheet-container-menu-hide"), ""; var a = !0, r = !0; return t.delete || t.copy || t.rename || t.color || (a = !1, t.hide || (r = !1)), t.hide || (a = !1), t.move || (r = !1), '<div id="luckysheet-rightclick-sheet-menu" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel"> \n <div id="luckysheetsheetconfigdelete" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:'.concat(t.delete ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.delete, '</div>\n </div> \n <div id="luckysheetsheetconfigcopy" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.copy ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.copy, '</div> \n </div> \n <div id="luckysheetsheetconfigrename" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.rename ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.rename, '</div> \n </div> \n <div id="luckysheetsheetconfigcolor" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel" style="display:').concat(t.color ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> \n ').concat(e.changeColor, ' <span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;"></span> \n </div> \n </div> \n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator" style="display:').concat(a ? "block" : "none", ';"></div> \n <div id="luckysheetsheetconfighide" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.hide ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.hide, '</div> \n </div> \n <div id="luckysheetsheetconfigshow" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.hide ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.unhide, '</div> \n </div> \n <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator" style="display:').concat(r ? "block" : "none", ';"></div> \n <div id="luckysheetsheetconfigmoveleft" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.move ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.moveLeft, '</div> \n </div> \n <div id="luckysheetsheetconfigmoveright" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="display:').concat(t.move ? "block" : "none", ';"> \n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.moveRight, '</div> \n </div> \n </div> \n <div id="luckysheetsheetconfigcolor_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">\n <div id="luckysheetsheetconfigcolorreset" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">\n <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.resetColor, '</div>\n </div> \n <div class="luckysheet-mousedown-cancel"> \n <div class="luckysheet-mousedown-cancel"> \n <input type="text" id="luckysheetsheetconfigcolorur" /> \n </div> \n </div> \n </div>') } function xn() { var e = gn().filter; return '<div class="luckysheet-cols-menu luckysheet-mousedown-cancel luckysheet-filter-menu" id="luckysheet-${menuid}-menu"><div id="luckysheet-${menuid}-orderby-asc" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">'.concat(e.sortByAsc, '</div></div><div id="luckysheet-${menuid}-orderby-desc" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"><div style="width:205px;" class="luckysheet-mousedown-cancel">').concat(e.sortByDesc, '</div></div></div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div><div id="luckysheet-${menuid}-orderby-color" class="luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="position: relative;">').concat(e.filterByColor, '<span class="luckysheet-submenu-arrow iconfont luckysheet-iconfont-youjiantou" style="user-select: none;right: 0;"></span></div></div><div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" id="luckysheet-${menuid}-bycondition" style="padding-top:0px;padding-bottom:0px;"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"><i class="fa fa-caret-right" aria-hidden="true"></i> ').concat(e.filterByCondition, '</div></div> <div class="luckysheet-${menuid}-bycondition" style="display:none;"><div class="luckysheet-flat-menu-button luckysheet-mousedown-cancel" id="luckysheet-${menuid}-selected"><span class="luckysheet-mousedown-cancel" data-value="null" data-type="0">').concat(e.filiterInputNone, '</span><div class="luckysheet-mousedown-cancel"><i class="fa fa-sort" aria-hidden="true"></i></div></div><div class="luckysheet-${menuid}-selected-input"><input type="text" placeholder="').concat(e.filiterInputTip, '" class="luckysheet-mousedown-cancel" /></div><div class="luckysheet-${menuid}-selected-input luckysheet-${menuid}-selected-input2"><span>从</span><input type="text" placeholder="').concat(e.filiterRangeStartTip, '" class="luckysheet-mousedown-cancel" /><span>到</span><input type="text" placeholder="').concat(e.filiterRangeEndTip, '" class="luckysheet-mousedown-cancel" /></div></div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" id="luckysheet-${menuid}-byvalue" style="padding-top:0px;padding-bottom:0px;"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"><i class="fa fa-caret-right" aria-hidden="true"></i> ').concat(e.filterByValues, '</div></div> <div class="luckysheet-${menuid}-byvalue"><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel luckysheet-mousedown-${menuid}-byvalue-btn"><span id="luckysheet-${menuid}-byvalue-btn-all" class="luckysheet-mousedown-cancel">').concat(e.filterValueByAllBtn, '</span> - <span id="luckysheet-${menuid}-byvalue-btn-clear" class="luckysheet-mousedown-cancel">').concat(e.filterValueByClearBtn, '</span> - <span id="luckysheet-${menuid}-byvalue-btn-contra" class="luckysheet-mousedown-cancel">').concat(e.filterValueByInverseBtn, '</span> <div><i class="fa fa-${menuid} luckysheet-mousedown-cancel" aria-hidden="true"></i></div></div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="padding-left:3px; padding-right:3px;"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"><input type="text" placeholder="').concat(e.filterValueByTip, '" class="luckysheet-mousedown-cancel" id="luckysheet-${menuid}-byvalue-input" /><div class="luckysheet-${menuid}-byvalue-input-icon luckysheet-mousedown-cancel"><i class="fa fa-search luckysheet-mousedown-cancel" aria-hidden="true"></i></div></div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div id="luckysheet-${menuid}-byvalue-select" class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"></div></div></div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"><div class="btn btn-primary luckysheet-mousedown-cancel" id="luckysheet-${menuid}-confirm">').concat(e.filterConform, '</div> <div class="btn btn-default luckysheet-mousedown-cancel" id="luckysheet-${menuid}-cancel">').concat(e.filterCancel, '</div> <div class="btn btn-danger luckysheet-mousedown-cancel" id="luckysheet-${menuid}-initial">').concat(e.clearFilter, "</div></div></div> </div>") } function wn() { var e = gn().filter; return '<div style="z-index:1004;overflow-y:auto;" class="luckysheet-filter-submenu luckysheet-cols-menu luckysheet-mousedown-cancel" id="luckysheet-${menuid}-submenu"><div data-value="null" data-type="0" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">'.concat(e.conditionNone, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="cellnull" data-type="0"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellIsNull, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="cellnonull" data-type="0"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellNotNull, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="textinclude"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellTextContain, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="textnotinclude"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellTextNotContain, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="textstart"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellTextStart, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="textend"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellTextEnd, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="textequal"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellTextEqual, '</div></div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="dateequal"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellDateEqual, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="datelessthan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellDateBefore, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="datemorethan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellDateAfter, '</div></div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="morethan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellGreater, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="moreequalthan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellGreaterEqual, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="lessthan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellLess, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="lessequalthan"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellLessEqual, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="equal"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellEqual, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="noequal"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellNotEqual, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="include" data-type="2"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellBetween, '</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-value="noinclude" data-type="2"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">').concat(e.conditionCellNotBetween, "</div></div> </div>") } var _n = function () { return '<div id="luckysheetloadingdata" style="width:100%;text-align:center;position:absolute;top:0px;height:100%;font-size: 16px;z-index:1000000000;background:#fff;"><div style="position:relative;top:45%;width:100%;"> <div class="luckysheetLoaderGif"></div> <span>' + gn().info.loading + "...</span></div></div>" }, Cn = ["#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"], Tn = 8, An = 9, Sn = 13, In = 20, Rn = 27, $n = 37, qn = 38, Dn = 39, Fn = 40, En = 46, Mn = 91, Nn = 92, Pn = 93, zn = 113, Ln = 115, On = "#000000", Bn = "middle", Vn = "#dfdfdf", Hn = function () { return "normal normal normal " + ga.defaultFontSize + "pt " + gn().fontarray[0] + ', "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "WenQuanYi Micro Hei", sans-serif' }, Un = new Image; Un.src = "data:image/png;base64,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"; var jn = { "border-top": " iconfont luckysheet-iconfont-shangbiankuang", "border-bottom": " iconfont luckysheet-iconfont-xiabiankuang", "border-left": " iconfont luckysheet-iconfont-zuobiankuang", "border-right": " iconfont luckysheet-iconfont-youbiankuang", "border-none": " iconfont luckysheet-iconfont-wubiankuang", "border-all": " iconfont luckysheet-iconfont-quanjiabiankuang", "border-outside": " iconfont luckysheet-iconfont-sizhoujiabiankuang", "border-inside": " iconfont luckysheet-iconfont-neikuangxian", "border-horizontal": " iconfont luckysheet-iconfont-neikuanghengxian", "border-vertical": " iconfont luckysheet-iconfont-neikuangshuxian" }, Gn = { left: " iconfont luckysheet-iconfont-wenbenzuoduiqi", center: " iconfont luckysheet-iconfont-wenbenjuzhongduiqi", right: " iconfont luckysheet-iconfont-wenbenyouduiqi", top: " iconfont luckysheet-iconfont-dingbuduiqi", middle: " iconfont luckysheet-iconfont-shuipingduiqi", bottom: " iconfont luckysheet-iconfont-dibuduiqi" }, Wn = { overflow: " iconfont luckysheet-iconfont-yichu1", wrap: " iconfont luckysheet-iconfont-zidonghuanhang", clip: " iconfont luckysheet-iconfont-jieduan" }, Yn = { none: " iconfont luckysheet-iconfont-wuxuanzhuang", angleup: " iconfont luckysheet-iconfont-xiangshangqingxie", angledown: " iconfont luckysheet-iconfont-xiangxiaqingxie", vertical: " iconfont luckysheet-iconfont-shupaiwenzi", "rotation-up": " iconfont luckysheet-iconfont-wenbenxiangshang", "rotation-down": " iconfont luckysheet-iconfont-xiangxia90" }; var Xn = ot.trim; Ee({ target: "String", proto: !0, forced: function (e) { return o((function () { return !!at[e]() || "​…᠎" != "​…᠎"[e]() || at[e].name !== e })) }("trim") }, { trim: function () { return Xn(this) } }); var Kn = o((function () { Ye(1) })); Ee({ target: "Object", stat: !0, forced: Kn }, { keys: function (e) { return Ye(na(e)) } }); var Zn = F.f, Qn = Function.prototype, Jn = Qn.toString, el = /^\s*function ([^ (]*)/; s && !("name" in Qn) && Zn(Qn, "name", { configurable: !0, get: function () { try { return Jn.call(this).match(el)[1] } catch (e) { return "" } } }); var tl = we.f, al = {}.toString, rl = "object" == typeof window && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [], nl = function (e) { return rl && "[object Window]" == al.call(e) ? function (e) { try { return tl(e) } catch (e) { return rl.slice() } }(e) : tl(b(e)) }, ll = o((function () { return !Object.getOwnPropertyNames(1) })); Ee({ target: "Object", stat: !0, forced: ll }, { getOwnPropertyNames: nl }); var il = $t("species"), ol = function (e) { var t = oe(e), a = F.f; s && t && !t[il] && a(t, il, { configurable: !0, get: function () { return this } }) }, sl = F.f, cl = we.f, ul = re.set, dl = $t("match"), hl = l.RegExp, ml = hl.prototype, pl = /a/g, fl = /a/g, gl = new hl(pl) !== pl, vl = Lt.UNSUPPORTED_Y; if (s && De("RegExp", !gl || vl || o((function () { return fl[dl] = !1, hl(pl) != pl || hl(fl) == fl || "/a/i" != hl(pl, "i") })))) { for (var yl = function (e, t) { var a, r = this instanceof yl, n = Nr(e), l = void 0 === t; if (!r && n && e.constructor === yl && l) return e; gl ? n && !l && (e = e.source) : e instanceof yl && (l && (t = Pt.call(e)), e = e.source), vl && (a = !!t && t.indexOf("y") > -1) && (t = t.replace(/y/g, "")); var i = We(gl ? new hl(e, t) : hl(e, t), r ? this : ml, yl); return vl && a && ul(i, { sticky: a }), i }, bl = function (e) { e in yl || sl(yl, e, { configurable: !0, get: function () { return hl[e] }, set: function (t) { hl[e] = t } }) }, kl = cl(hl), xl = 0; kl.length > xl;)bl(kl[xl++]); ml.constructor = yl, yl.prototype = ml, ne(l, "RegExp", yl) } ol("RegExp"), Ee({ target: "String", proto: !0 }, { repeat: kt }); var wl = Object.is || function (e, t) { return e === t ? 0 !== e || 1 / e == 1 / t : e != e && t != t }; function _l(e) { for (var t = 0; t < ga.luckysheetfile.length; t++)if (ga.luckysheetfile[t].index == e) return t; return null } function Cl(e, t, a) { var r = ""; null == a && (a = ga.currentSheetIndex), e != a && (r = ga.luckysheetfile[_l(e)].name.replace(/'/g, "''"), /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/.test(r) ? r += "!" : r = "'" + r + "'!"); 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) } function Tl(e) { return e && ga.luckysheetfile.forEach((function (e) { e.chart && e.chart.forEach((function (e) { var t = ga.getChartJson(e.chart_id); e.chartOptions = t })) })), ga.luckysheetfile } function Al() { return ga.visibledatarow } function Sl() { return ga.visibledatacolumn } function Il(e) { ga.luckysheet_scroll_status = e } function Rl(e) { ga.luckysheetfile = e } ra("search", 1, (function (e, t, a) { return [function (t) { var a = y(this), r = null == t ? void 0 : t[e]; return void 0 !== r ? r.call(t, a) : new RegExp(t)[e](String(a)) }, function (e) { var r = a(t, e, this); if (r.done) return r.value; var n = q(e), l = String(this), i = n.lastIndex; wl(i, 0) || (n.lastIndex = 0); var o = ca(n, l); return wl(n.lastIndex, i) || (n.lastIndex = i), null === o ? -1 : o.index }] })); var $l = ve.includes, ql = Le("indexOf", { ACCESSORS: !0, 1: 0 }); Ee({ target: "Array", proto: !0, forced: !ql }, { includes: function (e) { return $l(this, e, arguments.length > 1 ? arguments[1] : void 0) } }), or("includes"); var Dl = nr.map, Fl = Xa("map"), El = Le("map"); Ee({ target: "Array", proto: !0, forced: !Fl || !El }, { map: function (e) { return Dl(this, e, arguments.length > 1 ? arguments[1] : void 0) } }); var Ml = { mobilecheck: function () { var e, t = !1; return e = navigator.userAgent || navigator.vendor || window.opera, (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0, 4))) && (t = !0), document.body && document.body.clientWidth && document.body.clientHeight && document.body.clientWidth < 350 && document.body.clientHeight < 500 && (t = !0), t }, iphoneCheck: function () { return /iPhone/i.test(navigator.userAgent) && !0, !0 }, isWeixin: function () { return "micromessenger" == navigator.userAgent.toLowerCase().match(/MicroMessenger/i) }, isAndroid: function () { var e = navigator.userAgent; return e.indexOf("Android") > -1 || e.indexOf("Linux") > -1 }, tabletCheck: function () { return /ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase()) }, BrowserType: function () { var e = navigator.userAgent, t = e.indexOf("Opera") > -1, a = e.indexOf("compatible") > -1 && e.indexOf("MSIE") > -1 && !t, r = e.indexOf("Trident") > -1 && e.indexOf("rv:11.0") > -1, n = e.indexOf("Edge") > -1, l = e.indexOf("Firefox") > -1, i = e.indexOf("Safari") > -1 && -1 == e.indexOf("Chrome"), o = e.indexOf("Chrome") > -1 && e.indexOf("Safari") > -1; if (a) { new RegExp("MSIE (\\d+\\.\\d+);").test(e); var s = parseFloat(RegExp.$1); return 7 == s ? "IE7" : 8 == s ? "IE8" : 9 == s ? "IE9" : 10 == s ? "IE10" : "0" } return l ? "FF" : t ? "Opera" : i ? "Safari" : o ? "Chrome" : n ? "Edge" : r ? "IE11" : void 0 }, isIE: function () { var e = navigator.userAgent, t = e.indexOf("Opera") > -1, a = e.indexOf("compatible") > -1 && e.indexOf("MSIE") > -1 && !t, r = e.indexOf("Trident") > -1 && e.indexOf("rv:11.0") > -1; return a || r ? "1" : "-1" }, IEVersion: function () { var e = navigator.userAgent, t = e.indexOf("Opera") > -1, a = e.indexOf("compatible") > -1 && e.indexOf("MSIE") > -1 && !t, r = e.indexOf("Trident") > -1 && e.indexOf("rv:11.0") > -1, n = e.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !a; if (a) { new RegExp("MSIE (\\d+\\.\\d+);").test(e); var l = parseFloat(RegExp.$1); return 7 == l ? "IE7" : 8 == l ? "IE8" : 9 == l ? "IE9" : 10 == l ? "IE10" : "0" } return n ? "Edge" : r ? "IE11" : "-1" }, luckysheetrefreshfixednum: null, luckysheetrefreshfixed: function () { return null == this.luckysheetrefreshfixednum && ("FF" == this.BrowserType() ? this.luckysheetrefreshfixednum = 5 : this.luckysheetrefreshfixednum = 0), this.luckysheetrefreshfixednum }, detectOS: function () { var e = navigator.userAgent, t = "Win32" == navigator.platform || "Windows" == navigator.platform, a = "Mac68K" == navigator.platform || "MacPPC" == navigator.platform || "Macintosh" == navigator.platform || "MacIntel" == navigator.platform; if (a) return "Mac"; if ("X11" == navigator.platform && !t && !a) return "Unix"; if (String(navigator.platform).indexOf("Linux") > -1) return "Linux"; if (t) { if (e.indexOf("Windows NT 5.0") > -1 || e.indexOf("Windows 2000") > -1) return "Win2000"; if (e.indexOf("Windows NT 5.1") > -1 || e.indexOf("Windows XP") > -1) return "WinXP"; if (e.indexOf("Windows NT 5.2") > -1 || e.indexOf("Windows 2003") > -1) return "Win2003"; if (e.indexOf("Windows NT 6.0") > -1 || e.indexOf("Windows Vista") > -1) return "WinVista"; if (e.indexOf("Windows NT 6.1") > -1 || e.indexOf("Windows 7") > -1) return "Win7" } return "other" } }, Nl = a((function (e, t) { var a = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array; function r(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } t.assign = function (e) { for (var t = Array.prototype.slice.call(arguments, 1); t.length;) { var a = t.shift(); if (a) { if ("object" != typeof a) throw new TypeError(a + "must be non-object"); for (var n in a) r(a, n) && (e[n] = a[n]) } } return e }, t.shrinkBuf = function (e, t) { return e.length === t ? e : e.subarray ? e.subarray(0, t) : (e.length = t, e) }; var n = { arraySet: function (e, t, a, r, n) { if (t.subarray && e.subarray) e.set(t.subarray(a, a + r), n); else for (var l = 0; l < r; l++)e[n + l] = t[a + l] }, flattenChunks: function (e) { var t, a, r, n, l, i; for (r = 0, t = 0, a = e.length; t < a; t++)r += e[t].length; for (i = new Uint8Array(r), n = 0, t = 0, a = e.length; t < a; t++)l = e[t], i.set(l, n), n += l.length; return i } }, l = { arraySet: function (e, t, a, r, n) { for (var l = 0; l < r; l++)e[n + l] = t[a + l] }, flattenChunks: function (e) { return [].concat.apply([], e) } }; t.setTyped = function (e) { e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, n)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, l)) }, t.setTyped(a) })); function Pl(e) { for (var t = e.length; --t >= 0;)e[t] = 0 } var zl = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], Ll = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], Ol = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], Bl = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], Vl = new Array(576); Pl(Vl); var Hl = new Array(60); Pl(Hl); var Ul = new Array(512); Pl(Ul); var jl = new Array(256); Pl(jl); var Gl = new Array(29); Pl(Gl); var Wl, Yl, Xl, Kl = new Array(30); function Zl(e, t, a, r, n) { this.static_tree = e, this.extra_bits = t, this.extra_base = a, this.elems = r, this.max_length = n, this.has_stree = e && e.length } function Ql(e, t) { this.dyn_tree = e, this.max_code = 0, this.stat_desc = t } function Jl(e) { return e < 256 ? Ul[e] : Ul[256 + (e >>> 7)] } function ei(e, t) { e.pending_buf[e.pending++] = 255 & t, e.pending_buf[e.pending++] = t >>> 8 & 255 } function ti(e, t, a) { e.bi_valid > 16 - a ? (e.bi_buf |= t << e.bi_valid & 65535, ei(e, e.bi_buf), e.bi_buf = t >> 16 - e.bi_valid, e.bi_valid += a - 16) : (e.bi_buf |= t << e.bi_valid & 65535, e.bi_valid += a) } function ai(e, t, a) { ti(e, a[2 * t], a[2 * t + 1]) } function ri(e, t) { var a = 0; do { a |= 1 & e, e >>>= 1, a <<= 1 } while (--t > 0); return a >>> 1 } function ni(e, t, a) { var r, n, l = new Array(16), i = 0; for (r = 1; r <= 15; r++)l[r] = i = i + a[r - 1] << 1; for (n = 0; n <= t; n++) { var o = e[2 * n + 1]; 0 !== o && (e[2 * n] = ri(l[o]++, o)) } } function li(e) { var t; for (t = 0; t < 286; t++)e.dyn_ltree[2 * t] = 0; for (t = 0; t < 30; t++)e.dyn_dtree[2 * t] = 0; for (t = 0; t < 19; t++)e.bl_tree[2 * t] = 0; e.dyn_ltree[512] = 1, e.opt_len = e.static_len = 0, e.last_lit = e.matches = 0 } function ii(e) { e.bi_valid > 8 ? ei(e, e.bi_buf) : e.bi_valid > 0 && (e.pending_buf[e.pending++] = e.bi_buf), e.bi_buf = 0, e.bi_valid = 0 } function oi(e, t, a, r) { var n = 2 * t, l = 2 * a; return e[n] < e[l] || e[n] === e[l] && r[t] <= r[a] } function si(e, t, a) { for (var r = e.heap[a], n = a << 1; n <= e.heap_len && (n < e.heap_len && oi(t, e.heap[n + 1], e.heap[n], e.depth) && n++, !oi(t, r, e.heap[n], e.depth));)e.heap[a] = e.heap[n], a = n, n <<= 1; e.heap[a] = r } function ci(e, t, a) { var r, n, l, i, o = 0; if (0 !== e.last_lit) do { r = e.pending_buf[e.d_buf + 2 * o] << 8 | e.pending_buf[e.d_buf + 2 * o + 1], n = e.pending_buf[e.l_buf + o], o++, 0 === r ? ai(e, n, t) : (ai(e, (l = jl[n]) + 256 + 1, t), 0 !== (i = zl[l]) && ti(e, n -= Gl[l], i), ai(e, l = Jl(--r), a), 0 !== (i = Ll[l]) && ti(e, r -= Kl[l], i)) } while (o < e.last_lit); ai(e, 256, t) } function ui(e, t) { var a, r, n, l = t.dyn_tree, i = t.stat_desc.static_tree, o = t.stat_desc.has_stree, s = t.stat_desc.elems, c = -1; for (e.heap_len = 0, e.heap_max = 573, a = 0; a < s; a++)0 !== l[2 * a] ? (e.heap[++e.heap_len] = c = a, e.depth[a] = 0) : l[2 * a + 1] = 0; for (; e.heap_len < 2;)l[2 * (n = e.heap[++e.heap_len] = c < 2 ? ++c : 0)] = 1, e.depth[n] = 0, e.opt_len--, o && (e.static_len -= i[2 * n + 1]); for (t.max_code = c, a = e.heap_len >> 1; a >= 1; a--)si(e, l, a); n = s; do { a = e.heap[1], e.heap[1] = e.heap[e.heap_len--], si(e, l, 1), r = e.heap[1], e.heap[--e.heap_max] = a, e.heap[--e.heap_max] = r, l[2 * n] = l[2 * a] + l[2 * r], e.depth[n] = (e.depth[a] >= e.depth[r] ? e.depth[a] : e.depth[r]) + 1, l[2 * a + 1] = l[2 * r + 1] = n, e.heap[1] = n++, si(e, l, 1) } while (e.heap_len >= 2); e.heap[--e.heap_max] = e.heap[1], function (e, t) { var a, r, n, l, i, o, s = t.dyn_tree, c = t.max_code, u = t.stat_desc.static_tree, d = t.stat_desc.has_stree, h = t.stat_desc.extra_bits, m = t.stat_desc.extra_base, p = t.stat_desc.max_length, f = 0; for (l = 0; l <= 15; l++)e.bl_count[l] = 0; for (s[2 * e.heap[e.heap_max] + 1] = 0, a = e.heap_max + 1; a < 573; a++)(l = s[2 * s[2 * (r = e.heap[a]) + 1] + 1] + 1) > p && (l = p, f++), s[2 * r + 1] = l, r > c || (e.bl_count[l]++, i = 0, r >= m && (i = h[r - m]), o = s[2 * r], e.opt_len += o * (l + i), d && (e.static_len += o * (u[2 * r + 1] + i))); if (0 !== f) { do { for (l = p - 1; 0 === e.bl_count[l];)l--; e.bl_count[l]--, e.bl_count[l + 1] += 2, e.bl_count[p]--, f -= 2 } while (f > 0); for (l = p; 0 !== l; l--)for (r = e.bl_count[l]; 0 !== r;)(n = e.heap[--a]) > c || (s[2 * n + 1] !== l && (e.opt_len += (l - s[2 * n + 1]) * s[2 * n], s[2 * n + 1] = l), r--) } }(e, t), ni(l, c, e.bl_count) } function di(e, t, a) { var r, n, l = -1, i = t[1], o = 0, s = 7, c = 4; for (0 === i && (s = 138, c = 3), t[2 * (a + 1) + 1] = 65535, r = 0; r <= a; r++)n = i, i = t[2 * (r + 1) + 1], ++o < s && n === i || (o < c ? e.bl_tree[2 * n] += o : 0 !== n ? (n !== l && e.bl_tree[2 * n]++, e.bl_tree[32]++) : o <= 10 ? e.bl_tree[34]++ : e.bl_tree[36]++, o = 0, l = n, 0 === i ? (s = 138, c = 3) : n === i ? (s = 6, c = 3) : (s = 7, c = 4)) } function hi(e, t, a) { var r, n, l = -1, i = t[1], o = 0, s = 7, c = 4; for (0 === i && (s = 138, c = 3), r = 0; r <= a; r++)if (n = i, i = t[2 * (r + 1) + 1], !(++o < s && n === i)) { if (o < c) do { ai(e, n, e.bl_tree) } while (0 != --o); else 0 !== n ? (n !== l && (ai(e, n, e.bl_tree), o--), ai(e, 16, e.bl_tree), ti(e, o - 3, 2)) : o <= 10 ? (ai(e, 17, e.bl_tree), ti(e, o - 3, 3)) : (ai(e, 18, e.bl_tree), ti(e, o - 11, 7)); o = 0, l = n, 0 === i ? (s = 138, c = 3) : n === i ? (s = 6, c = 3) : (s = 7, c = 4) } } Pl(Kl); var mi = !1; function pi(e, t, a, r) { ti(e, 0 + (r ? 1 : 0), 3), function (e, t, a, r) { ii(e), r && (ei(e, a), ei(e, ~a)), Nl.arraySet(e.pending_buf, e.window, t, a, e.pending), e.pending += a }(e, t, a, !0) } var fi = { _tr_init: function (e) { mi || (!function () { var e, t, a, r, n, l = new Array(16); for (a = 0, r = 0; r < 28; r++)for (Gl[r] = a, e = 0; e < 1 << zl[r]; e++)jl[a++] = r; for (jl[a - 1] = r, n = 0, r = 0; r < 16; r++)for (Kl[r] = n, e = 0; e < 1 << Ll[r]; e++)Ul[n++] = r; for (n >>= 7; r < 30; r++)for (Kl[r] = n << 7, e = 0; e < 1 << Ll[r] - 7; e++)Ul[256 + n++] = r; for (t = 0; t <= 15; t++)l[t] = 0; for (e = 0; e <= 143;)Vl[2 * e + 1] = 8, e++, l[8]++; for (; e <= 255;)Vl[2 * e + 1] = 9, e++, l[9]++; for (; e <= 279;)Vl[2 * e + 1] = 7, e++, l[7]++; for (; e <= 287;)Vl[2 * e + 1] = 8, e++, l[8]++; for (ni(Vl, 287, l), e = 0; e < 30; e++)Hl[2 * e + 1] = 5, Hl[2 * e] = ri(e, 5); Wl = new Zl(Vl, zl, 257, 286, 15), Yl = new Zl(Hl, Ll, 0, 30, 15), Xl = new Zl(new Array(0), Ol, 0, 19, 7) }(), mi = !0), e.l_desc = new Ql(e.dyn_ltree, Wl), e.d_desc = new Ql(e.dyn_dtree, Yl), e.bl_desc = new Ql(e.bl_tree, Xl), e.bi_buf = 0, e.bi_valid = 0, li(e) }, _tr_stored_block: pi, _tr_flush_block: function (e, t, a, r) { var n, l, i = 0; e.level > 0 ? (2 === e.strm.data_type && (e.strm.data_type = function (e) { var t, a = 4093624447; for (t = 0; t <= 31; t++, a >>>= 1)if (1 & a && 0 !== e.dyn_ltree[2 * t]) return 0; if (0 !== e.dyn_ltree[18] || 0 !== e.dyn_ltree[20] || 0 !== e.dyn_ltree[26]) return 1; for (t = 32; t < 256; t++)if (0 !== e.dyn_ltree[2 * t]) return 1; return 0 }(e)), ui(e, e.l_desc), ui(e, e.d_desc), i = function (e) { var t; for (di(e, e.dyn_ltree, e.l_desc.max_code), di(e, e.dyn_dtree, e.d_desc.max_code), ui(e, e.bl_desc), t = 18; t >= 3 && 0 === e.bl_tree[2 * Bl[t] + 1]; t--); return e.opt_len += 3 * (t + 1) + 5 + 5 + 4, t }(e), n = e.opt_len + 3 + 7 >>> 3, (l = e.static_len + 3 + 7 >>> 3) <= n && (n = l)) : n = l = a + 5, a + 4 <= n && -1 !== t ? pi(e, t, a, r) : 4 === e.strategy || l === n ? (ti(e, 2 + (r ? 1 : 0), 3), ci(e, Vl, Hl)) : (ti(e, 4 + (r ? 1 : 0), 3), function (e, t, a, r) { var n; for (ti(e, t - 257, 5), ti(e, a - 1, 5), ti(e, r - 4, 4), n = 0; n < r; n++)ti(e, e.bl_tree[2 * Bl[n] + 1], 3); hi(e, e.dyn_ltree, t - 1), hi(e, e.dyn_dtree, a - 1) }(e, e.l_desc.max_code + 1, e.d_desc.max_code + 1, i + 1), ci(e, e.dyn_ltree, e.dyn_dtree)), li(e), r && ii(e) }, _tr_tally: function (e, t, a) { return e.pending_buf[e.d_buf + 2 * e.last_lit] = t >>> 8 & 255, e.pending_buf[e.d_buf + 2 * e.last_lit + 1] = 255 & t, e.pending_buf[e.l_buf + e.last_lit] = 255 & a, e.last_lit++, 0 === t ? e.dyn_ltree[2 * a]++ : (e.matches++, t--, e.dyn_ltree[2 * (jl[a] + 256 + 1)]++, e.dyn_dtree[2 * Jl(t)]++), e.last_lit === e.lit_bufsize - 1 }, _tr_align: function (e) { ti(e, 2, 3), ai(e, 256, Vl), function (e) { 16 === e.bi_valid ? (ei(e, e.bi_buf), e.bi_buf = 0, e.bi_valid = 0) : e.bi_valid >= 8 && (e.pending_buf[e.pending++] = 255 & e.bi_buf, e.bi_buf >>= 8, e.bi_valid -= 8) }(e) } }; var gi = function (e, t, a, r) { for (var n = 65535 & e | 0, l = e >>> 16 & 65535 | 0, i = 0; 0 !== a;) { a -= i = a > 2e3 ? 2e3 : a; do { l = l + (n = n + t[r++] | 0) | 0 } while (--i); n %= 65521, l %= 65521 } return n | l << 16 | 0 }; var vi = function () { for (var e, t = [], a = 0; a < 256; a++) { e = a; for (var r = 0; r < 8; r++)e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1; t[a] = e } return t }(); var yi, bi = function (e, t, a, r) { var n = vi, l = r + a; e ^= -1; for (var i = r; i < l; i++)e = e >>> 8 ^ n[255 & (e ^ t[i])]; return -1 ^ e }, ki = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" }; function xi(e, t) { return e.msg = ki[t], t } function wi(e) { return (e << 1) - (e > 4 ? 9 : 0) } function _i(e) { for (var t = e.length; --t >= 0;)e[t] = 0 } function Ci(e) { var t = e.state, a = t.pending; a > e.avail_out && (a = e.avail_out), 0 !== a && (Nl.arraySet(e.output, t.pending_buf, t.pending_out, a, e.next_out), e.next_out += a, t.pending_out += a, e.total_out += a, e.avail_out -= a, t.pending -= a, 0 === t.pending && (t.pending_out = 0)) } function Ti(e, t) { fi._tr_flush_block(e, e.block_start >= 0 ? e.block_start : -1, e.strstart - e.block_start, t), e.block_start = e.strstart, Ci(e.strm) } function Ai(e, t) { e.pending_buf[e.pending++] = t } function Si(e, t) { e.pending_buf[e.pending++] = t >>> 8 & 255, e.pending_buf[e.pending++] = 255 & t } function Ii(e, t) { var a, r, n = e.max_chain_length, l = e.strstart, i = e.prev_length, o = e.nice_match, s = e.strstart > e.w_size - 262 ? e.strstart - (e.w_size - 262) : 0, c = e.window, u = e.w_mask, d = e.prev, h = e.strstart + 258, m = c[l + i - 1], p = c[l + i]; e.prev_length >= e.good_match && (n >>= 2), o > e.lookahead && (o = e.lookahead); do { if (c[(a = t) + i] === p && c[a + i - 1] === m && c[a] === c[l] && c[++a] === c[l + 1]) { l += 2, a++; do { } while (c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && c[++l] === c[++a] && l < h); if (r = 258 - (h - l), l = h - 258, r > i) { if (e.match_start = t, i = r, r >= o) break; m = c[l + i - 1], p = c[l + i] } } } while ((t = d[t & u]) > s && 0 != --n); return i <= e.lookahead ? i : e.lookahead } function Ri(e) { var t, a, r, n, l, i, o, s, c, u, d = e.w_size; do { if (n = e.window_size - e.lookahead - e.strstart, e.strstart >= d + (d - 262)) { Nl.arraySet(e.window, e.window, d, d, 0), e.match_start -= d, e.strstart -= d, e.block_start -= d, t = a = e.hash_size; do { r = e.head[--t], e.head[t] = r >= d ? r - d : 0 } while (--a); t = a = d; do { r = e.prev[--t], e.prev[t] = r >= d ? r - d : 0 } while (--a); n += d } if (0 === e.strm.avail_in) break; if (i = e.strm, o = e.window, s = e.strstart + e.lookahead, c = n, u = void 0, (u = i.avail_in) > c && (u = c), a = 0 === u ? 0 : (i.avail_in -= u, Nl.arraySet(o, i.input, i.next_in, u, s), 1 === i.state.wrap ? i.adler = gi(i.adler, o, u, s) : 2 === i.state.wrap && (i.adler = bi(i.adler, o, u, s)), i.next_in += u, i.total_in += u, u), e.lookahead += a, e.lookahead + e.insert >= 3) for (l = e.strstart - e.insert, e.ins_h = e.window[l], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 1]) & e.hash_mask; e.insert && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 3 - 1]) & e.hash_mask, e.prev[l & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = l, l++, e.insert--, !(e.lookahead + e.insert < 3));); } while (e.lookahead < 262 && 0 !== e.strm.avail_in) } function $i(e, t) { for (var a, r; ;) { if (e.lookahead < 262) { if (Ri(e), e.lookahead < 262 && 0 === t) return 1; if (0 === e.lookahead) break } if (a = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, a = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), 0 !== a && e.strstart - a <= e.w_size - 262 && (e.match_length = Ii(e, a)), e.match_length >= 3) if (r = fi._tr_tally(e, e.strstart - e.match_start, e.match_length - 3), e.lookahead -= e.match_length, e.match_length <= e.max_lazy_match && e.lookahead >= 3) { e.match_length--; do { e.strstart++, e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, a = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart } while (0 != --e.match_length); e.strstart++ } else e.strstart += e.match_length, e.match_length = 0, e.ins_h = e.window[e.strstart], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 1]) & e.hash_mask; else r = fi._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++; if (r && (Ti(e, !1), 0 === e.strm.avail_out)) return 1 } return e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (Ti(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (Ti(e, !1), 0 === e.strm.avail_out) ? 1 : 2 } function qi(e, t) { for (var a, r, n; ;) { if (e.lookahead < 262) { if (Ri(e), e.lookahead < 262 && 0 === t) return 1; if (0 === e.lookahead) break } if (a = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, a = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), e.prev_length = e.match_length, e.prev_match = e.match_start, e.match_length = 2, 0 !== a && e.prev_length < e.max_lazy_match && e.strstart - a <= e.w_size - 262 && (e.match_length = Ii(e, a), e.match_length <= 5 && (1 === e.strategy || 3 === e.match_length && e.strstart - e.match_start > 4096) && (e.match_length = 2)), e.prev_length >= 3 && e.match_length <= e.prev_length) { n = e.strstart + e.lookahead - 3, r = fi._tr_tally(e, e.strstart - 1 - e.prev_match, e.prev_length - 3), e.lookahead -= e.prev_length - 1, e.prev_length -= 2; do { ++e.strstart <= n && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, a = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart) } while (0 != --e.prev_length); if (e.match_available = 0, e.match_length = 2, e.strstart++, r && (Ti(e, !1), 0 === e.strm.avail_out)) return 1 } else if (e.match_available) { if ((r = fi._tr_tally(e, 0, e.window[e.strstart - 1])) && Ti(e, !1), e.strstart++, e.lookahead--, 0 === e.strm.avail_out) return 1 } else e.match_available = 1, e.strstart++, e.lookahead-- } return e.match_available && (r = fi._tr_tally(e, 0, e.window[e.strstart - 1]), e.match_available = 0), e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (Ti(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (Ti(e, !1), 0 === e.strm.avail_out) ? 1 : 2 } function Di(e, t, a, r, n) { this.good_length = e, this.max_lazy = t, this.nice_length = a, this.max_chain = r, this.func = n } function Fi() { this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new Nl.Buf16(1146), this.dyn_dtree = new Nl.Buf16(122), this.bl_tree = new Nl.Buf16(78), _i(this.dyn_ltree), _i(this.dyn_dtree), _i(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new Nl.Buf16(16), this.heap = new Nl.Buf16(573), _i(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new Nl.Buf16(573), _i(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0 } function Ei(e) { var t; return e && e.state ? (e.total_in = e.total_out = 0, e.data_type = 2, (t = e.state).pending = 0, t.pending_out = 0, t.wrap < 0 && (t.wrap = -t.wrap), t.status = t.wrap ? 42 : 113, e.adler = 2 === t.wrap ? 0 : 1, t.last_flush = 0, fi._tr_init(t), 0) : xi(e, -2) } function Mi(e) { var t, a = Ei(e); return 0 === a && ((t = e.state).window_size = 2 * t.w_size, _i(t.head), t.max_lazy_match = yi[t.level].max_lazy, t.good_match = yi[t.level].good_length, t.nice_match = yi[t.level].nice_length, t.max_chain_length = yi[t.level].max_chain, t.strstart = 0, t.block_start = 0, t.lookahead = 0, t.insert = 0, t.match_length = t.prev_length = 2, t.match_available = 0, t.ins_h = 0), a } function Ni(e, t, a, r, n, l) { if (!e) return -2; var i = 1; if (-1 === t && (t = 6), r < 0 ? (i = 0, r = -r) : r > 15 && (i = 2, r -= 16), n < 1 || n > 9 || 8 !== a || r < 8 || r > 15 || t < 0 || t > 9 || l < 0 || l > 4) return xi(e, -2); 8 === r && (r = 9); var o = new Fi; return e.state = o, o.strm = e, o.wrap = i, o.gzhead = null, o.w_bits = r, o.w_size = 1 << o.w_bits, o.w_mask = o.w_size - 1, o.hash_bits = n + 7, o.hash_size = 1 << o.hash_bits, o.hash_mask = o.hash_size - 1, o.hash_shift = ~~((o.hash_bits + 3 - 1) / 3), o.window = new Nl.Buf8(2 * o.w_size), o.head = new Nl.Buf16(o.hash_size), o.prev = new Nl.Buf16(o.w_size), o.lit_bufsize = 1 << n + 6, o.pending_buf_size = 4 * o.lit_bufsize, o.pending_buf = new Nl.Buf8(o.pending_buf_size), o.d_buf = 1 * o.lit_bufsize, o.l_buf = 3 * o.lit_bufsize, o.level = t, o.strategy = l, o.method = a, Mi(e) } yi = [new Di(0, 0, 0, 0, (function (e, t) { var a = 65535; for (a > e.pending_buf_size - 5 && (a = e.pending_buf_size - 5); ;) { if (e.lookahead <= 1) { if (Ri(e), 0 === e.lookahead && 0 === t) return 1; if (0 === e.lookahead) break } e.strstart += e.lookahead, e.lookahead = 0; var r = e.block_start + a; if ((0 === e.strstart || e.strstart >= r) && (e.lookahead = e.strstart - r, e.strstart = r, Ti(e, !1), 0 === e.strm.avail_out)) return 1; if (e.strstart - e.block_start >= e.w_size - 262 && (Ti(e, !1), 0 === e.strm.avail_out)) return 1 } return e.insert = 0, 4 === t ? (Ti(e, !0), 0 === e.strm.avail_out ? 3 : 4) : (e.strstart > e.block_start && (Ti(e, !1), e.strm.avail_out), 1) })), new Di(4, 4, 8, 4, $i), new Di(4, 5, 16, 8, $i), new Di(4, 6, 32, 32, $i), new Di(4, 4, 16, 16, qi), new Di(8, 16, 32, 32, qi), new Di(8, 16, 128, 128, qi), new Di(8, 32, 128, 256, qi), new Di(32, 128, 258, 1024, qi), new Di(32, 258, 258, 4096, qi)]; var Pi = { deflateInit: function (e, t) { return Ni(e, t, 8, 15, 8, 0) }, deflateInit2: Ni, deflateReset: Mi, deflateResetKeep: Ei, deflateSetHeader: function (e, t) { return e && e.state ? 2 !== e.state.wrap ? -2 : (e.state.gzhead = t, 0) : -2 }, deflate: function (e, t) { var a, r, n, l; if (!e || !e.state || t > 5 || t < 0) return e ? xi(e, -2) : -2; if (r = e.state, !e.output || !e.input && 0 !== e.avail_in || 666 === r.status && 4 !== t) return xi(e, 0 === e.avail_out ? -5 : -2); if (r.strm = e, a = r.last_flush, r.last_flush = t, 42 === r.status) if (2 === r.wrap) e.adler = 0, Ai(r, 31), Ai(r, 139), Ai(r, 8), r.gzhead ? (Ai(r, (r.gzhead.text ? 1 : 0) + (r.gzhead.hcrc ? 2 : 0) + (r.gzhead.extra ? 4 : 0) + (r.gzhead.name ? 8 : 0) + (r.gzhead.comment ? 16 : 0)), Ai(r, 255 & r.gzhead.time), Ai(r, r.gzhead.time >> 8 & 255), Ai(r, r.gzhead.time >> 16 & 255), Ai(r, r.gzhead.time >> 24 & 255), Ai(r, 9 === r.level ? 2 : r.strategy >= 2 || r.level < 2 ? 4 : 0), Ai(r, 255 & r.gzhead.os), r.gzhead.extra && r.gzhead.extra.length && (Ai(r, 255 & r.gzhead.extra.length), Ai(r, r.gzhead.extra.length >> 8 & 255)), r.gzhead.hcrc && (e.adler = bi(e.adler, r.pending_buf, r.pending, 0)), r.gzindex = 0, r.status = 69) : (Ai(r, 0), Ai(r, 0), Ai(r, 0), Ai(r, 0), Ai(r, 0), Ai(r, 9 === r.level ? 2 : r.strategy >= 2 || r.level < 2 ? 4 : 0), Ai(r, 3), r.status = 113); else { var i = 8 + (r.w_bits - 8 << 4) << 8; i |= (r.strategy >= 2 || r.level < 2 ? 0 : r.level < 6 ? 1 : 6 === r.level ? 2 : 3) << 6, 0 !== r.strstart && (i |= 32), i += 31 - i % 31, r.status = 113, Si(r, i), 0 !== r.strstart && (Si(r, e.adler >>> 16), Si(r, 65535 & e.adler)), e.adler = 1 } if (69 === r.status) if (r.gzhead.extra) { for (n = r.pending; r.gzindex < (65535 & r.gzhead.extra.length) && (r.pending !== r.pending_buf_size || (r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), Ci(e), n = r.pending, r.pending !== r.pending_buf_size));)Ai(r, 255 & r.gzhead.extra[r.gzindex]), r.gzindex++; r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), r.gzindex === r.gzhead.extra.length && (r.gzindex = 0, r.status = 73) } else r.status = 73; if (73 === r.status) if (r.gzhead.name) { n = r.pending; do { if (r.pending === r.pending_buf_size && (r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), Ci(e), n = r.pending, r.pending === r.pending_buf_size)) { l = 1; break } l = r.gzindex < r.gzhead.name.length ? 255 & r.gzhead.name.charCodeAt(r.gzindex++) : 0, Ai(r, l) } while (0 !== l); r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), 0 === l && (r.gzindex = 0, r.status = 91) } else r.status = 91; if (91 === r.status) if (r.gzhead.comment) { n = r.pending; do { if (r.pending === r.pending_buf_size && (r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), Ci(e), n = r.pending, r.pending === r.pending_buf_size)) { l = 1; break } l = r.gzindex < r.gzhead.comment.length ? 255 & r.gzhead.comment.charCodeAt(r.gzindex++) : 0, Ai(r, l) } while (0 !== l); r.gzhead.hcrc && r.pending > n && (e.adler = bi(e.adler, r.pending_buf, r.pending - n, n)), 0 === l && (r.status = 103) } else r.status = 103; if (103 === r.status && (r.gzhead.hcrc ? (r.pending + 2 > r.pending_buf_size && Ci(e), r.pending + 2 <= r.pending_buf_size && (Ai(r, 255 & e.adler), Ai(r, e.adler >> 8 & 255), e.adler = 0, r.status = 113)) : r.status = 113), 0 !== r.pending) { if (Ci(e), 0 === e.avail_out) return r.last_flush = -1, 0 } else if (0 === e.avail_in && wi(t) <= wi(a) && 4 !== t) return xi(e, -5); if (666 === r.status && 0 !== e.avail_in) return xi(e, -5); if (0 !== e.avail_in || 0 !== r.lookahead || 0 !== t && 666 !== r.status) { var o = 2 === r.strategy ? function (e, t) { for (var a; ;) { if (0 === e.lookahead && (Ri(e), 0 === e.lookahead)) { if (0 === t) return 1; break } if (e.match_length = 0, a = fi._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++, a && (Ti(e, !1), 0 === e.strm.avail_out)) return 1 } return e.insert = 0, 4 === t ? (Ti(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (Ti(e, !1), 0 === e.strm.avail_out) ? 1 : 2 }(r, t) : 3 === r.strategy ? function (e, t) { for (var a, r, n, l, i = e.window; ;) { if (e.lookahead <= 258) { if (Ri(e), e.lookahead <= 258 && 0 === t) return 1; if (0 === e.lookahead) break } if (e.match_length = 0, e.lookahead >= 3 && e.strstart > 0 && (r = i[n = e.strstart - 1]) === i[++n] && r === i[++n] && r === i[++n]) { l = e.strstart + 258; do { } while (r === i[++n] && r === i[++n] && r === i[++n] && r === i[++n] && r === i[++n] && r === i[++n] && r === i[++n] && r === i[++n] && n < l); e.match_length = 258 - (l - n), e.match_length > e.lookahead && (e.match_length = e.lookahead) } if (e.match_length >= 3 ? (a = fi._tr_tally(e, 1, e.match_length - 3), e.lookahead -= e.match_length, e.strstart += e.match_length, e.match_length = 0) : (a = fi._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++), a && (Ti(e, !1), 0 === e.strm.avail_out)) return 1 } return e.insert = 0, 4 === t ? (Ti(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (Ti(e, !1), 0 === e.strm.avail_out) ? 1 : 2 }(r, t) : yi[r.level].func(r, t); if (3 !== o && 4 !== o || (r.status = 666), 1 === o || 3 === o) return 0 === e.avail_out && (r.last_flush = -1), 0; if (2 === o && (1 === t ? fi._tr_align(r) : 5 !== t && (fi._tr_stored_block(r, 0, 0, !1), 3 === t && (_i(r.head), 0 === r.lookahead && (r.strstart = 0, r.block_start = 0, r.insert = 0))), Ci(e), 0 === e.avail_out)) return r.last_flush = -1, 0 } return 4 !== t ? 0 : r.wrap <= 0 ? 1 : (2 === r.wrap ? (Ai(r, 255 & e.adler), Ai(r, e.adler >> 8 & 255), Ai(r, e.adler >> 16 & 255), Ai(r, e.adler >> 24 & 255), Ai(r, 255 & e.total_in), Ai(r, e.total_in >> 8 & 255), Ai(r, e.total_in >> 16 & 255), Ai(r, e.total_in >> 24 & 255)) : (Si(r, e.adler >>> 16), Si(r, 65535 & e.adler)), Ci(e), r.wrap > 0 && (r.wrap = -r.wrap), 0 !== r.pending ? 0 : 1) }, deflateEnd: function (e) { var t; return e && e.state ? 42 !== (t = e.state.status) && 69 !== t && 73 !== t && 91 !== t && 103 !== t && 113 !== t && 666 !== t ? xi(e, -2) : (e.state = null, 113 === t ? xi(e, -3) : 0) : -2 }, deflateSetDictionary: function (e, t) { var a, r, n, l, i, o, s, c, u = t.length; if (!e || !e.state) return -2; if (2 === (l = (a = e.state).wrap) || 1 === l && 42 !== a.status || a.lookahead) return -2; for (1 === l && (e.adler = gi(e.adler, t, u, 0)), a.wrap = 0, u >= a.w_size && (0 === l && (_i(a.head), a.strstart = 0, a.block_start = 0, a.insert = 0), c = new Nl.Buf8(a.w_size), Nl.arraySet(c, t, u - a.w_size, a.w_size, 0), t = c, u = a.w_size), i = e.avail_in, o = e.next_in, s = e.input, e.avail_in = u, e.next_in = 0, e.input = t, Ri(a); a.lookahead >= 3;) { r = a.strstart, n = a.lookahead - 2; do { a.ins_h = (a.ins_h << a.hash_shift ^ a.window[r + 3 - 1]) & a.hash_mask, a.prev[r & a.w_mask] = a.head[a.ins_h], a.head[a.ins_h] = r, r++ } while (--n); a.strstart = r, a.lookahead = 2, Ri(a) } return a.strstart += a.lookahead, a.block_start = a.strstart, a.insert = a.lookahead, a.lookahead = 0, a.match_length = a.prev_length = 2, a.match_available = 0, e.next_in = o, e.input = s, e.avail_in = i, a.wrap = l, 0 }, deflateInfo: "pako deflate (from Nodeca project)" }, zi = !0, Li = !0; try { String.fromCharCode.apply(null, [0]) } catch (e) { zi = !1 } try { String.fromCharCode.apply(null, new Uint8Array(1)) } catch (e) { Li = !1 } for (var Oi = new Nl.Buf8(256), Bi = 0; Bi < 256; Bi++)Oi[Bi] = Bi >= 252 ? 6 : Bi >= 248 ? 5 : Bi >= 240 ? 4 : Bi >= 224 ? 3 : Bi >= 192 ? 2 : 1; Oi[254] = Oi[254] = 1; function Vi(e, t) { if (t < 65534 && (e.subarray && Li || !e.subarray && zi)) return String.fromCharCode.apply(null, Nl.shrinkBuf(e, t)); for (var a = "", r = 0; r < t; r++)a += String.fromCharCode(e[r]); return a } var Hi = function (e) { var t, a, r, n, l, i = e.length, o = 0; for (n = 0; n < i; n++)55296 == (64512 & (a = e.charCodeAt(n))) && n + 1 < i && 56320 == (64512 & (r = e.charCodeAt(n + 1))) && (a = 65536 + (a - 55296 << 10) + (r - 56320), n++), o += a < 128 ? 1 : a < 2048 ? 2 : a < 65536 ? 3 : 4; for (t = new Nl.Buf8(o), l = 0, n = 0; l < o; n++)55296 == (64512 & (a = e.charCodeAt(n))) && n + 1 < i && 56320 == (64512 & (r = e.charCodeAt(n + 1))) && (a = 65536 + (a - 55296 << 10) + (r - 56320), n++), a < 128 ? t[l++] = a : a < 2048 ? (t[l++] = 192 | a >>> 6, t[l++] = 128 | 63 & a) : a < 65536 ? (t[l++] = 224 | a >>> 12, t[l++] = 128 | a >>> 6 & 63, t[l++] = 128 | 63 & a) : (t[l++] = 240 | a >>> 18, t[l++] = 128 | a >>> 12 & 63, t[l++] = 128 | a >>> 6 & 63, t[l++] = 128 | 63 & a); return t }, Ui = function (e) { return Vi(e, e.length) }, ji = function (e) { for (var t = new Nl.Buf8(e.length), a = 0, r = t.length; a < r; a++)t[a] = e.charCodeAt(a); return t }, Gi = function (e, t) { var a, r, n, l, i = t || e.length, o = new Array(2 * i); for (r = 0, a = 0; a < i;)if ((n = e[a++]) < 128) o[r++] = n; else if ((l = Oi[n]) > 4) o[r++] = 65533, a += l - 1; else { for (n &= 2 === l ? 31 : 3 === l ? 15 : 7; l > 1 && a < i;)n = n << 6 | 63 & e[a++], l--; l > 1 ? o[r++] = 65533 : n < 65536 ? o[r++] = n : (n -= 65536, o[r++] = 55296 | n >> 10 & 1023, o[r++] = 56320 | 1023 & n) } return Vi(o, r) }, Wi = function (e, t) { var a; for ((t = t || e.length) > e.length && (t = e.length), a = t - 1; a >= 0 && 128 == (192 & e[a]);)a--; return a < 0 || 0 === a ? t : a + Oi[e[a]] > t ? a : t }; var Yi = function () { this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0 }, Xi = Object.prototype.toString; function Ki(e) { if (!(this instanceof Ki)) return new Ki(e); this.options = Nl.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, e || {}); var t = this.options; t.raw && t.windowBits > 0 ? t.windowBits = -t.windowBits : t.gzip && t.windowBits > 0 && t.windowBits < 16 && (t.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new Yi, this.strm.avail_out = 0; var a = Pi.deflateInit2(this.strm, t.level, t.method, t.windowBits, t.memLevel, t.strategy); if (0 !== a) throw new Error(ki[a]); if (t.header && Pi.deflateSetHeader(this.strm, t.header), t.dictionary) { var r; if (r = "string" == typeof t.dictionary ? Hi(t.dictionary) : "[object ArrayBuffer]" === Xi.call(t.dictionary) ? new Uint8Array(t.dictionary) : t.dictionary, 0 !== (a = Pi.deflateSetDictionary(this.strm, r))) throw new Error(ki[a]); this._dict_set = !0 } } function Zi(e, t) { var a = new Ki(t); if (a.push(e, !0), a.err) throw a.msg || ki[a.err]; return a.result } Ki.prototype.push = function (e, t) { var a, r, n = this.strm, l = this.options.chunkSize; if (this.ended) return !1; r = t === ~~t ? t : !0 === t ? 4 : 0, "string" == typeof e ? n.input = Hi(e) : "[object ArrayBuffer]" === Xi.call(e) ? n.input = new Uint8Array(e) : n.input = e, n.next_in = 0, n.avail_in = n.input.length; do { if (0 === n.avail_out && (n.output = new Nl.Buf8(l), n.next_out = 0, n.avail_out = l), 1 !== (a = Pi.deflate(n, r)) && 0 !== a) return this.onEnd(a), this.ended = !0, !1; 0 !== n.avail_out && (0 !== n.avail_in || 4 !== r && 2 !== r) || ("string" === this.options.to ? this.onData(Ui(Nl.shrinkBuf(n.output, n.next_out))) : this.onData(Nl.shrinkBuf(n.output, n.next_out))) } while ((n.avail_in > 0 || 0 === n.avail_out) && 1 !== a); return 4 === r ? (a = Pi.deflateEnd(this.strm), this.onEnd(a), this.ended = !0, 0 === a) : 2 !== r || (this.onEnd(0), n.avail_out = 0, !0) }, Ki.prototype.onData = function (e) { this.chunks.push(e) }, Ki.prototype.onEnd = function (e) { 0 === e && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = Nl.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg }; var Qi = { Deflate: Ki, deflate: Zi, deflateRaw: function (e, t) { return (t = t || {}).raw = !0, Zi(e, t) }, gzip: function (e, t) { return (t = t || {}).gzip = !0, Zi(e, t) } }, Ji = function (e, t) { var a, r, n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b, k, x, w, _, C, T, A; a = e.state, r = e.next_in, T = e.input, n = r + (e.avail_in - 5), l = e.next_out, A = e.output, i = l - (t - e.avail_out), o = l + (e.avail_out - 257), s = a.dmax, c = a.wsize, u = a.whave, d = a.wnext, h = a.window, m = a.hold, p = a.bits, f = a.lencode, g = a.distcode, v = (1 << a.lenbits) - 1, y = (1 << a.distbits) - 1; e: do { p < 15 && (m += T[r++] << p, p += 8, m += T[r++] << p, p += 8), b = f[m & v]; t: for (; ;) { if (m >>>= k = b >>> 24, p -= k, 0 === (k = b >>> 16 & 255)) A[l++] = 65535 & b; else { if (!(16 & k)) { if (0 == (64 & k)) { b = f[(65535 & b) + (m & (1 << k) - 1)]; continue t } if (32 & k) { a.mode = 12; break e } e.msg = "invalid literal/length code", a.mode = 30; break e } x = 65535 & b, (k &= 15) && (p < k && (m += T[r++] << p, p += 8), x += m & (1 << k) - 1, m >>>= k, p -= k), p < 15 && (m += T[r++] << p, p += 8, m += T[r++] << p, p += 8), b = g[m & y]; a: for (; ;) { if (m >>>= k = b >>> 24, p -= k, !(16 & (k = b >>> 16 & 255))) { if (0 == (64 & k)) { b = g[(65535 & b) + (m & (1 << k) - 1)]; continue a } e.msg = "invalid distance code", a.mode = 30; break e } if (w = 65535 & b, p < (k &= 15) && (m += T[r++] << p, (p += 8) < k && (m += T[r++] << p, p += 8)), (w += m & (1 << k) - 1) > s) { e.msg = "invalid distance too far back", a.mode = 30; break e } if (m >>>= k, p -= k, w > (k = l - i)) { if ((k = w - k) > u && a.sane) { e.msg = "invalid distance too far back", a.mode = 30; break e } if (_ = 0, C = h, 0 === d) { if (_ += c - k, k < x) { x -= k; do { A[l++] = h[_++] } while (--k); _ = l - w, C = A } } else if (d < k) { if (_ += c + d - k, (k -= d) < x) { x -= k; do { A[l++] = h[_++] } while (--k); if (_ = 0, d < x) { x -= k = d; do { A[l++] = h[_++] } while (--k); _ = l - w, C = A } } } else if (_ += d - k, k < x) { x -= k; do { A[l++] = h[_++] } while (--k); _ = l - w, C = A } for (; x > 2;)A[l++] = C[_++], A[l++] = C[_++], A[l++] = C[_++], x -= 3; x && (A[l++] = C[_++], x > 1 && (A[l++] = C[_++])) } else { _ = l - w; do { A[l++] = A[_++], A[l++] = A[_++], A[l++] = A[_++], x -= 3 } while (x > 2); x && (A[l++] = A[_++], x > 1 && (A[l++] = A[_++])) } break } } break } } while (r < n && l < o); r -= x = p >> 3, m &= (1 << (p -= x << 3)) - 1, e.next_in = r, e.next_out = l, e.avail_in = r < n ? n - r + 5 : 5 - (r - n), e.avail_out = l < o ? o - l + 257 : 257 - (l - o), a.hold = m, a.bits = p }, eo = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], to = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], ao = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], ro = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64], no = function (e, t, a, r, n, l, i, o) { var s, c, u, d, h, m, p, f, g, v = o.bits, y = 0, b = 0, k = 0, x = 0, w = 0, _ = 0, C = 0, T = 0, A = 0, S = 0, I = null, R = 0, $ = new Nl.Buf16(16), q = new Nl.Buf16(16), D = null, F = 0; for (y = 0; y <= 15; y++)$[y] = 0; for (b = 0; b < r; b++)$[t[a + b]]++; for (w = v, x = 15; x >= 1 && 0 === $[x]; x--); if (w > x && (w = x), 0 === x) return n[l++] = 20971520, n[l++] = 20971520, o.bits = 1, 0; for (k = 1; k < x && 0 === $[k]; k++); for (w < k && (w = k), T = 1, y = 1; y <= 15; y++)if (T <<= 1, (T -= $[y]) < 0) return -1; if (T > 0 && (0 === e || 1 !== x)) return -1; for (q[1] = 0, y = 1; y < 15; y++)q[y + 1] = q[y] + $[y]; for (b = 0; b < r; b++)0 !== t[a + b] && (i[q[t[a + b]]++] = b); if (0 === e ? (I = D = i, m = 19) : 1 === e ? (I = eo, R -= 257, D = to, F -= 257, m = 256) : (I = ao, D = ro, m = -1), S = 0, b = 0, y = k, h = l, _ = w, C = 0, u = -1, d = (A = 1 << w) - 1, 1 === e && A > 852 || 2 === e && A > 592) return 1; for (; ;) { p = y - C, i[b] < m ? (f = 0, g = i[b]) : i[b] > m ? (f = D[F + i[b]], g = I[R + i[b]]) : (f = 96, g = 0), s = 1 << y - C, k = c = 1 << _; do { n[h + (S >> C) + (c -= s)] = p << 24 | f << 16 | g | 0 } while (0 !== c); for (s = 1 << y - 1; S & s;)s >>= 1; if (0 !== s ? (S &= s - 1, S += s) : S = 0, b++, 0 == --$[y]) { if (y === x) break; y = t[a + i[b]] } if (y > w && (S & d) !== u) { for (0 === C && (C = w), h += k, T = 1 << (_ = y - C); _ + C < x && !((T -= $[_ + C]) <= 0);)_++, T <<= 1; if (A += 1 << _, 1 === e && A > 852 || 2 === e && A > 592) return 1; n[u = S & d] = w << 24 | _ << 16 | h - l | 0 } } return 0 !== S && (n[h + S] = y - C << 24 | 64 << 16 | 0), o.bits = w, 0 }; function lo(e) { return (e >>> 24 & 255) + (e >>> 8 & 65280) + ((65280 & e) << 8) + ((255 & e) << 24) } function io() { this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new Nl.Buf16(320), this.work = new Nl.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0 } function oo(e) { var t; return e && e.state ? (t = e.state, e.total_in = e.total_out = t.total = 0, e.msg = "", t.wrap && (e.adler = 1 & t.wrap), t.mode = 1, t.last = 0, t.havedict = 0, t.dmax = 32768, t.head = null, t.hold = 0, t.bits = 0, t.lencode = t.lendyn = new Nl.Buf32(852), t.distcode = t.distdyn = new Nl.Buf32(592), t.sane = 1, t.back = -1, 0) : -2 } function so(e) { var t; return e && e.state ? ((t = e.state).wsize = 0, t.whave = 0, t.wnext = 0, oo(e)) : -2 } function co(e, t) { var a, r; return e && e.state ? (r = e.state, t < 0 ? (a = 0, t = -t) : (a = 1 + (t >> 4), t < 48 && (t &= 15)), t && (t < 8 || t > 15) ? -2 : (null !== r.window && r.wbits !== t && (r.window = null), r.wrap = a, r.wbits = t, so(e))) : -2 } function uo(e, t) { var a, r; return e ? (r = new io, e.state = r, r.window = null, 0 !== (a = co(e, t)) && (e.state = null), a) : -2 } var ho, mo, po = !0; function fo(e) { if (po) { var t; for (ho = new Nl.Buf32(512), mo = new Nl.Buf32(32), t = 0; t < 144;)e.lens[t++] = 8; for (; t < 256;)e.lens[t++] = 9; for (; t < 280;)e.lens[t++] = 7; for (; t < 288;)e.lens[t++] = 8; for (no(1, e.lens, 0, 288, ho, 0, e.work, { bits: 9 }), t = 0; t < 32;)e.lens[t++] = 5; no(2, e.lens, 0, 32, mo, 0, e.work, { bits: 5 }), po = !1 } e.lencode = ho, e.lenbits = 9, e.distcode = mo, e.distbits = 5 } function go(e, t, a, r) { var n, l = e.state; return null === l.window && (l.wsize = 1 << l.wbits, l.wnext = 0, l.whave = 0, l.window = new Nl.Buf8(l.wsize)), r >= l.wsize ? (Nl.arraySet(l.window, t, a - l.wsize, l.wsize, 0), l.wnext = 0, l.whave = l.wsize) : ((n = l.wsize - l.wnext) > r && (n = r), Nl.arraySet(l.window, t, a - r, n, l.wnext), (r -= n) ? (Nl.arraySet(l.window, t, a - r, r, 0), l.wnext = r, l.whave = l.wsize) : (l.wnext += n, l.wnext === l.wsize && (l.wnext = 0), l.whave < l.wsize && (l.whave += n))), 0 } var vo = { inflateReset: so, inflateReset2: co, inflateResetKeep: oo, inflateInit: function (e) { return uo(e, 15) }, inflateInit2: uo, inflate: function (e, t) { var a, r, n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b, k, x, w, _, C, T, A = 0, S = new Nl.Buf8(4), I = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; if (!e || !e.state || !e.output || !e.input && 0 !== e.avail_in) return -2; 12 === (a = e.state).mode && (a.mode = 13), i = e.next_out, n = e.output, s = e.avail_out, l = e.next_in, r = e.input, o = e.avail_in, c = a.hold, u = a.bits, d = o, h = s, _ = 0; e: for (; ;)switch (a.mode) { case 1: if (0 === a.wrap) { a.mode = 13; break } for (; u < 16;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (2 & a.wrap && 35615 === c) { a.check = 0, S[0] = 255 & c, S[1] = c >>> 8 & 255, a.check = bi(a.check, S, 2, 0), c = 0, u = 0, a.mode = 2; break } if (a.flags = 0, a.head && (a.head.done = !1), !(1 & a.wrap) || (((255 & c) << 8) + (c >> 8)) % 31) { e.msg = "incorrect header check", a.mode = 30; break } if (8 != (15 & c)) { e.msg = "unknown compression method", a.mode = 30; break } if (u -= 4, w = 8 + (15 & (c >>>= 4)), 0 === a.wbits) a.wbits = w; else if (w > a.wbits) { e.msg = "invalid window size", a.mode = 30; break } a.dmax = 1 << w, e.adler = a.check = 1, a.mode = 512 & c ? 10 : 12, c = 0, u = 0; break; case 2: for (; u < 16;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (a.flags = c, 8 != (255 & a.flags)) { e.msg = "unknown compression method", a.mode = 30; break } if (57344 & a.flags) { e.msg = "unknown header flags set", a.mode = 30; break } a.head && (a.head.text = c >> 8 & 1), 512 & a.flags && (S[0] = 255 & c, S[1] = c >>> 8 & 255, a.check = bi(a.check, S, 2, 0)), c = 0, u = 0, a.mode = 3; case 3: for (; u < 32;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.head && (a.head.time = c), 512 & a.flags && (S[0] = 255 & c, S[1] = c >>> 8 & 255, S[2] = c >>> 16 & 255, S[3] = c >>> 24 & 255, a.check = bi(a.check, S, 4, 0)), c = 0, u = 0, a.mode = 4; case 4: for (; u < 16;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.head && (a.head.xflags = 255 & c, a.head.os = c >> 8), 512 & a.flags && (S[0] = 255 & c, S[1] = c >>> 8 & 255, a.check = bi(a.check, S, 2, 0)), c = 0, u = 0, a.mode = 5; case 5: if (1024 & a.flags) { for (; u < 16;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.length = c, a.head && (a.head.extra_len = c), 512 & a.flags && (S[0] = 255 & c, S[1] = c >>> 8 & 255, a.check = bi(a.check, S, 2, 0)), c = 0, u = 0 } else a.head && (a.head.extra = null); a.mode = 6; case 6: if (1024 & a.flags && ((m = a.length) > o && (m = o), m && (a.head && (w = a.head.extra_len - a.length, a.head.extra || (a.head.extra = new Array(a.head.extra_len)), Nl.arraySet(a.head.extra, r, l, m, w)), 512 & a.flags && (a.check = bi(a.check, r, m, l)), o -= m, l += m, a.length -= m), a.length)) break e; a.length = 0, a.mode = 7; case 7: if (2048 & a.flags) { if (0 === o) break e; m = 0; do { w = r[l + m++], a.head && w && a.length < 65536 && (a.head.name += String.fromCharCode(w)) } while (w && m < o); if (512 & a.flags && (a.check = bi(a.check, r, m, l)), o -= m, l += m, w) break e } else a.head && (a.head.name = null); a.length = 0, a.mode = 8; case 8: if (4096 & a.flags) { if (0 === o) break e; m = 0; do { w = r[l + m++], a.head && w && a.length < 65536 && (a.head.comment += String.fromCharCode(w)) } while (w && m < o); if (512 & a.flags && (a.check = bi(a.check, r, m, l)), o -= m, l += m, w) break e } else a.head && (a.head.comment = null); a.mode = 9; case 9: if (512 & a.flags) { for (; u < 16;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (c !== (65535 & a.check)) { e.msg = "header crc mismatch", a.mode = 30; break } c = 0, u = 0 } a.head && (a.head.hcrc = a.flags >> 9 & 1, a.head.done = !0), e.adler = a.check = 0, a.mode = 12; break; case 10: for (; u < 32;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } e.adler = a.check = lo(c), c = 0, u = 0, a.mode = 11; case 11: if (0 === a.havedict) return e.next_out = i, e.avail_out = s, e.next_in = l, e.avail_in = o, a.hold = c, a.bits = u, 2; e.adler = a.check = 1, a.mode = 12; case 12: if (5 === t || 6 === t) break e; case 13: if (a.last) { c >>>= 7 & u, u -= 7 & u, a.mode = 27; break } for (; u < 3;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } switch (a.last = 1 & c, u -= 1, 3 & (c >>>= 1)) { case 0: a.mode = 14; break; case 1: if (fo(a), a.mode = 20, 6 === t) { c >>>= 2, u -= 2; break e } break; case 2: a.mode = 17; break; case 3: e.msg = "invalid block type", a.mode = 30 }c >>>= 2, u -= 2; break; case 14: for (c >>>= 7 & u, u -= 7 & u; u < 32;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if ((65535 & c) != (c >>> 16 ^ 65535)) { e.msg = "invalid stored block lengths", a.mode = 30; break } if (a.length = 65535 & c, c = 0, u = 0, a.mode = 15, 6 === t) break e; case 15: a.mode = 16; case 16: if (m = a.length) { if (m > o && (m = o), m > s && (m = s), 0 === m) break e; Nl.arraySet(n, r, l, m, i), o -= m, l += m, s -= m, i += m, a.length -= m; break } a.mode = 12; break; case 17: for (; u < 14;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (a.nlen = 257 + (31 & c), c >>>= 5, u -= 5, a.ndist = 1 + (31 & c), c >>>= 5, u -= 5, a.ncode = 4 + (15 & c), c >>>= 4, u -= 4, a.nlen > 286 || a.ndist > 30) { e.msg = "too many length or distance symbols", a.mode = 30; break } a.have = 0, a.mode = 18; case 18: for (; a.have < a.ncode;) { for (; u < 3;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.lens[I[a.have++]] = 7 & c, c >>>= 3, u -= 3 } for (; a.have < 19;)a.lens[I[a.have++]] = 0; if (a.lencode = a.lendyn, a.lenbits = 7, C = { bits: a.lenbits }, _ = no(0, a.lens, 0, 19, a.lencode, 0, a.work, C), a.lenbits = C.bits, _) { e.msg = "invalid code lengths set", a.mode = 30; break } a.have = 0, a.mode = 19; case 19: for (; a.have < a.nlen + a.ndist;) { for (; v = (A = a.lencode[c & (1 << a.lenbits) - 1]) >>> 16 & 255, y = 65535 & A, !((g = A >>> 24) <= u);) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (y < 16) c >>>= g, u -= g, a.lens[a.have++] = y; else { if (16 === y) { for (T = g + 2; u < T;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (c >>>= g, u -= g, 0 === a.have) { e.msg = "invalid bit length repeat", a.mode = 30; break } w = a.lens[a.have - 1], m = 3 + (3 & c), c >>>= 2, u -= 2 } else if (17 === y) { for (T = g + 3; u < T;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } u -= g, w = 0, m = 3 + (7 & (c >>>= g)), c >>>= 3, u -= 3 } else { for (T = g + 7; u < T;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } u -= g, w = 0, m = 11 + (127 & (c >>>= g)), c >>>= 7, u -= 7 } if (a.have + m > a.nlen + a.ndist) { e.msg = "invalid bit length repeat", a.mode = 30; break } for (; m--;)a.lens[a.have++] = w } } if (30 === a.mode) break; if (0 === a.lens[256]) { e.msg = "invalid code -- missing end-of-block", a.mode = 30; break } if (a.lenbits = 9, C = { bits: a.lenbits }, _ = no(1, a.lens, 0, a.nlen, a.lencode, 0, a.work, C), a.lenbits = C.bits, _) { e.msg = "invalid literal/lengths set", a.mode = 30; break } if (a.distbits = 6, a.distcode = a.distdyn, C = { bits: a.distbits }, _ = no(2, a.lens, a.nlen, a.ndist, a.distcode, 0, a.work, C), a.distbits = C.bits, _) { e.msg = "invalid distances set", a.mode = 30; break } if (a.mode = 20, 6 === t) break e; case 20: a.mode = 21; case 21: if (o >= 6 && s >= 258) { e.next_out = i, e.avail_out = s, e.next_in = l, e.avail_in = o, a.hold = c, a.bits = u, Ji(e, h), i = e.next_out, n = e.output, s = e.avail_out, l = e.next_in, r = e.input, o = e.avail_in, c = a.hold, u = a.bits, 12 === a.mode && (a.back = -1); break } for (a.back = 0; v = (A = a.lencode[c & (1 << a.lenbits) - 1]) >>> 16 & 255, y = 65535 & A, !((g = A >>> 24) <= u);) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (v && 0 == (240 & v)) { for (b = g, k = v, x = y; v = (A = a.lencode[x + ((c & (1 << b + k) - 1) >> b)]) >>> 16 & 255, y = 65535 & A, !(b + (g = A >>> 24) <= u);) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } c >>>= b, u -= b, a.back += b } if (c >>>= g, u -= g, a.back += g, a.length = y, 0 === v) { a.mode = 26; break } if (32 & v) { a.back = -1, a.mode = 12; break } if (64 & v) { e.msg = "invalid literal/length code", a.mode = 30; break } a.extra = 15 & v, a.mode = 22; case 22: if (a.extra) { for (T = a.extra; u < T;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.length += c & (1 << a.extra) - 1, c >>>= a.extra, u -= a.extra, a.back += a.extra } a.was = a.length, a.mode = 23; case 23: for (; v = (A = a.distcode[c & (1 << a.distbits) - 1]) >>> 16 & 255, y = 65535 & A, !((g = A >>> 24) <= u);) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (0 == (240 & v)) { for (b = g, k = v, x = y; v = (A = a.distcode[x + ((c & (1 << b + k) - 1) >> b)]) >>> 16 & 255, y = 65535 & A, !(b + (g = A >>> 24) <= u);) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } c >>>= b, u -= b, a.back += b } if (c >>>= g, u -= g, a.back += g, 64 & v) { e.msg = "invalid distance code", a.mode = 30; break } a.offset = y, a.extra = 15 & v, a.mode = 24; case 24: if (a.extra) { for (T = a.extra; u < T;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } a.offset += c & (1 << a.extra) - 1, c >>>= a.extra, u -= a.extra, a.back += a.extra } if (a.offset > a.dmax) { e.msg = "invalid distance too far back", a.mode = 30; break } a.mode = 25; case 25: if (0 === s) break e; if (m = h - s, a.offset > m) { if ((m = a.offset - m) > a.whave && a.sane) { e.msg = "invalid distance too far back", a.mode = 30; break } m > a.wnext ? (m -= a.wnext, p = a.wsize - m) : p = a.wnext - m, m > a.length && (m = a.length), f = a.window } else f = n, p = i - a.offset, m = a.length; m > s && (m = s), s -= m, a.length -= m; do { n[i++] = f[p++] } while (--m); 0 === a.length && (a.mode = 21); break; case 26: if (0 === s) break e; n[i++] = a.length, s--, a.mode = 21; break; case 27: if (a.wrap) { for (; u < 32;) { if (0 === o) break e; o--, c |= r[l++] << u, u += 8 } if (h -= s, e.total_out += h, a.total += h, h && (e.adler = a.check = a.flags ? bi(a.check, n, h, i - h) : gi(a.check, n, h, i - h)), h = s, (a.flags ? c : lo(c)) !== a.check) { e.msg = "incorrect data check", a.mode = 30; break } c = 0, u = 0 } a.mode = 28; case 28: if (a.wrap && a.flags) { for (; u < 32;) { if (0 === o) break e; o--, c += r[l++] << u, u += 8 } if (c !== (4294967295 & a.total)) { e.msg = "incorrect length check", a.mode = 30; break } c = 0, u = 0 } a.mode = 29; case 29: _ = 1; break e; case 30: _ = -3; break e; case 31: return -4; case 32: default: return -2 }return e.next_out = i, e.avail_out = s, e.next_in = l, e.avail_in = o, a.hold = c, a.bits = u, (a.wsize || h !== e.avail_out && a.mode < 30 && (a.mode < 27 || 4 !== t)) && go(e, e.output, e.next_out, h - e.avail_out), d -= e.avail_in, h -= e.avail_out, e.total_in += d, e.total_out += h, a.total += h, a.wrap && h && (e.adler = a.check = a.flags ? bi(a.check, n, h, e.next_out - h) : gi(a.check, n, h, e.next_out - h)), e.data_type = a.bits + (a.last ? 64 : 0) + (12 === a.mode ? 128 : 0) + (20 === a.mode || 15 === a.mode ? 256 : 0), (0 === d && 0 === h || 4 === t) && 0 === _ && (_ = -5), _ }, inflateEnd: function (e) { if (!e || !e.state) return -2; var t = e.state; return t.window && (t.window = null), e.state = null, 0 }, inflateGetHeader: function (e, t) { var a; return e && e.state ? 0 == (2 & (a = e.state).wrap) ? -2 : (a.head = t, t.done = !1, 0) : -2 }, inflateSetDictionary: function (e, t) { var a, r = t.length; return e && e.state ? 0 !== (a = e.state).wrap && 11 !== a.mode ? -2 : 11 === a.mode && gi(1, t, r, 0) !== a.check ? -3 : go(e, t, r, r) ? (a.mode = 31, -4) : (a.havedict = 1, 0) : -2 }, inflateInfo: "pako inflate (from Nodeca project)" }, yo = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 }; var bo = function () { this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1 }, ko = Object.prototype.toString; function xo(e) { if (!(this instanceof xo)) return new xo(e); this.options = Nl.assign({ chunkSize: 16384, windowBits: 0, to: "" }, e || {}); var t = this.options; t.raw && t.windowBits >= 0 && t.windowBits < 16 && (t.windowBits = -t.windowBits, 0 === t.windowBits && (t.windowBits = -15)), !(t.windowBits >= 0 && t.windowBits < 16) || e && e.windowBits || (t.windowBits += 32), t.windowBits > 15 && t.windowBits < 48 && 0 == (15 & t.windowBits) && (t.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new Yi, this.strm.avail_out = 0; var a = vo.inflateInit2(this.strm, t.windowBits); if (a !== yo.Z_OK) throw new Error(ki[a]); if (this.header = new bo, vo.inflateGetHeader(this.strm, this.header), t.dictionary && ("string" == typeof t.dictionary ? t.dictionary = Hi(t.dictionary) : "[object ArrayBuffer]" === ko.call(t.dictionary) && (t.dictionary = new Uint8Array(t.dictionary)), t.raw && (a = vo.inflateSetDictionary(this.strm, t.dictionary)) !== yo.Z_OK)) throw new Error(ki[a]) } function wo(e, t) { var a = new xo(t); if (a.push(e, !0), a.err) throw a.msg || ki[a.err]; return a.result } xo.prototype.push = function (e, t) { var a, r, n, l, i, o = this.strm, s = this.options.chunkSize, c = this.options.dictionary, u = !1; if (this.ended) return !1; r = t === ~~t ? t : !0 === t ? yo.Z_FINISH : yo.Z_NO_FLUSH, "string" == typeof e ? o.input = ji(e) : "[object ArrayBuffer]" === ko.call(e) ? o.input = new Uint8Array(e) : o.input = e, o.next_in = 0, o.avail_in = o.input.length; do { if (0 === o.avail_out && (o.output = new Nl.Buf8(s), o.next_out = 0, o.avail_out = s), (a = vo.inflate(o, yo.Z_NO_FLUSH)) === yo.Z_NEED_DICT && c && (a = vo.inflateSetDictionary(this.strm, c)), a === yo.Z_BUF_ERROR && !0 === u && (a = yo.Z_OK, u = !1), a !== yo.Z_STREAM_END && a !== yo.Z_OK) return this.onEnd(a), this.ended = !0, !1; o.next_out && (0 !== o.avail_out && a !== yo.Z_STREAM_END && (0 !== o.avail_in || r !== yo.Z_FINISH && r !== yo.Z_SYNC_FLUSH) || ("string" === this.options.to ? (n = Wi(o.output, o.next_out), l = o.next_out - n, i = Gi(o.output, n), o.next_out = l, o.avail_out = s - l, l && Nl.arraySet(o.output, o.output, n, l, 0), this.onData(i)) : this.onData(Nl.shrinkBuf(o.output, o.next_out)))), 0 === o.avail_in && 0 === o.avail_out && (u = !0) } while ((o.avail_in > 0 || 0 === o.avail_out) && a !== yo.Z_STREAM_END); return a === yo.Z_STREAM_END && (r = yo.Z_FINISH), r === yo.Z_FINISH ? (a = vo.inflateEnd(this.strm), this.onEnd(a), this.ended = !0, a === yo.Z_OK) : r !== yo.Z_SYNC_FLUSH || (this.onEnd(yo.Z_OK), o.avail_out = 0, !0) }, xo.prototype.onData = function (e) { this.chunks.push(e) }, xo.prototype.onEnd = function (e) { e === yo.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = Nl.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg }; var _o = { Inflate: xo, inflate: wo, inflateRaw: function (e, t) { return (t = t || {}).raw = !0, wo(e, t) }, ungzip: wo }, Co = {}; (0, Nl.assign)(Co, Qi, _o, yo); var To = Co; function Ao(e) { $("#luckysheet-cell-loading").find("span").text(e).end().show() } function So(e, t) { if (ga.rowHeaderWidth = fa.rowHeaderWidth * ga.zoomRatio, ga.columnHeaderHeight = fa.columnHeaderHeight * ga.zoomRatio, $("#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 }), null != e) { ga.visibledatarow = [], ga.rh_height = 0; for (var a = 0; a < e; a++) { var r = ga.defaultrowlen; null != ga.config.rowlen && null != ga.config.rowlen[a] && (r = ga.config.rowlen[a]), null == ga.config.rowhidden || null == ga.config.rowhidden[a] ? (ga.rh_height += Math.round((r + 1) * ga.zoomRatio), ga.visibledatarow.push(ga.rh_height)) : ga.visibledatarow.push(ga.rh_height) } fa.enableAddRow || fa.enableAddBackTop ? ga.rh_height += 80 : ga.rh_height += 29 } if (null != t) { ga.visibledatacolumn = [], ga.ch_width = 0; for (var n = 0; n < t; n++) { var l = ga.defaultcollen; null != ga.config.columnlen && null != ga.config.columnlen[n] ? l = ga.config.columnlen[n] : null != ga.flowdata[0] && null != ga.flowdata[0][n] && (l > 300 ? l = 300 : l < ga.defaultcollen && (l = ga.defaultcollen), l != ga.defaultcollen && (null == ga.config.columnlen && (ga.config.columnlen = {}), ga.config.columnlen[n] = l)), null == ga.config.colhidden || null == ga.config.colhidden[n] ? (ga.ch_width += Math.round((l + 1) * ga.zoomRatio), ga.visibledatacolumn.push(ga.ch_width)) : ga.visibledatacolumn.push(ga.ch_width) } ga.ch_width += 120 } } function Io(e) { var t = {}; if ("array" == Cm(e)) for (var a = 0; a < e.length; a++) { var r = e[a].r, n = e[a].c, l = e[a].f; if (null != ga.flowdata[r][n] && null != ga.flowdata[r][n].f && ga.flowdata[r][n].f == l) { r + "_" + n in t && (t = Ro(t, r, n)); var i = e[a].data, o = i.length, s = 1; if ("array" == Cm(i[0]) && (s = i[0].length), $o({ row: [r, r + o - 1], column: [n, n + s - 1] }, ga.flowdata)) for (var c = 0; c < o; c++)for (var u = 0; u < s; u++) { var d = r + c, h = n + u; "array" == Cm(i[0]) ? t[d + "_" + h] = { v: i[c][u], r: r, c: n } : t[d + "_" + h] = { v: i[c], r: r, c: n } } else t[r + "_" + n] = { v: "#SPILL!", r: r, c: n } } } return t } function Ro(e, t, a) { var r = e[t + "_" + a].r, n = e[t + "_" + a].c; for (var l in e) l == r + "_" + n ? e[l].v = "#SPILL!" : e[l].r == r && e[l].c == n && delete e[l]; return e } function $o(e, t) { for (var a = e.row[0], r = e.row[1], n = e.column[0], l = e.column[1], i = !0, o = a; o <= r; o++)for (var s = n; s <= l; s++)if ((o != a || s != n) && null != t[o][s] && null != t[o][s].v && "" != t[o][s].v.toString()) { i = !1; break } return i } function qo(e) { var t; if (document.createRange) if (e.innerHTML != e.innerText || "" == e.innerHTML) e.focus(), (t = window.getSelection()).selectAllChildren(e), t.collapseToEnd(); else { var a = e.innerText.length; (t = document.createRange()).selectNodeContents(e), t.setStart(e.childNodes[0], a), t.collapse(!0); var r = window.getSelection(); r.removeAllRanges(), r.addRange(t) } else document.selection && ((t = document.body.createTextRange()).moveToElementText(e), t.collapse(!1), t.select()) } function Do(e) { e.target.classList.contains("luckysheet-cols-rows-shift-left") || e.target.classList.contains("luckysheet-cols-rows-shift-right") || $(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-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu").hide(), $("body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu").hide(), ga.luckysheet_cols_menu_status = !1) } function Fo(e) { return e !== document.body && document.body.contains(e) } var Eo = { bl: 1, it: 1, ff: 1, cl: 1, un: 1, fs: 1, fc: 1 }, Mo = { "font-weight": 1, "font-style": 1, "font-family": 1, "text-decoration": 1, "border-bottom": 1, "font-size": 1, color: 1 }; function No(e) { return e && null != e.ct && "inlineStr" == e.ct.t && null != e.ct.s && e.ct.s.length > 0 } function Po(e) { return null != e && "inlineStr" == e.t && null != e.s && e.s.length > 0 } function zo(e, t, a, r) { var n, l, i = window.getSelection(), o = (n = "None" == i.type ? ga.inlineStringEditRange : i.getRangeAt(0)).commonAncestorContainer; l = "luckysheet-rich-text-editor" == o.id ? $(o) : $(o).closest("#luckysheet-rich-text-editor"); var s = $(o).closest("#luckysheet-functionbox-cell"); if (0 == l.length && 0 == s.length && null != ga.inlineStringEditRange && (l = "luckysheet-rich-text-editor" == (o = (n = ga.inlineStringEditRange).commonAncestorContainer).id ? $(o) : $(o).closest("#luckysheet-rich-text-editor"), s = $(o).closest("#luckysheet-functionbox-cell")), !0 !== n.collapsed) { var c = n.endContainer, u = n.startContainer, d = n.endOffset, h = n.startOffset; if (l.length > 0) { if (u === c) { var m, p = u.parentNode, f = !1, g = p.innerHTML; "<span" != l.html().substr(0, 5) && (f = !0); var v, y, b, k = h, x = d, w = g.length; v = g.substring(0, k), y = g.substring(k, x), b = g.substring(x, w); var _ = ""; if ("" != v) { var C = p.style.cssText; if (f) { var T = $(p).closest("#luckysheet-input-box").get(0); null != T && (C = Go(T.style.cssText, C)) } _ += "<span style='" + C + "'>" + v + "</span>" } if ("" != y) { var A = jo(p.style.cssText, t, a); if (f) { var S = $(p).closest("#luckysheet-input-box").get(0); null != S && (A = Go(S.style.cssText, A)) } _ += "<span style='" + A + "'>" + y + "</span>" } if ("" != b) { var I = p.style.cssText; if (f) { var R = $(p).closest("#luckysheet-input-box").get(0); null != R && (I = Go(R.style.cssText, I)) } _ += "<span style='" + I + "'>" + b + "</span>" } "SPAN" == u.parentNode.tagName ? (m = l.find("span").index(p), $(p).replaceWith(_)) : (m = 0, $(p).html(_)); var q = 0; q = 0 == k ? m : m + 1, function (e) { if (window.getSelection) { var t = document.createRange(), a = e.firstChild; t.setStart(a, 0), t.setEnd(a, a.length), t.startContainer && Fo(t.startContainer) && (window.getSelection().removeAllRanges(), window.getSelection().addRange(t)) } else if (document.selection) { var r = document.body.createTextRange(); r.moveToElementText(e), r.select() } }(l.find("span").get(q)) } else if ("SPAN" == u.parentNode.tagName && "SPAN" == c.parentNode.tagName) { var D, F, E = u.parentNode, M = c.parentNode; D = l.find("span").index(E), F = l.find("span").index(M); var N, P, z, L, O = E.innerHTML, B = M.innerHTML, V = h, H = d, U = B.length; N = O.substring(0, V), P = O.substring(V, O.length), z = B.substring(0, H), L = B.substring(H, U); for (var j, G, W = l.find("span"), Y = (W.slice(D, F + 1), ""), X = 0; X < D; X++) { var K = W.get(X), Z = K.innerHTML; Y += "<span style='" + K.style.cssText + "'>" + Z + "</span>" } if ("" != N && (Y += "<span style='" + E.style.cssText + "'>" + N + "</span>"), "" != P) Y += "<span style='" + jo(E.style.cssText, t, a) + "'>" + P + "</span>"; if (D < F) for (var Q = D + 1; Q < F; Q++) { var J = W.get(Q), ee = J.innerHTML; Y += "<span style='" + J.style.cssText + "'>" + ee + "</span>" } if ("" != z) Y += "<span style='" + jo(M.style.cssText, t, a) + "'>" + z + "</span>"; "" != L && (Y += "<span style='" + M.style.cssText + "'>" + L + "</span>"); for (var te = F + 1; te < W.length; te++) { var ae = W.get(te), re = ae.innerHTML; Y += "<span style='" + ae.style.cssText + "'>" + re + "</span>" } l.html(Y), 0 == V ? (j = D, G = F) : (j = D + 1, G = F + 1), function (e, t) { if (window.getSelection) { var a = document.createRange(), r = e.firstChild, n = t.firstChild; a.setStart(r, 0), a.setEnd(n, n.length), a.startContainer && Fo(a.startContainer) && (window.getSelection().removeAllRanges(), window.getSelection().addRange(a)) } }((W = l.find("span")).get(j), W.get(G)) } } else s.length } } function Lo(e) { var t = window.getSelection(); if ("None" != t.type) { var a, r = t.getRangeAt(0), n = r.commonAncestorContainer; a = "luckysheet-rich-text-editor" == n.id ? $(n) : $(n).closest("#luckysheet-rich-text-editor"); var l = $(n).closest("#luckysheet-functionbox-cell"), i = (r.endContainer, r.startContainer), o = (r.endOffset, r.startOffset); if (a.length > 0) { var s = i.parentNode; "luckysheet-rich-text-editor" == i.id && (0 == (s = $(i).find("span")).length && (i.innerHTML = "<span></span>", s = $(i).find("span")), o = (s = s.get(s.length - 1)).innerHTML.length), !1 === r.collapsed && r.deleteContents(); var c, u, d, h, m = s.innerHTML, p = o; if (c = m.substring(0, p), u = m.substring(p, m.length), "SPAN" == i.parentNode.tagName) { var f = a.find("span"); if ((d = f.index(s)) == f.length - 1 && "" == u) { var g = f[d].innerHTML; h = "\n" == g.substr(g.length - 1, 1) ? "<span style='" + s.style.cssText + "'>" + c + "\n</span>" : "<span style='" + s.style.cssText + "'>" + c + "\n\n</span>" } else h = "<span style='" + s.style.cssText + "'>" + c + "\n" + u + "</span>"; $(s).replaceWith(h) } else { var v = es(e); if (h = "" == u ? "<span style='" + v + "'>" + c + "\n\n</span>" : "<span style='" + v + "'>" + c + "\n" + u + "</span>", "luckysheet-rich-text-editor" == i.id) { $(s).replaceWith(h); var y = a.find("span"); d = y.length - 1, o = y.get(d).innerHTML.length - 1 } else $(s).html(h), d = 0 } !function (e, t) { if (window.getSelection) { var a = document.createRange(), r = e.firstChild; t > r.length ? t = r.length : t < 0 && (t = 0), a.setStart(r, t), a.collapse(!0), a.startContainer && Fo(a.startContainer) && (window.getSelection().removeAllRanges(), window.getSelection().addRange(a)) } }(a.find("span").get(d), o + 1) } else l.length } } function Oo(e, t, a) { if (null != e.ct) { var r = e.ct.s; if (null != r) for (var n = 0; n < r.length; n++) { r[n][t] = a } } } function Bo(e) { for (var t, a = [], r = null, n = 0; n < e.length; n++) { var l = e.get(n), i = Vo(l.style.cssText), o = JSON.stringify(i), s = l.innerText; s = s.replace(/\n/g, "\r\n"), o == r ? t.v += s : (i.v = s, a.push(i), r = o, t = i) } return a } function Vo(e) { if (null == e || 0 == e.length) return {}; var t = e.split(";"), a = gn(), r = a.fontarray, n = a.fontjson, l = { ff: r[0], fc: "#000000", fs: 10, cl: 0, un: 0, bl: 0, it: 0 }; return t.forEach((function (e) { var t = as((e = e.toLowerCase()).substr(0, e.indexOf(":"))), a = as(e.substr(e.indexOf(":") + 1)); if ("font-weight" == t && (l.bl = "bold" == a ? 1 : 0), "font-style" == t && (l.it = "italic" == a ? 1 : 0), "font-family" == t) { var r = n[a]; l.ff = null == r ? a : r } "font-size" == t && (l.fs = parseInt(a)), "color" == t && (l.fc = a), "text-decoration" == t && (l.cl = 1), "border-bottom" == t && (l.un = 1), "lucky-strike" == t && (l.cl = a), "lucky-underline" == t && (l.un = a) })), l } var Ho = { bl: "font-weight", it: "font-style", ff: "font-family", fs: "font-size", fc: "color", cl: "text-decoration", un: "border-bottom" }; function Uo(e, t) { var a = e.split(";"); if (null == t || 0 == t.length) return e; if (e.indexOf(t) > -1) for (var r = 0; r < a.length; r++) { var n = a[r], l = as((n = n.toLowerCase()).substr(0, n.indexOf(":"))), i = as(n.substr(n.indexOf(":") + 1)); if (l == t) return i } return "" } function jo(e, t, a) { var r = {}; if (r[t] = a, "un" == t) { var n = Uo(e, "color"); "" == n && (n = "#000000"); var l = Uo(e, "font-size"); "" == l && (l = 11), l = parseInt(l), r._fontSize = l, r._color = n } var i = es(r, void 0, void 0, !1), o = as(i.substr(0, i.indexOf(":"))), s = as(i.substr(i.indexOf(":") + 1)); return s = s.substr(0, s.length - 1), e = function (e, t, a) { var r = e.split(";"), n = ""; if (null == t || 0 == t.length) return e; if (e.indexOf(t) > -1) for (var l = 0; l < r.length; l++) { var i = r[l], o = as((i = i.toLowerCase()).substr(0, i.indexOf(":"))), s = as(i.substr(i.indexOf(":") + 1)); o == t ? n += o + ":" + a + ";" : o.length > 0 && (n += o + ":" + s + ";") } else t.length > 0 && (n = e += t + ":" + a + ";"); return n }(e = function (e, t) { var a = e.split(";"), r = "", n = t; if (null == t || 0 == t.length) return e; if (t in Ho && (t = Ho[t]), e.indexOf(t) > -1) for (var l = 0; l < a.length; l++) { var i = a[l], o = as((i = i.toLowerCase()).substr(0, i.indexOf(":"))), s = as(i.substr(i.indexOf(":") + 1)); o == t || "cl" == n && "lucky-strike" == o || "un" == n && "lucky-underline" == o || o.length > 0 && (r += o + ":" + s + ";") } else r = e; return r }(e, t), o, s) } function Go(e, t) { for (var a = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], r = e.split(";"), n = t.split(";"), l = "", i = {}, o = 0; o < r.length; o++) { var s = r[o], c = !0, u = as((s = s.toLowerCase()).substr(0, s.indexOf(":"))), d = as(s.substr(s.indexOf(":") + 1)); if (!a || u in Mo) { for (var h = 0; h < n.length; h++) { var m = n[h], p = as((m = m.toLowerCase()).substr(0, m.indexOf(":"))), f = as(m.substr(m.indexOf(":") + 1)); u != p || (l += p + ":" + f + ";", c = !1) } c && (l += u + ":" + d + ";"), i[u] = 1 } } for (var g = 0; g < n.length; g++) { var v = n[g], y = as((v = v.toLowerCase()).substr(0, v.indexOf(":"))), b = as(v.substr(v.indexOf(":") + 1)); a && !(y in Mo) || (y in i || (l += y + ":" + b + ";")) } return l } function Wo(e, t) { if (null == e && (e = ga.luckysheet_select_save[0]), null == e.row || 0 == e.row.length) return []; var a, r; null != t && t != ga.currentSheetIndex ? (a = ga.luckysheetfile[_l(t)].data, r = ga.luckysheetfile[_l(t)].config) : (a = rs.deepCopyFlowData(ga.flowdata), r = ga.config); for (var n = [], l = e.row[0]; l <= e.row[1]; l++)if (null != a[l] && (null == r.rowhidden || null == r.rowhidden[l])) { for (var i = [], o = e.column[0]; o <= e.column[1]; o++)i.push(a[l][o]); n.push(i) } return n } function Yo(e, t) { if (null == t || null == t.row || 0 == t.row.length) return []; var a = Io(ga.luckysheetfile[_l(ga.currentSheetIndex)].dynamicArray), r = []; if (null == e) return r; for (var n = t.row[0]; n <= t.row[1]; n++)if (null != e[n]) { for (var l = [], i = t.column[0]; i <= t.column[1]; i++) { var o = void 0; o = n + "_" + i in a ? a[n + "_" + i] : e[n][i], l.push(o) } r.push(l) } return r } function Xo(e) { if (null == e || null == e.row || 0 == e.row.length) return []; for (var t = [], a = e.row[0]; a <= e.row[1]; a++) { var r = []; if (null == ga.config.rowhidden || null == ga.config.rowhidden[a]) { for (var n = e.column[0]; n <= e.column[1]; n++) { var l = ""; null != ga.flowdata[a] && null != ga.flowdata[a][n] && (l = ga.flowdata[a][n]), r.push(l) } t.push(r) } } return t } function Ko(e, t, a, r) { var n; if (null == r && (r = "v"), null == a && (a = ga.flowdata), null != e && null != t) n = a[e][t]; else if (null != e) n = a[e]; else { if (null == t) return a; n = a[0].map((function (e, t) { return a.map((function (e) { return e[t] })) }))[t] } var l = n; return "object" == Cm(n) && (l = n[r], "f" == r && null != l ? l = Ih.functionHTMLGenerate(l) : "f" == r ? l = n.v : n && n.ct && "d" == n.ct.t && (l = n.m)), null == l && (l = null), l } function Zo(e, t, a, r) { if (t <= 0 && a <= 0) return e; t <= 0 && (t = 0), a <= 0 && (a = 0); var n = 0; 0 == e.length ? (e = [], n = 0) : n = e[0].length; for (var l = [], i = 0; i < a; i++)l.push(null); for (var o = [], s = 0; s < n + a; s++)o.push(null); for (var c = 0; c < e.length; c++)e[c] = [].concat(e[c].concat(l)); for (var u = 0; u < t; u++)e.push([].concat(o)); return r && (pd.saveParam("all", ga.currentSheetIndex, e.length, { k: "row" }), pd.saveParam("all", ga.currentSheetIndex, e[0].length, { k: "column" })), e } function Qo(e, t, a, r) { var n; return null == (n = null != r ? r[e][t] : function (e, t, a) { if (null == e || null == t) return; var r; if (null == a) r = ga.flowdata; else { var n = Sh.getSheetByIndex(a); r = n.data } if (!r || !r[e] || !r[e][t]) return; return r[e][t] }(e, t, a)) ? null : n.f } function Jo(e, t) { var a = Ko(e, t, null, "m"); if (null == a && null == (a = Ko(e, t))) { var r = Ko(e, t, null, "ct"); Po(r) && (a = r.s) } return a } function es(e, t, a) { var r = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3]; if (null != e) { var n = "", l = gn(), i = l.fontarray; for (var o in e) { var s = e[o]; if (r && (s = ts(e, o)), "bl" == o && "0" != s && (n += "font-weight: bold;"), "it" == o && "0" != s && (n += "font-style:italic;"), "ff" == o) { n += "font-family: " + (isNaN(parseInt(s)) ? s : i[parseInt(s)]) + ";" } if ("fs" == o && "10" != s && (n += "font-size: " + s + "pt;"), ("fc" == o && "#000000" != s || null != t || null != a && null != a.textColor) && (null != a && null != a.textColor ? n += "color: " + a.textColor + ";" : n += null != t ? "color: " + t[0] + ";" : "color: " + s + ";"), "cl" == o && "0" != s && (n += "text-decoration: line-through;"), "un" == o && ("1" == s || "3" == s)) { var c = e._color; null == c && (c = e.fc); var u = e._fontSize; null == u && (u = e.fs), n += "border-bottom: " + Math.floor(u / 9) + "px solid " + c + ";" } } return n } } function ts(e, t) { var a = e; return t in { bl: 1, it: 1, ff: 1, cl: 1, un: 1 } || "fs" == t && No(e) ? (null == a || null == (a = a[t])) && (a = "0") : "fc" == t ? null == a ? a = "#000000" : (null == (a = a[t]) && (a = "#000000"), a.indexOf("rgba") > -1 && (a = Am(a))) : "bg" == t ? null == a || null == (a = a[t]) ? a = null : a.toString().indexOf("rgba") > -1 && (a = Am(a)) : "bs" == t.substr(0, 2) ? (null == a || null == (a = a[t])) && (a = "none") : "bc" == t.substr(0, 2) ? (null == a || null == (a = a[t])) && (a = "#000000") : "ht" == t ? ((null == a || null == (a = a[t])) && (a = "1"), -1 == ["0", "1", "2"].indexOf(a.toString()) && (a = "1")) : "vt" == t ? ((null == a || null == (a = a[t])) && (a = "0"), -1 == ["0", "1", "2"].indexOf(a.toString()) && (a = "0")) : "ct" == t ? (null == a || null == (a = a[t])) && (a = null) : "fs" == t ? (null == a || null == (a = a[t])) && (a = "10") : "tb" == t || "tr" == t ? (null == a || null == (a = a[t])) && (a = "0") : "rt" == t && (null == a || null == (a = a[t])) && (a = null), a } function as(e) { return null == e || 0 == e.length ? e : e.replace(/^\s+|\s+$/gm, "") } var rs = { deepCopyFlowDataState: !1, deepCopyFlowDataCache: "", deepCopyFlowDataWorker: null, deepCopyFlowData: function (e) { return this.deepCopyFlowDataState ? (null != this.deepCopyFlowDataWorker && this.deepCopyFlowDataWorker.terminate(), this.deepCopyFlowDataCache) : (null == e && (e = ga.flowdata), $.extend(!0, [], e)) }, webWorkerFlowDataCache: function (e) { var t = this; try { null != t.deepCopyFlowDataWorker && t.deepCopyFlowDataWorker.terminate(); var a; if (t.deepCopyFlowDataState = !1, 1 == Ml.isIE()) { (a = new Worker("./plugins/Worker-helper.js")).postMessage("self.onmessage=function(e){postMessage(e.data);}") } else a = new Worker("data:text/javascript;chartset=US-ASCII,onmessage = function (e) { postMessage(e.data); };"); t.deepCopyFlowDataWorker = a, a.postMessage(e), a.onmessage = function (e) { t.deepCopyFlowDataCache = e.data, t.deepCopyFlowDataState = !0 } } catch (a) { t.deepCopyFlowDataCache = $.extend(!0, [], e) } }, controlHandler: function (e, t) { var a = this.deepCopyFlowData(ga.flowdata), r = t || ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], n = null == r.row ? 0 : r.row[0], l = null == r.column ? 0 : r.column[0], i = e.length, o = e[0].length, s = n + i - a.length, c = l + o - a[0].length; (s > 0 || c > 0) && (a = Zo([].concat(a), s, c, !0)); for (var u = 0; u < i; u++) { for (var d = [].concat(a[u + n]), h = 0; h < o; h++) { var m = ""; null != e[u] && null != e[u][h] && (m = e[u][h]), d[h + l] = m } a[u + n] = d } s > 0 || c > 0 ? od(a[0].length, a.length, a, null, ga.luckysheet_select_save, "datachangeAll") : sd(a, ga.luckysheet_select_save) }, clearRangeByindex: function (e, t, a, r, n) { for (var l = _l(n), i = $.extend(!0, [], ga.luckysheetfile[l].data), o = e; o <= t; o++) { for (var s = [].concat(i[o]), c = a; c <= r; c++)Ih.delFunctionGroup(o, c), Ih.execFunctionGroup(o, c, ""), s[c] = null; i[o] = s } n == ga.currentSheetIndex ? t - e + 1 > 5e3 ? id(i, [{ row: [e, t], column: [a, r] }]) : sd(i, { row: [e, t], column: [a, r] }) : ga.luckysheetfile[l].data = i }, controlHandlerD: function (e) { var t = this.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], r = a.row[0], n = a.row[1], l = a.column[0], i = a.column[1], o = e.length, s = e[0].length, c = r + o - t.length, u = l + s - t[0].length; (c > 0 || u > 0) && (t = Zo([].concat(t), c, u, !0)); for (var d = r; d <= n; d++)for (var h = l; h <= i; h++)t[d][h] = null; for (var m = 0; m < o; m++)for (var p = 0; p < s; p++)t[r + m][l + p] = e[m][p]; id(t, [{ row: [r, n], column: [l, i] }, { row: [r, r + o - 1], column: [l, l + s - 1] }]) } }, ns = Math.min, ls = [].lastIndexOf, is = !!ls && 1 / [1].lastIndexOf(1, -0) < 0, os = Me("lastIndexOf"), ss = Le("indexOf", { ACCESSORS: !0, 1: 0 }), cs = is || !os || !ss ? function (e) { if (is) return ls.apply(this, arguments) || 0; var t = b(this), a = he(t.length), r = a - 1; for (arguments.length > 1 && (r = ns(r, ue(arguments[1]))), r < 0 && (r = a + r); r >= 0; r--)if (r in t && t[r] === e) return r || 0; return -1 } : ls; Ee({ target: "Array", proto: !0, forced: cs !== [].lastIndexOf }, { lastIndexOf: cs }); var us = a((function (e, t) { e.exports = function () { var e = "millisecond", t = "second", a = "minute", r = "hour", n = "day", l = "week", i = "month", o = "quarter", s = "year", c = "date", u = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d+)?$/, d = /\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, h = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") }, m = function (e, t, a) { var r = String(e); return !r || r.length >= t ? e : "" + Array(t + 1 - r.length).join(a) + e }, p = { s: m, z: function (e) { var t = -e.utcOffset(), a = Math.abs(t), r = Math.floor(a / 60), n = a % 60; return (t <= 0 ? "+" : "-") + m(r, 2, "0") + ":" + m(n, 2, "0") }, m: function e(t, a) { if (t.date() < a.date()) return -e(a, t); var r = 12 * (a.year() - t.year()) + (a.month() - t.month()), n = t.clone().add(r, i), l = a - n < 0, o = t.clone().add(r + (l ? -1 : 1), i); return +(-(r + (a - n) / (l ? n - o : o - n)) || 0) }, a: function (e) { return e < 0 ? Math.ceil(e) || 0 : Math.floor(e) }, p: function (u) { return { M: i, y: s, w: l, d: n, D: c, h: r, m: a, s: t, ms: e, Q: o }[u] || String(u || "").toLowerCase().replace(/s$/, "") }, u: function (e) { return void 0 === e } }, f = "en", g = {}; g[f] = h; var v = function (e) { return e instanceof x }, y = function (e, t, a) { var r; if (!e) return f; if ("string" == typeof e) g[e] && (r = e), t && (g[e] = t, r = e); else { var n = e.name; g[n] = e, r = n } return !a && r && (f = r), r || !a && f }, b = function (e, t) { if (v(e)) return e.clone(); var a = "object" == typeof t ? t : {}; return a.date = e, a.args = arguments, new x(a) }, k = p; k.l = y, k.i = v, k.w = function (e, t) { return b(e, { locale: t.$L, utc: t.$u, x: t.$x, $offset: t.$offset }) }; var x = function () { function h(e) { this.$L = y(e.locale, null, !0), this.parse(e) } var m = h.prototype; return m.parse = function (e) { this.$d = function (e) { var t = e.date, a = e.utc; if (null === t) return new Date(NaN); if (k.u(t)) return new Date; if (t instanceof Date) return new Date(t); if ("string" == typeof t && !/Z$/i.test(t)) { var r = t.match(u); if (r) { var n = r[2] - 1 || 0, l = (r[7] || "0").substring(0, 3); return a ? new Date(Date.UTC(r[1], n, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, l)) : new Date(r[1], n, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, l) } } return new Date(t) }(e), this.$x = e.x || {}, this.init() }, m.init = function () { var e = this.$d; this.$y = e.getFullYear(), this.$M = e.getMonth(), this.$D = e.getDate(), this.$W = e.getDay(), this.$H = e.getHours(), this.$m = e.getMinutes(), this.$s = e.getSeconds(), this.$ms = e.getMilliseconds() }, m.$utils = function () { return k }, m.isValid = function () { return !("Invalid Date" === this.$d.toString()) }, m.isSame = function (e, t) { var a = b(e); return this.startOf(t) <= a && a <= this.endOf(t) }, m.isAfter = function (e, t) { return b(e) < this.startOf(t) }, m.isBefore = function (e, t) { return this.endOf(t) < b(e) }, m.$g = function (e, t, a) { return k.u(e) ? this[t] : this.set(a, e) }, m.unix = function () { return Math.floor(this.valueOf() / 1e3) }, m.valueOf = function () { return this.$d.getTime() }, m.startOf = function (e, o) { var u = this, d = !!k.u(o) || o, h = k.p(e), m = function (e, t) { var a = k.w(u.$u ? Date.UTC(u.$y, t, e) : new Date(u.$y, t, e), u); return d ? a : a.endOf(n) }, p = function (e, t) { return k.w(u.toDate()[e].apply(u.toDate("s"), (d ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(t)), u) }, f = this.$W, g = this.$M, v = this.$D, y = "set" + (this.$u ? "UTC" : ""); switch (h) { case s: return d ? m(1, 0) : m(31, 11); case i: return d ? m(1, g) : m(0, g + 1); case l: var b = this.$locale().weekStart || 0, x = (f < b ? f + 7 : f) - b; return m(d ? v - x : v + (6 - x), g); case n: case c: return p(y + "Hours", 0); case r: return p(y + "Minutes", 1); case a: return p(y + "Seconds", 2); case t: return p(y + "Milliseconds", 3); default: return this.clone() } }, m.endOf = function (e) { return this.startOf(e, !1) }, m.$set = function (l, o) { var u, d = k.p(l), h = "set" + (this.$u ? "UTC" : ""), m = (u = {}, u[n] = h + "Date", u[c] = h + "Date", u[i] = h + "Month", u[s] = h + "FullYear", u[r] = h + "Hours", u[a] = h + "Minutes", u[t] = h + "Seconds", u[e] = h + "Milliseconds", u)[d], p = d === n ? this.$D + (o - this.$W) : o; if (d === i || d === s) { var f = this.clone().set(c, 1); f.$d[m](p), f.init(), this.$d = f.set(c, Math.min(this.$D, f.daysInMonth())).$d } else m && this.$d[m](p); return this.init(), this }, m.set = function (e, t) { return this.clone().$set(e, t) }, m.get = function (e) { return this[k.p(e)]() }, m.add = function (e, o) { var c, u = this; e = Number(e); var d = k.p(o), h = function (t) { var a = b(u); return k.w(a.date(a.date() + Math.round(t * e)), u) }; if (d === i) return this.set(i, this.$M + e); if (d === s) return this.set(s, this.$y + e); if (d === n) return h(1); if (d === l) return h(7); var m = (c = {}, c[a] = 6e4, c[r] = 36e5, c[t] = 1e3, c)[d] || 1, p = this.$d.getTime() + e * m; return k.w(p, this) }, m.subtract = function (e, t) { return this.add(-1 * e, t) }, m.format = function (e) { var t = this; if (!this.isValid()) return "Invalid Date"; var a = e || "YYYY-MM-DDTHH:mm:ssZ", r = k.z(this), n = this.$locale(), l = this.$H, i = this.$m, o = this.$M, s = n.weekdays, c = n.months, u = function (e, r, n, l) { return e && (e[r] || e(t, a)) || n[r].substr(0, l) }, h = function (e) { return k.s(l % 12 || 12, e, "0") }, m = n.meridiem || function (e, t, a) { var r = e < 12 ? "AM" : "PM"; return a ? r.toLowerCase() : r }, p = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: o + 1, MM: k.s(o + 1, 2, "0"), MMM: u(n.monthsShort, o, c, 3), MMMM: u(c, o), D: this.$D, DD: k.s(this.$D, 2, "0"), d: String(this.$W), dd: u(n.weekdaysMin, this.$W, s, 2), ddd: u(n.weekdaysShort, this.$W, s, 3), dddd: s[this.$W], H: String(l), HH: k.s(l, 2, "0"), h: h(1), hh: h(2), a: m(l, i, !0), A: m(l, i, !1), m: String(i), mm: k.s(i, 2, "0"), s: String(this.$s), ss: k.s(this.$s, 2, "0"), SSS: k.s(this.$ms, 3, "0"), Z: r }; return a.replace(d, (function (e, t) { return t || p[e] || r.replace(":", "") })) }, m.utcOffset = function () { return 15 * -Math.round(this.$d.getTimezoneOffset() / 15) }, m.diff = function (e, c, u) { var d, h = k.p(c), m = b(e), p = 6e4 * (m.utcOffset() - this.utcOffset()), f = this - m, g = k.m(this, m); return g = (d = {}, d[s] = g / 12, d[i] = g, d[o] = g / 3, d[l] = (f - p) / 6048e5, d[n] = (f - p) / 864e5, d[r] = f / 36e5, d[a] = f / 6e4, d[t] = f / 1e3, d)[h] || f, u ? g : k.a(g) }, m.daysInMonth = function () { return this.endOf(i).$D }, m.$locale = function () { return g[this.$L] }, m.locale = function (e, t) { if (!e) return this.$L; var a = this.clone(), r = y(e, t, !0); return r && (a.$L = r), a }, m.clone = function () { return k.w(this.$d, this) }, m.toDate = function () { return new Date(this.valueOf()) }, m.toJSON = function () { return this.isValid() ? this.toISOString() : null }, m.toISOString = function () { return this.$d.toISOString() }, m.toString = function () { return this.$d.toUTCString() }, h }(), w = x.prototype; return b.prototype = w, [["$ms", e], ["$s", t], ["$m", a], ["$H", r], ["$W", n], ["$M", i], ["$y", s], ["$D", c]].forEach((function (e) { w[e[1]] = function (t) { return this.$g(t, e[0], e[1]) } })), b.extend = function (e, t) { return e(t, x, b), b }, b.locale = y, b.isDayjs = v, b.unix = function (e) { return b(1e3 * e) }, b.en = g[f], b.Ls = g, b.p = {}, b }() })); function ds(e) { return !(null == e || e.toString().length < 5) && !!function (e) { if (!/^(\d{4})-(\d{1,2})-(\d{1,2})(\s(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?$/.test(e) && !/^(\d{4})\/(\d{1,2})\/(\d{1,2})(\s(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?$/.test(e)) return !1; var t = RegExp.$1, a = RegExp.$2, r = RegExp.$3; if (t < 1900) return !1; if (a > 12) return !1; if (r > 31) return !1; if (2 == a) { if (29 == new Date(t, 1, 29).getDate() && r > 29) return !1; if (29 != new Date(t, 1, 29).getDate() && r > 28) return !1 } return !0 }(e) } function hs(e, t) { return us(e).diff(us(t)) } function ms(e) { var t = {}; return ds(e) && (t.date = !0), isNaN(parseFloat(e)) || xa(e) || (t.num = !0), t } function ps(e) { var t = "string"; return ds(e) ? t = "date" : isNaN(parseFloat(e)) || xa(e) || (t = "num"), t } var fs = a((function (t) {
/*! @preserve
* numeral.js
* version : 2.0.6
* author : Adam Draper
* license : MIT
* http://adamwdraper.github.com/Numeral-js/
*/
!function (e, a) { t.exports ? t.exports = a() : e.numeral = a() }(e, (function () { var e, t, a, r, n, l = {}, i = {}, o = { currentLocale: "en", zeroFormat: null, nullFormat: null, defaultFormat: "0,0", scalePercentBy100: !0 }, s = { currentLocale: o.currentLocale, zeroFormat: o.zeroFormat, nullFormat: o.nullFormat, defaultFormat: o.defaultFormat, scalePercentBy100: o.scalePercentBy100 }; function c(e, t) { this._input = e, this._value = t } return (e = function (a) { var r, n, i, o; if (e.isNumeral(a)) r = a.value(); else if (0 === a || void 0 === a) r = 0; else if (null === a || t.isNaN(a)) r = null; else if ("string" == typeof a) if (s.zeroFormat && a === s.zeroFormat) r = 0; else if (s.nullFormat && a === s.nullFormat || !a.replace(/[^0-9]+/g, "").length) r = null; else { for (n in l) if ((o = "function" == typeof l[n].regexps.unformat ? l[n].regexps.unformat() : l[n].regexps.unformat) && a.match(o)) { i = l[n].unformat; break } r = (i = i || e._.stringToNumber)(a) } else r = Number(a) || null; return new c(a, r) }).version = "2.0.6", e.isNumeral = function (e) { return e instanceof c }, e._ = t = { numberToFormat: function (t, a, r) { var n, l, o, s, c, u, d, h, m = i[e.options.currentLocale], p = !1, f = !1, g = "", v = "", y = !1; if (t = t || 0, o = Math.abs(t), e._.includes(a, "(") ? (p = !0, a = a.replace(/[\(|\)]/g, "")) : (e._.includes(a, "+") || e._.includes(a, "-")) && (u = e._.includes(a, "+") ? a.indexOf("+") : t < 0 ? a.indexOf("-") : -1, a = a.replace(/[\+|\-]/g, "")), e._.includes(a, "a") && (l = !!(l = a.match(/a(k|m|b|t)?/)) && l[1], e._.includes(a, " a") && (g = " "), a = a.replace(new RegExp(g + "a[kmbt]?"), ""), o >= 1e12 && !l || "t" === l ? (g += m.abbreviations.trillion, t /= 1e12) : o < 1e12 && o >= 1e9 && !l || "b" === l ? (g += m.abbreviations.billion, t /= 1e9) : o < 1e9 && o >= 1e6 && !l || "m" === l ? (g += m.abbreviations.million, t /= 1e6) : (o < 1e6 && o >= 1e3 && !l || "k" === l) && (g += m.abbreviations.thousand, t /= 1e3)), e._.includes(a, "[.]") && (f = !0, a = a.replace("[.]", ".")), s = t.toString().split(".")[0], c = a.split(".")[1], d = a.indexOf(","), n = (a.split(".")[0].split(",")[0].match(/0/g) || []).length, c ? (e._.includes(c, "[") ? (c = (c = c.replace("]", "")).split("["), v = e._.toFixed(t, c[0].length + c[1].length, r, c[1].length)) : v = e._.toFixed(t, c.length, r), s = v.split(".")[0], v = e._.includes(v, ".") ? m.delimiters.decimal + v.split(".")[1] : "", f && 0 === Number(v.slice(1)) && (v = "")) : s = e._.toFixed(t, 0, r), g && !l && Number(s) >= 1e3 && g !== m.abbreviations.trillion) switch (s = String(Number(s) / 1e3), g) { case m.abbreviations.thousand: g = m.abbreviations.million; break; case m.abbreviations.million: g = m.abbreviations.billion; break; case m.abbreviations.billion: g = m.abbreviations.trillion }if (e._.includes(s, "-") && (s = s.slice(1), y = !0), s.length < n) for (var b = n - s.length; b > 0; b--)s = "0" + s; return d > -1 && (s = s.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1" + m.delimiters.thousands)), 0 === a.indexOf(".") && (s = ""), h = s + v + (g || ""), p ? h = (p && y ? "(" : "") + h + (p && y ? ")" : "") : u >= 0 ? h = 0 === u ? (y ? "-" : "+") + h : h + (y ? "-" : "+") : y && (h = "-" + h), h }, stringToNumber: function (e) { var t, a, r, n = i[s.currentLocale], l = e, o = { thousand: 3, million: 6, billion: 9, trillion: 12 }; if (s.zeroFormat && e === s.zeroFormat) a = 0; else if (s.nullFormat && e === s.nullFormat || !e.replace(/[^0-9]+/g, "").length) a = null; else { for (t in a = 1, "." !== n.delimiters.decimal && (e = e.replace(/\./g, "").replace(n.delimiters.decimal, ".")), o) if (r = new RegExp("[^a-zA-Z]" + n.abbreviations[t] + "(?:\\)|(\\" + n.currency.symbol + ")?(?:\\))?)?$"), l.match(r)) { a *= Math.pow(10, o[t]); break } a *= (e.split("-").length + Math.min(e.split("(").length - 1, e.split(")").length - 1)) % 2 ? 1 : -1, e = e.replace(/[^0-9\.]+/g, ""), a *= Number(e) } return a }, isNaN: function (e) { return "number" == typeof e && isNaN(e) }, includes: function (e, t) { return -1 !== e.indexOf(t) }, insert: function (e, t, a) { return e.slice(0, a) + t + e.slice(a) }, reduce: function (e, t) { if (null === this) throw new TypeError("Array.prototype.reduce called on null or undefined"); if ("function" != typeof t) throw new TypeError(t + " is not a function"); var a, r = Object(e), n = r.length >>> 0, l = 0; if (3 === arguments.length) a = arguments[2]; else { for (; l < n && !(l in r);)l++; if (l >= n) throw new TypeError("Reduce of empty array with no initial value"); a = r[l++] } for (; l < n; l++)l in r && (a = t(a, r[l], l, r)); return a }, multiplier: function (e) { var t = e.toString().split("."); return t.length < 2 ? 1 : Math.pow(10, t[1].length) }, correctionFactor: function () { var e = Array.prototype.slice.call(arguments); return e.reduce((function (e, a) { var r = t.multiplier(a); return e > r ? e : r }), 1) }, toFixed: function (e, t, a, r) { var n, l, i, o, s = e.toString().split("."), c = t - (r || 0); return n = 2 === s.length ? Math.min(Math.max(s[1].length, c), t) : c, i = Math.pow(10, n), o = (a(e + "e+" + n) / i).toFixed(n), r > t - n && (l = new RegExp("\\.?0{1," + (r - (t - n)) + "}$"), o = o.replace(l, "")), o } }, e.options = s, e.formats = l, e.locales = i, e.locale = function (e) { return e && (s.currentLocale = e.toLowerCase()), s.currentLocale }, e.localeData = function (e) { if (!e) return i[s.currentLocale]; if (e = e.toLowerCase(), !i[e]) throw new Error("Unknown locale : " + e); return i[e] }, e.reset = function () { for (var e in o) s[e] = o[e] }, e.zeroFormat = function (e) { s.zeroFormat = "string" == typeof e ? e : null }, e.nullFormat = function (e) { s.nullFormat = "string" == typeof e ? e : null }, e.defaultFormat = function (e) { s.defaultFormat = "string" == typeof e ? e : "0.0" }, e.register = function (e, t, a) { if (t = t.toLowerCase(), this[e + "s"][t]) throw new TypeError(t + " " + e + " already registered."); return this[e + "s"][t] = a, a }, e.validate = function (t, a) { var r, n, l, i, o, s, c, u; if ("string" != typeof t && (t += "", console.warn && console.warn("Numeral.js: Value is not string. It has been co-erced to: ", t)), (t = t.trim()).match(/^\d+$/)) return !0; if ("" === t) return !1; try { c = e.localeData(a) } catch (t) { c = e.localeData(e.locale()) } return l = c.currency.symbol, o = c.abbreviations, r = c.delimiters.decimal, n = "." === c.delimiters.thousands ? "\\." : c.delimiters.thousands, (null === (u = t.match(/^[^\d]+/)) || (t = t.substr(1), u[0] === l)) && ((null === (u = t.match(/[^\d]+$/)) || (t = t.slice(0, -1), u[0] === o.thousand || u[0] === o.million || u[0] === o.billion || u[0] === o.trillion)) && (s = new RegExp(n + "{2}"), !t.match(/[^\d.,]/g) && (!((i = t.split(r)).length > 2) && (i.length < 2 ? !!i[0].match(/^\d+.*\d$/) && !i[0].match(s) : 1 === i[0].length ? !!i[0].match(/^\d+$/) && !i[0].match(s) && !!i[1].match(/^\d+$/) : !!i[0].match(/^\d+.*\d$/) && !i[0].match(s) && !!i[1].match(/^\d+$/))))) }, e.fn = c.prototype = { clone: function () { return e(this) }, format: function (t, a) { var r, n, i, o = this._value, c = t || s.defaultFormat; if (a = a || Math.round, 0 === o && null !== s.zeroFormat) n = s.zeroFormat; else if (null === o && null !== s.nullFormat) n = s.nullFormat; else { for (r in l) if (c.match(l[r].regexps.format)) { i = l[r].format; break } n = (i = i || e._.numberToFormat)(o, c, a) } return n }, value: function () { return this._value }, input: function () { return this._input }, set: function (e) { return this._value = Number(e), this }, add: function (e) { var a = t.correctionFactor.call(null, this._value, e); return this._value = t.reduce([this._value, e], (function (e, t, r, n) { return e + Math.round(a * t) }), 0) / a, this }, subtract: function (e) { var a = t.correctionFactor.call(null, this._value, e); return this._value = t.reduce([e], (function (e, t, r, n) { return e - Math.round(a * t) }), Math.round(this._value * a)) / a, this }, multiply: function (e) { return this._value = t.reduce([this._value, e], (function (e, a, r, n) { var l = t.correctionFactor(e, a); return Math.round(e * l) * Math.round(a * l) / Math.round(l * l) }), 1), this }, divide: function (e) { return this._value = t.reduce([this._value, e], (function (e, a, r, n) { var l = t.correctionFactor(e, a); return Math.round(e * l) / Math.round(a * l) })), this }, difference: function (t) { return Math.abs(e(this._value).subtract(t).value()) } }, e.register("locale", "en", { delimiters: { thousands: ",", decimal: "." }, abbreviations: { thousand: "k", million: "m", billion: "b", trillion: "t" }, ordinal: function (e) { var t = e % 10; return 1 == ~~(e % 100 / 10) ? "th" : 1 === t ? "st" : 2 === t ? "nd" : 3 === t ? "rd" : "th" }, currency: { symbol: "$" } }), e.register("format", "bps", { regexps: { format: /(BPS)/, unformat: /(BPS)/ }, format: function (t, a, r) { var n, l = e._.includes(a, " BPS") ? " " : ""; return t *= 1e4, a = a.replace(/\s?BPS/, ""), n = e._.numberToFormat(t, a, r), e._.includes(n, ")") ? ((n = n.split("")).splice(-1, 0, l + "BPS"), n = n.join("")) : n = n + l + "BPS", n }, unformat: function (t) { return +(1e-4 * e._.stringToNumber(t)).toFixed(15) } }), r = { base: 1024, suffixes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, n = "(" + (n = (a = { base: 1e3, suffixes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] }).suffixes.concat(r.suffixes.filter((function (e) { return a.suffixes.indexOf(e) < 0 }))).join("|")).replace("B", "B(?!PS)") + ")", e.register("format", "bytes", { regexps: { format: /([0\s]i?b)/, unformat: new RegExp(n) }, format: function (t, n, l) { var i, o, s, c = e._.includes(n, "ib") ? r : a, u = e._.includes(n, " b") || e._.includes(n, " ib") ? " " : ""; for (n = n.replace(/\s?i?b/, ""), i = 0; i <= c.suffixes.length; i++)if (o = Math.pow(c.base, i), s = Math.pow(c.base, i + 1), null === t || 0 === t || t >= o && t < s) { u += c.suffixes[i], o > 0 && (t /= o); break } return e._.numberToFormat(t, n, l) + u }, unformat: function (t) { var n, l, i = e._.stringToNumber(t); if (i) { for (n = a.suffixes.length - 1; n >= 0; n--) { if (e._.includes(t, a.suffixes[n])) { l = Math.pow(a.base, n); break } if (e._.includes(t, r.suffixes[n])) { l = Math.pow(r.base, n); break } } i *= l || 1 } return i } }), e.register("format", "currency", { regexps: { format: /(\$)/ }, format: function (t, a, r) { var n, l, i = e.locales[e.options.currentLocale], o = { before: a.match(/^([\+|\-|\(|\s|\$]*)/)[0], after: a.match(/([\+|\-|\)|\s|\$]*)$/)[0] }; for (a = a.replace(/\s?\$\s?/, ""), n = e._.numberToFormat(t, a, r), t >= 0 ? (o.before = o.before.replace(/[\-\(]/, ""), o.after = o.after.replace(/[\-\)]/, "")) : t < 0 && !e._.includes(o.before, "-") && !e._.includes(o.before, "(") && (o.before = "-" + o.before), l = 0; l < o.before.length; l++)switch (o.before[l]) { case "$": n = e._.insert(n, i.currency.symbol, l); break; case " ": n = e._.insert(n, " ", l + i.currency.symbol.length - 1) }for (l = o.after.length - 1; l >= 0; l--)switch (o.after[l]) { case "$": n = l === o.after.length - 1 ? n + i.currency.symbol : e._.insert(n, i.currency.symbol, -(o.after.length - (1 + l))); break; case " ": n = l === o.after.length - 1 ? n + " " : e._.insert(n, " ", -(o.after.length - (1 + l) + i.currency.symbol.length - 1)) }return n } }), e.register("format", "exponential", { regexps: { format: /(e\+|e-)/, unformat: /(e\+|e-)/ }, format: function (t, a, r) { var n = ("number" != typeof t || e._.isNaN(t) ? "0e+0" : t.toExponential()).split("e"); return a = a.replace(/e[\+|\-]{1}0/, ""), e._.numberToFormat(Number(n[0]), a, r) + "e" + n[1] }, unformat: function (t) { var a = e._.includes(t, "e+") ? t.split("e+") : t.split("e-"), r = Number(a[0]), n = Number(a[1]); return n = e._.includes(t, "e-") ? n *= -1 : n, e._.reduce([r, Math.pow(10, n)], (function (t, a, r, n) { var l = e._.correctionFactor(t, a); return t * l * (a * l) / (l * l) }), 1) } }), e.register("format", "ordinal", { regexps: { format: /(o)/ }, format: function (t, a, r) { var n = e.locales[e.options.currentLocale], l = e._.includes(a, " o") ? " " : ""; return a = a.replace(/\s?o/, ""), l += n.ordinal(t), e._.numberToFormat(t, a, r) + l } }), e.register("format", "percentage", { regexps: { format: /(%)/, unformat: /(%)/ }, format: function (t, a, r) { var n, l = e._.includes(a, " %") ? " " : ""; return e.options.scalePercentBy100 && (t *= 100), a = a.replace(/\s?\%/, ""), n = e._.numberToFormat(t, a, r), e._.includes(n, ")") ? ((n = n.split("")).splice(-1, 0, l + "%"), n = n.join("")) : n = n + l + "%", n }, unformat: function (t) { var a = e._.stringToNumber(t); return e.options.scalePercentBy100 ? .01 * a : a } }), e.register("format", "time", { regexps: { format: /(:)/, unformat: /(:)/ }, format: function (e, t, a) { var r = Math.floor(e / 60 / 60), n = Math.floor((e - 60 * r * 60) / 60), l = Math.round(e - 60 * r * 60 - 60 * n); return r + ":" + (n < 10 ? "0" + n : n) + ":" + (l < 10 ? "0" + l : l) }, unformat: function (e) { var t = e.split(":"), a = 0; return 3 === t.length ? (a += 60 * Number(t[0]) * 60, a += 60 * Number(t[1]), a += Number(t[2])) : 2 === t.length && (a += 60 * Number(t[0]), a += Number(t[1])), Number(a) } }), e }))
})), gs = {}; !function (e) { function t(e) { for (var t = "", a = e.length - 1; a >= 0;)t += e.charAt(a--); return t } function a(e, t) { for (var a = ""; a.length < t;)a += e; return a } function r(e, t) { var r = "" + e; return r.length >= t ? r : a("0", t - r.length) + r } function n(e, t) { var r = "" + e; return r.length >= t ? r : a(" ", t - r.length) + r } function l(e, t) { var r = "" + e; return r.length >= t ? r : r + a(" ", t - r.length) } e.version = "0.11.2"; var i = Math.pow(2, 32); function o(e, t) { return e > i || e < -i ? function (e, t) { var r = "" + Math.round(e); return r.length >= t ? r : a("0", t - r.length) + r }(e, t) : function (e, t) { var r = "" + e; return r.length >= t ? r : a("0", t - r.length) + r }(Math.round(e), t) } function s(e, t) { return t = t || 0, e.length >= 7 + t && 103 == (32 | e.charCodeAt(t)) && 101 == (32 | e.charCodeAt(t + 1)) && 110 == (32 | e.charCodeAt(t + 2)) && 101 == (32 | e.charCodeAt(t + 3)) && 114 == (32 | e.charCodeAt(t + 4)) && 97 == (32 | e.charCodeAt(t + 5)) && 108 == (32 | e.charCodeAt(t + 6)) } var c = [["Sun", "Sunday"], ["Mon", "Monday"], ["Tue", "Tuesday"], ["Wed", "Wednesday"], ["Thu", "Thursday"], ["Fri", "Friday"], ["Sat", "Saturday"]], u = [["J", "Jan", "January"], ["F", "Feb", "February"], ["M", "Mar", "March"], ["A", "Apr", "April"], ["M", "May", "May"], ["J", "Jun", "June"], ["J", "Jul", "July"], ["A", "Aug", "August"], ["S", "Sep", "September"], ["O", "Oct", "October"], ["N", "Nov", "November"], ["D", "Dec", "December"]]; function d(e) { e[0] = "General", e[1] = "0", e[2] = "0.00", e[3] = "#,##0", e[4] = "#,##0.00", e[9] = "0%", e[10] = "0.00%", e[11] = "0.00E+00", e[12] = "# ?/?", e[13] = "# ??/??", e[14] = "m/d/yy", e[15] = "d-mmm-yy", e[16] = "d-mmm", e[17] = "mmm-yy", e[18] = "h:mm AM/PM", e[19] = "h:mm:ss AM/PM", e[20] = "h:mm", e[21] = "h:mm:ss", e[22] = "m/d/yy h:mm", e[37] = "#,##0 ;(#,##0)", e[38] = "#,##0 ;[Red](#,##0)", e[39] = "#,##0.00;(#,##0.00)", e[40] = "#,##0.00;[Red](#,##0.00)", e[45] = "mm:ss", e[46] = "[h]:mm:ss", e[47] = "mmss.0", e[48] = "##0.0E+0", e[49] = "@", e[56] = '"上午/下午 "hh"時"mm"分"ss"秒 "', e[65535] = "General" } var h = {}; d(h); var m = [], p = 0; for (p = 5; p <= 8; ++p)m[p] = 32 + p; for (p = 23; p <= 26; ++p)m[p] = 0; for (p = 27; p <= 31; ++p)m[p] = 14; for (p = 50; p <= 58; ++p)m[p] = 14; for (p = 59; p <= 62; ++p)m[p] = p - 58; for (p = 67; p <= 68; ++p)m[p] = p - 58; for (p = 72; p <= 75; ++p)m[p] = p - 58; for (p = 67; p <= 68; ++p)m[p] = p - 57; for (p = 76; p <= 78; ++p)m[p] = p - 56; for (p = 79; p <= 81; ++p)m[p] = p - 34; var f = []; function g(e, t, a) { for (var r = e < 0 ? -1 : 1, n = e * r, l = 0, i = 1, o = 0, s = 1, c = 0, u = 0, d = Math.floor(n); c < t && (o = (d = Math.floor(n)) * i + l, u = d * c + s, !(n - d < 5e-8));)n = 1 / (n - d), l = i, i = o, s = c, c = u; if (u > t && (c > t ? (u = s, o = l) : (u = c, o = i)), !a) return [0, r * o, u]; var h = Math.floor(r * o / u); return [h, r * o - h * u, u] } function v(e, t, a) { if (e > 2958465 || e < 0) return null; var r = 0 | e, n = Math.floor(86400 * (e - r)), l = 0, i = [], o = { D: r, T: n, u: 86400 * (e - r) - n, y: 0, m: 0, d: 0, H: 0, M: 0, S: 0, q: 0 }; if (Math.abs(o.u) < 1e-6 && (o.u = 0), t && t.date1904 && (r += 1462), o.u > .9999 && (o.u = 0, 86400 == ++n && (o.T = n = 0, ++r, ++o.D)), 60 === r) i = a ? [1317, 10, 29] : [1900, 2, 29], l = 3; else if (0 === r) i = a ? [1317, 8, 29] : [1900, 1, 0], l = 6; else { r > 60 && --r; var s = new Date(1900, 0, 1); s.setDate(s.getDate() + r - 1), i = [s.getFullYear(), s.getMonth() + 1, s.getDate()], l = s.getDay(), r < 60 && (l = (l + 6) % 7), a && (l = function (e, t) { t[0] -= 581; var a = e.getDay(); e < 60 && (a = (a + 6) % 7); return a }(s, i)) } return o.y = i[0], o.m = i[1], o.d = i[2], o.S = n % 60, n = Math.floor(n / 60), o.M = n % 60, n = Math.floor(n / 60), o.H = n, o.q = l, o } f[5] = f[63] = '"$"#,##0_);\\("$"#,##0\\)', f[6] = f[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)', f[7] = f[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)', f[8] = f[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', f[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)', f[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)', f[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)', f[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)', e.parse_date_code = v; var y = new Date(1899, 11, 31, 0, 0, 0), b = y.getTime(), k = new Date(1900, 2, 1, 0, 0, 0); function x(e, t) { var a = e.getTime(); return t ? a -= 1262304e5 : e >= k && (a += 864e5), (a - (b + 6e4 * (e.getTimezoneOffset() - y.getTimezoneOffset()))) / 864e5 } e._general_int = function (e) { return e.toString(10) }; var w = function () { var e = /(?:\.0*|(\.\d*[1-9])0+)$/; function t(t) { return -1 == t.indexOf(".") ? t : t.replace(e, "$1") } var a = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/, r = /(E[+-])(\d)$/; return function (e) { var n, l = Math.floor(Math.log(Math.abs(e)) * Math.LOG10E); return n = l >= -4 && l <= -1 ? e.toPrecision(10 + l) : Math.abs(l) <= 9 ? function (e) { var a = e < 0 ? 12 : 11, r = t(e.toFixed(12)); return r.length <= a || (r = e.toPrecision(10)).length <= a ? r : e.toExponential(5) }(e) : 10 === l ? e.toFixed(10).substr(0, 12) : function (e) { var a = t(e.toFixed(11)); return a.length > (e < 0 ? 12 : 11) || "0" === a || "-0" === a ? e.toPrecision(6) : a }(e), t(function (e) { return -1 == e.indexOf("E") ? e : e.replace(a, "$1E").replace(r, "$10$2") }(n.toUpperCase())) } }(); function _(e, t) { switch (Sa(e)) { case "string": return e; case "boolean": return e ? "TRUE" : "FALSE"; case "number": return (0 | e) === e ? e.toString(10) : w(e); case "undefined": return ""; case "object": if (null == e) return ""; if (e instanceof Date) return E(14, x(e, t && t.date1904), t) }throw new Error("unsupported value in General format: " + e) } function C(e, t, a, n) { var l, i = "", o = 0, s = 0, d = a.y, h = 0; switch (e) { case 98: d = a.y + 543; case 121: switch (t.length) { case 1: case 2: l = d % 100, h = 2; break; default: l = d % 1e4, h = 4 }break; case 109: switch (t.length) { case 1: case 2: l = a.m, h = t.length; break; case 3: return u[a.m - 1][1]; case 5: return u[a.m - 1][0]; default: return u[a.m - 1][2] }break; case 100: switch (t.length) { case 1: case 2: l = a.d, h = t.length; break; case 3: return c[a.q][0]; default: return c[a.q][1] }break; case 104: switch (t.length) { case 1: case 2: l = 1 + (a.H + 11) % 12, h = t.length; break; default: throw "bad hour format: " + t }break; case 72: switch (t.length) { case 1: case 2: l = a.H, h = t.length; break; default: throw "bad hour format: " + t }break; case 77: switch (t.length) { case 1: case 2: l = a.M, h = t.length; break; default: throw "bad minute format: " + t }break; case 115: if ("s" != t && "ss" != t && ".0" != t && ".00" != t && ".000" != t) throw "bad second format: " + t; return 0 !== a.u || "s" != t && "ss" != t ? (s = n >= 2 ? 3 === n ? 1e3 : 100 : 1 === n ? 10 : 1, (o = Math.round(s * (a.S + a.u))) >= 60 * s && (o = 0), "s" === t ? 0 === o ? "0" : "" + o / s : (i = r(o, 2 + n), "ss" === t ? i.substr(0, 2) : "." + i.substr(2, t.length - 1))) : r(a.S, t.length); case 90: switch (t) { case "[h]": case "[hh]": l = 24 * a.D + a.H; break; case "[m]": case "[mm]": l = 60 * (24 * a.D + a.H) + a.M; break; case "[s]": case "[ss]": l = 60 * (60 * (24 * a.D + a.H) + a.M) + Math.round(a.S + a.u); break; default: throw "bad abstime format: " + t }h = 3 === t.length ? 1 : 2; break; case 101: l = d, h = 1 }return h > 0 ? r(l, h) : "" } function T(e) { if (e.length <= 3) return e; for (var t = e.length % 3, a = e.substr(0, t); t != e.length; t += 3)a += (a.length > 0 ? "," : "") + e.substr(t, 3); return a } e._general_num = w, e._general = _; var A = function () { var e = /%/g; var i = /# (\?+)( ?)\/( ?)(\d+)/; var s = /^#*0*\.([0#]+)/, c = /\).*[0#]/, u = /\(###\) ###\\?-####/; function d(e) { for (var t, a = "", r = 0; r != e.length; ++r)switch (t = e.charCodeAt(r)) { case 35: break; case 63: a += " "; break; case 48: a += "0"; break; default: a += String.fromCharCode(t) }return a } function h(e, t) { var a = Math.pow(10, t); return "" + Math.round(e * a) / a } function m(e, t) { var a = e - Math.floor(e), r = Math.pow(10, t); return t < ("" + Math.round(a * r)).length ? 0 : Math.round(a * r) } function p(f, v, y) { if (40 === f.charCodeAt(0) && !v.match(c)) { var b = v.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, ""); return y >= 0 ? p("n", b, y) : "(" + p("n", b, -y) + ")" } if (44 === v.charCodeAt(v.length - 1)) return function (e, t, a) { for (var r = t.length - 1; 44 === t.charCodeAt(r - 1);)--r; return A(e, t.substr(0, r), a / Math.pow(10, 3 * (t.length - r))) }(f, v, y); if (-1 !== v.indexOf("%")) return function (t, r, n) { var l = r.replace(e, ""), i = r.length - l.length; return A(t, l, n * Math.pow(10, 2 * i)) + a("%", i) }(f, v, y); if (-1 !== v.indexOf("E")) return function e(t, a) { var r, n = t.indexOf("E") - t.indexOf(".") - 1; if (t.match(/^#+0.0E\+0$/)) { if (0 == a) return "0.0E+0"; if (a < 0) return "-" + e(t, -a); var l = t.indexOf("."); -1 === l && (l = t.indexOf("E")); var i = Math.floor(Math.log(a) * Math.LOG10E) % l; if (i < 0 && (i += l), -1 === (r = (a / Math.pow(10, i)).toPrecision(n + 1 + (l + i) % l)).indexOf("e")) { var o = Math.floor(Math.log(a) * Math.LOG10E); for (-1 === r.indexOf(".") ? r = r.charAt(0) + "." + r.substr(1) + "E+" + (o - r.length + i) : r += "E+" + (o - i); "0." === r.substr(0, 2);)r = (r = r.charAt(0) + r.substr(2, l) + "." + r.substr(2 + l)).replace(/^0+([1-9])/, "$1").replace(/^0+\./, "0."); r = r.replace(/\+-/, "-") } r = r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, (function (e, t, a, r) { return t + a + r.substr(0, (l + i) % l) + "." + r.substr(i) + "E" })) } else r = a.toExponential(n); return t.match(/E\+00$/) && r.match(/e[+-]\d$/) && (r = r.substr(0, r.length - 1) + "0" + r.charAt(r.length - 1)), t.match(/E\-/) && r.match(/e\+/) && (r = r.replace(/e\+/, "e")), r.replace("e", "E") }(v, y); if (36 === v.charCodeAt(0)) return "$" + p(f, v.substr(" " == v.charAt(1) ? 2 : 1), y); var k, x, w, _, C = Math.abs(y), S = y < 0 ? "-" : ""; if (v.match(/^00+$/)) return S + o(C, v.length); if (v.match(/^[#?]+$/)) return "0" === (k = o(y, 0)) && (k = ""), k.length > v.length ? k : d(v.substr(0, v.length - k.length)) + k; if (x = v.match(i)) return function (e, t, l) { var i = parseInt(e[4], 10), o = Math.round(t * i), s = Math.floor(o / i), c = o - s * i, u = i; return l + (0 === s ? "" : "" + s) + " " + (0 === c ? a(" ", e[1].length + 1 + e[4].length) : n(c, e[1].length) + e[2] + "/" + e[3] + r(u, e[4].length)) }(x, C, S); if (v.match(/^#+0+$/)) return S + o(C, v.length - v.indexOf("0")); if (x = v.match(s)) return k = h(y, x[1].length).replace(/^([^\.]+)$/, "$1." + d(x[1])).replace(/\.$/, "." + d(x[1])).replace(/\.(\d*)$/, (function (e, t) { return "." + t + a("0", d(x[1]).length - t.length) })), -1 !== v.indexOf("0.") ? k : k.replace(/^0\./, "."); if (v = v.replace(/^#+([0.])/, "$1"), x = v.match(/^(0*)\.(#*)$/)) return S + h(C, x[2].length).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, x[1].length ? "0." : "."); if (x = v.match(/^#{1,3},##0(\.?)$/)) return S + T(o(C, 0)); if (x = v.match(/^#,##0\.([#0]*0)$/)) return y < 0 ? "-" + p(f, v, -y) : T("" + (Math.floor(y) + function (e, t) { return t < ("" + Math.round((e - Math.floor(e)) * Math.pow(10, t))).length ? 1 : 0 }(y, x[1].length))) + "." + r(m(y, x[1].length), x[1].length); if (x = v.match(/^#,#*,#0/)) return p(f, v.replace(/^#,#*,/, ""), y); if (x = v.match(/^([0#]+)(\\?-([0#]+))+$/)) return k = t(p(f, v.replace(/[\\-]/g, ""), y)), w = 0, t(t(v.replace(/\\/g, "")).replace(/[0#]/g, (function (e) { return w < k.length ? k.charAt(w++) : "0" === e ? "0" : "" }))); if (v.match(u)) return "(" + (k = p(f, "##########", y)).substr(0, 3) + ") " + k.substr(3, 3) + "-" + k.substr(6); var I = ""; if (x = v.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) return w = Math.min(x[4].length, 7), _ = g(C, Math.pow(10, w) - 1, !1), k = "" + S, " " == (I = A("n", x[1], _[1])).charAt(I.length - 1) && (I = I.substr(0, I.length - 1) + "0"), k += I + x[2] + "/" + x[3], (I = l(_[2], w)).length < x[4].length && (I = d(x[4].substr(x[4].length - I.length)) + I), k += I; if (x = v.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) return w = Math.min(Math.max(x[1].length, x[4].length), 7), S + ((_ = g(C, Math.pow(10, w) - 1, !0))[0] || (_[1] ? "" : "0")) + " " + (_[1] ? n(_[1], w) + x[2] + "/" + x[3] + l(_[2], w) : a(" ", 2 * w + 1 + x[2].length + x[3].length)); if (x = v.match(/^[#0?]+$/)) return k = o(y, 0), v.length <= k.length ? k : d(v.substr(0, v.length - k.length)) + k; if (x = v.match(/^([#0?]+)\.([#0]+)$/)) { k = "" + y.toFixed(Math.min(x[2].length, 10)).replace(/([^0])0+$/, "$1"), w = k.indexOf("."); var R = v.indexOf(".") - w, $ = v.length - k.length - R; return d(v.substr(0, R) + k + v.substr(v.length - $)) } if (x = v.match(/^00,000\.([#0]*0)$/)) return w = m(y, x[1].length), y < 0 ? "-" + p(f, v, -y) : T(function (e) { return e < 2147483647 && e > -2147483648 ? "" + (e >= 0 ? 0 | e : e - 1 | 0) : "" + Math.floor(e) }(y)).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, (function (e) { return "00," + (e.length < 3 ? r(0, 3 - e.length) : "") + e })) + "." + r(w, x[1].length); switch (v) { case "###,##0.00": return p(f, "#,##0.00", y); case "###,###": case "##,###": case "#,###": var q = T(o(C, 0)); return "0" !== q ? S + q : ""; case "###,###.00": return p(f, "###,##0.00", y).replace(/^0\./, "."); case "#,###.00": return p(f, "#,##0.00", y).replace(/^0\./, ".") }throw new Error("unsupported format |" + v + "|") } function f(o, h, m) { if (40 === o.charCodeAt(0) && !h.match(c)) { var p = h.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, ""); return m >= 0 ? f("n", p, m) : "(" + f("n", p, -m) + ")" } if (44 === h.charCodeAt(h.length - 1)) return function (e, t, a) { for (var r = t.length - 1; 44 === t.charCodeAt(r - 1);)--r; return A(e, t.substr(0, r), a / Math.pow(10, 3 * (t.length - r))) }(o, h, m); if (-1 !== h.indexOf("%")) return function (t, r, n) { var l = r.replace(e, ""), i = r.length - l.length; return A(t, l, n * Math.pow(10, 2 * i)) + a("%", i) }(o, h, m); if (-1 !== h.indexOf("E")) return function e(t, a) { var r, n = t.indexOf("E") - t.indexOf(".") - 1; if (t.match(/^#+0.0E\+0$/)) { if (0 == a) return "0.0E+0"; if (a < 0) return "-" + e(t, -a); var l = t.indexOf("."); -1 === l && (l = t.indexOf("E")); var i = Math.floor(Math.log(a) * Math.LOG10E) % l; if (i < 0 && (i += l), !(r = (a / Math.pow(10, i)).toPrecision(n + 1 + (l + i) % l)).match(/[Ee]/)) { var o = Math.floor(Math.log(a) * Math.LOG10E); -1 === r.indexOf(".") ? r = r.charAt(0) + "." + r.substr(1) + "E+" + (o - r.length + i) : r += "E+" + (o - i), r = r.replace(/\+-/, "-") } r = r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, (function (e, t, a, r) { return t + a + r.substr(0, (l + i) % l) + "." + r.substr(i) + "E" })) } else r = a.toExponential(n); return t.match(/E\+00$/) && r.match(/e[+-]\d$/) && (r = r.substr(0, r.length - 1) + "0" + r.charAt(r.length - 1)), t.match(/E\-/) && r.match(/e\+/) && (r = r.replace(/e\+/, "e")), r.replace("e", "E") }(h, m); if (36 === h.charCodeAt(0)) return "$" + f(o, h.substr(" " == h.charAt(1) ? 2 : 1), m); var v, y, b, k, x = Math.abs(m), w = m < 0 ? "-" : ""; if (h.match(/^00+$/)) return w + r(x, h.length); if (h.match(/^[#?]+$/)) return v = "" + m, 0 === m && (v = ""), v.length > h.length ? v : d(h.substr(0, h.length - v.length)) + v; if (y = h.match(i)) return function (e, t, r) { return r + (0 === t ? "" : "" + t) + a(" ", e[1].length + 2 + e[4].length) }(y, x, w); if (h.match(/^#+0+$/)) return w + r(x, h.length - h.indexOf("0")); if (y = h.match(s)) return v = (v = ("" + m).replace(/^([^\.]+)$/, "$1." + d(y[1])).replace(/\.$/, "." + d(y[1]))).replace(/\.(\d*)$/, (function (e, t) { return "." + t + a("0", d(y[1]).length - t.length) })), -1 !== h.indexOf("0.") ? v : v.replace(/^0\./, "."); if (h = h.replace(/^#+([0.])/, "$1"), y = h.match(/^(0*)\.(#*)$/)) return w + ("" + x).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, y[1].length ? "0." : "."); if (y = h.match(/^#{1,3},##0(\.?)$/)) return w + T("" + x); if (y = h.match(/^#,##0\.([#0]*0)$/)) return m < 0 ? "-" + f(o, h, -m) : T("" + m) + "." + a("0", y[1].length); if (y = h.match(/^#,#*,#0/)) return f(o, h.replace(/^#,#*,/, ""), m); if (y = h.match(/^([0#]+)(\\?-([0#]+))+$/)) return v = t(f(o, h.replace(/[\\-]/g, ""), m)), b = 0, t(t(h.replace(/\\/g, "")).replace(/[0#]/g, (function (e) { return b < v.length ? v.charAt(b++) : "0" === e ? "0" : "" }))); if (h.match(u)) return "(" + (v = f(o, "##########", m)).substr(0, 3) + ") " + v.substr(3, 3) + "-" + v.substr(6); var _ = ""; if (y = h.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) return b = Math.min(y[4].length, 7), k = g(x, Math.pow(10, b) - 1, !1), v = "" + w, " " == (_ = A("n", y[1], k[1])).charAt(_.length - 1) && (_ = _.substr(0, _.length - 1) + "0"), v += _ + y[2] + "/" + y[3], (_ = l(k[2], b)).length < y[4].length && (_ = d(y[4].substr(y[4].length - _.length)) + _), v += _; if (y = h.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) return b = Math.min(Math.max(y[1].length, y[4].length), 7), w + ((k = g(x, Math.pow(10, b) - 1, !0))[0] || (k[1] ? "" : "0")) + " " + (k[1] ? n(k[1], b) + y[2] + "/" + y[3] + l(k[2], b) : a(" ", 2 * b + 1 + y[2].length + y[3].length)); if (y = h.match(/^[#0?]+$/)) return v = "" + m, h.length <= v.length ? v : d(h.substr(0, h.length - v.length)) + v; if (y = h.match(/^([#0]+)\.([#0]+)$/)) { v = "" + m.toFixed(Math.min(y[2].length, 10)).replace(/([^0])0+$/, "$1"), b = v.indexOf("."); var C = h.indexOf(".") - b, S = h.length - v.length - C; return d(h.substr(0, C) + v + h.substr(h.length - S)) } if (y = h.match(/^00,000\.([#0]*0)$/)) return m < 0 ? "-" + f(o, h, -m) : T("" + m).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, (function (e) { return "00," + (e.length < 3 ? r(0, 3 - e.length) : "") + e })) + "." + r(0, y[1].length); switch (h) { case "###,###": case "##,###": case "#,###": var I = T("" + x); return "0" !== I ? w + I : ""; default: if (h.match(/\.[0#?]*$/)) return f(o, h.slice(0, h.lastIndexOf(".")), m) + d(h.slice(h.lastIndexOf("."))) }throw new Error("unsupported format |" + h + "|") } return function (e, t, a) { return (0 | a) === a ? f(e, t, a) : p(e, t, a) } }(); function S(e) { for (var t = [], a = !1, r = 0, n = 0; r < e.length; ++r)switch (e.charCodeAt(r)) { case 34: a = !a; break; case 95: case 42: case 92: ++r; break; case 59: t[t.length] = e.substr(n, r - n), n = r + 1 }if (t[t.length] = e.substr(n), !0 === a) throw new Error("Format |" + e + "| unterminated string "); return t } e._split = S; var I = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/; function R(e) { for (var t = 0, a = "", r = ""; t < e.length;)switch (a = e.charAt(t)) { case "G": s(e, t) && (t += 6), t++; break; case '"': for (; 34 !== e.charCodeAt(++t) && t < e.length;); ++t; break; case "\\": case "_": t += 2; break; case "@": ++t; break; case "B": case "b": if ("1" === e.charAt(t + 1) || "2" === e.charAt(t + 1)) return !0; case "M": case "D": case "Y": case "H": case "S": case "E": case "m": case "d": case "y": case "h": case "s": case "e": case "g": return !0; case "A": case "a": case "上": if ("A/P" === e.substr(t, 3).toUpperCase()) return !0; if ("AM/PM" === e.substr(t, 5).toUpperCase()) return !0; if ("上午/下午" === e.substr(t, 5).toUpperCase()) return !0; ++t; break; case "[": for (r = a; "]" !== e.charAt(t++) && t < e.length;)r += e.charAt(t); if (r.match(I)) return !0; break; case ".": case "0": case "#": for (; t < e.length && ("0#?.,E+-%".indexOf(a = e.charAt(++t)) > -1 || "\\" == a && "-" == e.charAt(t + 1) && "0#".indexOf(e.charAt(t + 2)) > -1);); break; case "?": for (; e.charAt(++t) === a;); break; case "*": ++t, " " != e.charAt(t) && "*" != e.charAt(t) || ++t; break; case "(": case ")": ++t; break; case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": for (; t < e.length && "0123456789".indexOf(e.charAt(++t)) > -1;); break; case " ": default: ++t }return !1 } function $(e, t, a, r) { for (var n, l, i, o = [], c = "", u = 0, d = "", h = "t", m = "H"; u < e.length;)switch (d = e.charAt(u)) { case "G": if (!s(e, u)) throw new Error("unrecognized character " + d + " in " + e); o[o.length] = { t: "G", v: "General" }, u += 7; break; case '"': for (c = ""; 34 !== (i = e.charCodeAt(++u)) && u < e.length;)c += String.fromCharCode(i); o[o.length] = { t: "t", v: c }, ++u; break; case "\\": var p = e.charAt(++u), f = "(" === p || ")" === p ? p : "t"; o[o.length] = { t: f, v: p }, ++u; break; case "_": o[o.length] = { t: "t", v: " " }, u += 2; break; case "@": o[o.length] = { t: "T", v: t }, ++u; break; case "B": case "b": if ("1" === e.charAt(u + 1) || "2" === e.charAt(u + 1)) { if (null == n && null == (n = v(t, a, "2" === e.charAt(u + 1)))) return ""; o[o.length] = { t: "X", v: e.substr(u, 2) }, h = d, u += 2; break } case "M": case "D": case "Y": case "H": case "S": case "E": d = d.toLowerCase(); case "m": case "d": case "y": case "h": case "s": case "e": case "g": if (t < 0) return ""; if (null == n && null == (n = v(t, a))) return "#####"; for (c = d; ++u < e.length && e.charAt(u).toLowerCase() === d;)c += d; "m" === d && "h" === h.toLowerCase() && (d = "M"), "h" === d && (d = m), o[o.length] = { t: d, v: c }, h = d; break; case "A": case "a": case "上": var g = { t: d, v: d }; if (null == n && (n = v(t, a)), "A/P" === e.substr(u, 3).toUpperCase() ? (null != n && (g.v = n.H >= 12 ? "P" : "A"), g.t = "T", m = "h", u += 3) : "AM/PM" === e.substr(u, 5).toUpperCase() ? (null != n && (g.v = n.H >= 12 ? "PM" : "AM"), g.t = "T", u += 5, m = "h") : "上午/下午" === e.substr(u, 5).toUpperCase() ? (null != n && (g.v = n.H >= 12 ? "下午" : "上午"), g.t = "T", u += 5, m = "h") : (g.t = "t", ++u), null == n && "T" === g.t) return ""; o[o.length] = g, h = d; break; case "[": for (c = d; "]" !== e.charAt(u++) && u < e.length;)c += e.charAt(u); if ("]" !== c.slice(-1)) throw 'unterminated "[" block: |' + c + "|"; if (c.match(I)) { if (null == n && null == (n = v(t, a))) return ""; o[o.length] = { t: "Z", v: c.toLowerCase() }, h = c.charAt(1) } else c.indexOf("$") > -1 && (c = (c.match(/\$([^-\[\]]*)/) || [])[1] || "$", R(e) || (o[o.length] = { t: "t", v: c })); break; case ".": if (null != n) { for (c = d; ++u < e.length && "0" === (d = e.charAt(u));)c += d; o[o.length] = { t: "s", v: c }; break } case "0": case "#": for (c = d; ++u < e.length && "0#?.,E+-%".indexOf(d = e.charAt(u)) > -1;)c += d; o[o.length] = { t: "n", v: c }; break; case "?": for (c = d; e.charAt(++u) === d;)c += d; o[o.length] = { t: d, v: c }, h = d; break; case "*": ++u, " " != e.charAt(u) && "*" != e.charAt(u) || ++u; break; case "(": case ")": o[o.length] = { t: 1 === r ? "t" : d, v: d }, ++u; break; case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": for (c = d; u < e.length && "0123456789".indexOf(e.charAt(++u)) > -1;)c += e.charAt(u); o[o.length] = { t: "D", v: c }; break; case " ": o[o.length] = { t: d, v: d }, ++u; break; case "$": o[o.length] = { t: "t", v: "$" }, ++u; break; default: if (-1 === "¤฿BsBr₵₡₫ƒFtRs.₭kr£₤Lm₥₦₱PQRSkRp৲৳R$S/.〒₮₩¥NT¥zł₴₪៛руб€$,$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP$¥LekdinAf$dhAflRial?£BirrKzMOPPGKRsGsB/R$ррlevkrKMzBsPNuFBuKPkrRD$NfkCFA?CVEGMDFrCDHTGNAfLFdjKGSFGGHSRielKCFknKshLSLL£LtRFRONArRfMWKRMMURsMROS/KMDLMTnRC$kr€GELCHFSLLSCRDbSZLSDGSOSSomFCFPTShT$VUVQUGXгрнsomWSTNT$FtDramRpZMWFCFA".indexOf(d)) throw new Error("unrecognized character " + d + " in " + e); o[o.length] = { t: "t", v: d }, ++u }var y, b = 0, k = 0; for (u = o.length - 1, h = "t"; u >= 0; --u)switch (o[u].t) { case "h": case "H": o[u].t = m, h = "h", b < 1 && (b = 1); break; case "s": (y = o[u].v.match(/\.0+$/)) && (k = Math.max(k, y[0].length - 1)), b < 3 && (b = 3); case "d": case "y": case "M": case "e": h = o[u].t; break; case "m": "s" === h && (o[u].t = "M", b < 2 && (b = 2)); break; case "X": break; case "Z": b < 1 && o[u].v.match(/[Hh]/) && (b = 1), b < 2 && o[u].v.match(/[Mm]/) && (b = 2), b < 3 && o[u].v.match(/[Ss]/) && (b = 3) }switch (b) { case 0: break; case 1: n.u >= .5 && (n.u = 0, ++n.S), n.S >= 60 && (n.S = 0, ++n.M), n.M >= 60 && (n.M = 0, ++n.H); break; case 2: n.u >= .5 && (n.u = 0, ++n.S), n.S >= 60 && (n.S = 0, ++n.M) }var x, w = ""; for (u = 0; u < o.length; ++u)switch (o[u].t) { case "t": case "T": case " ": case "D": break; case "X": o[u].v = "", o[u].t = ";"; break; case "d": case "m": case "y": case "h": case "H": case "M": case "s": case "e": case "b": case "Z": o[u].v = C(o[u].t.charCodeAt(0), o[u].v, n, k), o[u].t = "t"; break; case "n": case "?": for (x = u + 1; null != o[x] && ("?" === (d = o[x].t) || "D" === d || (" " === d || "t" === d) && null != o[x + 1] && ("?" === o[x + 1].t || "t" === o[x + 1].t && "/" === o[x + 1].v) || "(" === o[u].t && (" " === d || "n" === d || ")" === d) || "t" === d && ("/" === o[x].v || " " === o[x].v && null != o[x + 1] && "?" == o[x + 1].t));)o[u].v += o[x].v, o[x] = { v: "", t: ";" }, ++x; w += o[u].v, u = x - 1; break; case "G": o[u].t = "t", o[u].v = _(t, a) }var T, S, $ = ""; if (w.length > 0) { 40 == w.charCodeAt(0) ? (T = t < 0 && 45 === w.charCodeAt(0) ? -t : t, S = A("n", w, T)) : (S = A("n", w, T = t < 0 && r > 1 ? -t : t), T < 0 && o[0] && "t" == o[0].t && (S = S.substr(1), o[0].v = "-" + o[0].v)), x = S.length - 1; var q = o.length; for (u = 0; u < o.length; ++u)if (null != o[u] && "t" != o[u].t && o[u].v.indexOf(".") > -1) { q = u; break } var D = o.length; if (q === o.length && -1 === S.indexOf("E")) { for (u = o.length - 1; u >= 0; --u)null != o[u] && -1 !== "n?".indexOf(o[u].t) && (x >= o[u].v.length - 1 ? (x -= o[u].v.length, o[u].v = S.substr(x + 1, o[u].v.length)) : x < 0 ? o[u].v = "" : (o[u].v = S.substr(0, x + 1), x = -1), o[u].t = "t", D = u); x >= 0 && D < o.length && (o[D].v = S.substr(0, x + 1) + o[D].v) } else if (q !== o.length && -1 === S.indexOf("E")) { for (x = S.indexOf(".") - 1, u = q; u >= 0; --u)if (null != o[u] && -1 !== "n?".indexOf(o[u].t)) { for (l = o[u].v.indexOf(".") > -1 && u === q ? o[u].v.indexOf(".") - 1 : o[u].v.length - 1, $ = o[u].v.substr(l + 1); l >= 0; --l)x >= 0 && ("0" === o[u].v.charAt(l) || "#" === o[u].v.charAt(l)) && ($ = S.charAt(x--) + $); o[u].v = $, o[u].t = "t", D = u } for (x >= 0 && D < o.length && (o[D].v = S.substr(0, x + 1) + o[D].v), x = S.indexOf(".") + 1, u = q; u < o.length; ++u)if (null != o[u] && (-1 !== "n?(".indexOf(o[u].t) || u === q)) { for (l = o[u].v.indexOf(".") > -1 && u === q ? o[u].v.indexOf(".") + 1 : 0, $ = o[u].v.substr(0, l); l < o[u].v.length; ++l)x < S.length && ($ += S.charAt(x++)); o[u].v = $, o[u].t = "t", D = u } } } for (u = 0; u < o.length; ++u)null != o[u] && "n?".indexOf(o[u].t) > -1 && (T = r > 1 && t < 0 && u > 0 && "-" === o[u - 1].v ? -t : t, o[u].v = A(o[u].t, o[u].v, T), o[u].t = "t"); var F = ""; for (u = 0; u !== o.length; ++u)null != o[u] && (F += o[u].v); return F } e.is_date = R, e._eval = $; var q = /\[[=<>]/, D = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/; function F(e, t) { if (null == t) return !1; var a = parseFloat(t[2]); switch (t[1]) { case "=": if (e == a) return !0; break; case ">": if (e > a) return !0; break; case "<": if (e < a) return !0; break; case "<>": if (e != a) return !0; break; case ">=": if (e >= a) return !0; break; case "<=": if (e <= a) return !0 }return !1 } function E(e, t, a) { null == a && (a = {}); var r = ""; switch (Sa(e)) { case "string": r = "m/d/yy" == e && a.dateNF ? a.dateNF : e; break; case "number": null == (r = 14 == e && a.dateNF ? a.dateNF : (null != a.table ? a.table : h)[e]) && (r = a.table && a.table[m[e]] || h[m[e]]), null == r && (r = f[e] || "General") }if (r.match(/^(w|W)((0?)|(0\.0+))$/)) { if (isNaN(t)) return t; var n = r.slice(1), l = !1; !isNaN(t) && Number(t) < 0 && (l = !0, t = Math.abs(t)); var i = parseInt(t).toString().length; if (i > 4) { if (i > 8) { var o = parseInt(t / 1e8), c = parseInt(parseFloat(t).subtract(1e8 * o) / 1e4), u = parseFloat(t).subtract(1e8 * o + 1e4 * c); "" != n && (u = fs(u).format(n)), t = o + "亿" + c + "万" + u } else { c = parseInt(t / 1e4), u = parseFloat(t).subtract(1e4 * c); "" != n && (u = fs(u).format(n)), t = c + "万" + u } if (-1 != t.indexOf("亿0万0") ? t = t.replace("0万0", "") : -1 != t.indexOf("亿0万") ? t = t.replace("0万", "") : -1 != t.indexOf("万0") && (t = t.replace("万0", "万")), -1 != t.indexOf("亿") && -1 == t.indexOf("万")) { if ("." !== (d = t.substring(t.indexOf("亿") + 1)).substring(0, 1) && "" != d) { switch ((parseInt(d) + "").length) { case 1: d = "000" + d; break; case 2: d = "00" + d; break; case 3: d = "0" + d }t = t.substring(0, t.indexOf("亿") + 1) + d } } else if (-1 == t.indexOf("亿") && -1 != t.indexOf("万")) { if ("." !== (p = t.substring(t.indexOf("万") + 1)).substring(0, 1) && "" != p) { switch ((parseInt(p) + "").length) { case 1: p = "000" + p; break; case 2: p = "00" + p; break; case 3: p = "0" + p }t = t.substring(0, t.indexOf("万") + 1) + p } } else if (-1 != t.indexOf("亿") && -1 != t.indexOf("万")) { var d = t.substring(t.indexOf("亿") + 1, t.indexOf("万")), p = t.substring(t.indexOf("万") + 1); switch ((parseInt(d) + "").length) { case 1: d = "000" + d; break; case 2: d = "00" + d; break; case 3: d = "0" + d }if (t = t.substring(0, t.indexOf("亿") + 1) + d + t.substring(t.indexOf("万")), "." !== p.substring(0, 1) && "" != p) { switch ((parseInt(p) + "").length) { case 1: p = "000" + p; break; case 2: p = "00" + p; break; case 3: p = "0" + p }t = t.substring(0, t.indexOf("万") + 1) + p } } } else "" != n && (t = fs(t).format(n)); return l ? "-" + t : t } if (s(r, 0)) return _(t, a); t instanceof Date && (t = x(t, a.date1904)); var g = function (e, t) { var a = S(e), r = a.length, n = a[r - 1].indexOf("@"); if (r < 4 && n > -1 && --r, a.length > 4) throw new Error("cannot find right format for |" + a.join("|") + "|"); if ("number" != typeof t) return [4, 4 === a.length || n > -1 ? a[a.length - 1] : "@"]; switch (a.length) { case 1: a = n > -1 ? ["General", "General", "General", a[0]] : [a[0], a[0], a[0], "@"]; break; case 2: a = n > -1 ? [a[0], a[0], a[0], a[1]] : [a[0], a[1], a[0], "@"]; break; case 3: a = n > -1 ? [a[0], a[1], a[0], a[2]] : [a[0], a[1], a[2], "@"] }var l = t > 0 ? a[0] : t < 0 ? a[1] : a[2]; if (-1 === a[0].indexOf("[") && -1 === a[1].indexOf("[")) return [r, l]; if (null != a[0].match(q) || null != a[1].match(q)) { var i = a[0].match(D), o = a[1].match(D); return F(t, i) ? [r, a[0]] : F(t, o) ? [r, a[1]] : [r, a[null != i && null != o ? 2 : 1]] } return [r, l] }(r, t); if (s(g[1])) return _(t, a); if (!0 === t) t = "TRUE"; else if (!1 === t) t = "FALSE"; else if ("" === t || null == t) return ""; return $(g[1], t, a, g[0]) } function M(e, t) { if ("number" != typeof t) { t = +t || -1; for (var a = 0; a < 392; ++a)if (null != h[a]) { if (h[a] == e) { t = a; break } } else t < 0 && (t = a); t < 0 && (t = 391) } return h[t] = e, t } e.load = M, e._table = h, e.get_table = function () { return h }, e.load_table = function (e) { for (var t = 0; 392 != t; ++t)void 0 !== e[t] && M(e[t], t) }, e.init_table = d, e.format = E }(gs); gs._table[22], gs._table[15], gs._table[14], gs._table[19], gs._table[18], gs._table[20], gs._table[2], gs._table[4], gs._table[10], gs._table[11], new Date(1899, 11, 31, 0, 0, 0).getTime(); var vs = new Date(1900, 2, 1, 0, 0, 0); function ys(e, t) { var a = Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds()), r = Date.UTC(1899, 11, 31, 0, 0, 0); return t ? a -= 1262304e5 : e >= vs && (a += 864e5), (a - r) / 864e5 } var bs = new Date("2017-02-19T19:06:09.000Z"); isNaN(bs.getFullYear()) && (bs = new Date("2/19/17")); var ks = 2017 == bs.getFullYear(); function xs(e) { var t = null, a = {}, r = e; if (null == e) return null; if ("'" === e.toString().substr(0, 1)) t = e.toString().substr(1), a = { fa: "@", t: "s" }; else if ("TRUE" === e.toString().toUpperCase()) t = "TRUE", a = { fa: "General", t: "b" }, r = !0; else if ("FALSE" === e.toString().toUpperCase()) t = "FALSE", a = { fa: "General", t: "b" }, r = !1; else if (ka(e)) t = e.toString(), a = { fa: "General", t: "e" }; else if (/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(e)) t = e.toString(), a = { fa: "@", t: "s" }; else if (ba(e) && Math.abs(parseFloat(e)) > 0 && (Math.abs(parseFloat(e)) >= 1e11 || Math.abs(parseFloat(e)) < 1e-9)) { var n = (r = fs(e).value()).toExponential(); if (n.indexOf(".") > -1) { var l = n.split(".")[1].split("e")[0].length; l > 5 && (l = 5), a = { fa: "#0." + new Array(l + 1).join("0") + "E+00", t: "n" } } else a = { fa: "#0.E+00", t: "n" }; t = gs.format(a.fa, r) } else if (e.toString().indexOf("%") > -1) { var i = e.toString().indexOf("%"), o = (h = e.toString().substr(0, i)).replace(/,/g, ""); if (i == e.toString().length - 1 && ba(o)) if (h.indexOf(".") > -1) if (h.indexOf(".") == h.lastIndexOf(".")) { var s = h.split(".")[0]; if ((m = h.split(".")[1].length) > 9 && (m = 9), s.indexOf(",") > -1) { for (var c = !0, u = s.split(","), d = 1; d < u.length; d++)if (u[d].length < 3) { c = !1; break } c ? (a = { fa: "#,##0." + new Array(m + 1).join("0") + "%", t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r)) : (t = e.toString(), a = { fa: "@", t: "s" }) } else a = { fa: "0." + new Array(m + 1).join("0") + "%", t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r) } else t = e.toString(), a = { fa: "@", t: "s" }; else if (h.indexOf(",") > -1) { for (c = !0, u = h.split(","), d = 1; d < u.length; d++)if (u[d].length < 3) { c = !1; break } c ? (a = { fa: "#,##0%", t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r)) : (t = e.toString(), a = { fa: "@", t: "s" }) } else a = { fa: "0%", t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r); else t = e.toString(), a = { fa: "@", t: "s" } } else if (e.toString().indexOf(".") > -1) if (e.toString().indexOf(".") == e.toString().lastIndexOf(".")) { var h, m, p = e.toString().split(".")[0]; if ((m = (h = e.toString().split(".")[1]).length) > 9 && (m = 9), p.indexOf(",") > -1) { for (c = !0, u = p.split(","), d = 1; d < u.length; d++)if (!ba(u[d]) || u[d].length < 3) { c = !1; break } c ? (a = { fa: "#,##0." + new Array(m + 1).join("0"), t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r)) : (t = e.toString(), a = { fa: "@", t: "s" }) } else ba(p) && ba(h) ? (a = { fa: "0." + new Array(m + 1).join("0"), t: "n" }, r = fs(e).value(), t = gs.format(a.fa, r)) : (t = e.toString(), a = { fa: "@", t: "s" }) } else t = e.toString(), a = { fa: "@", t: "s" }; else ba(e) ? (t = e.toString(), a = { fa: "General", t: "n" }, r = parseFloat(e)) : ds(e) && (e.toString().indexOf(".") > -1 || e.toString().indexOf(":") > -1 || e.toString().length < 16) ? ((r = ys(function (e, t) { var a = new Date(e); if (ks) return t > 0 ? a.setTime(a.getTime() + 60 * a.getTimezoneOffset() * 1e3) : t < 0 && a.setTime(a.getTime() - 60 * a.getTimezoneOffset() * 1e3), a; if (e instanceof Date) return e; if (1917 == bs.getFullYear() && !isNaN(a.getFullYear())) { var r = a.getFullYear(); return e.indexOf("" + r) > -1 || a.setFullYear(a.getFullYear() + 100), a } var n = e.match(/\d+/g) || ["2017", "2", "19", "0", "0", "0"], l = new Date(+n[0], +n[1] - 1, +n[2], +n[3] || 0, +n[4] || 0, +n[5] || 0); return e.indexOf("Z") > -1 && (l = new Date(l.getTime() - 60 * l.getTimezoneOffset() * 1e3)), l }(e.toString().replace(/-/g, "/")))).toString().indexOf(".") > -1 ? e.toString().length > 18 ? a.fa = "yyyy-MM-dd hh:mm:ss" : e.toString().length > 11 ? a.fa = "yyyy-MM-dd hh:mm" : a.fa = "yyyy-MM-dd" : a.fa = "yyyy-MM-dd", a.t = "d", t = gs.format(a.fa, r)) : (t = e, a.fa = "General", a.t = "g"); return [t, a, r] } function ws(e, t) { return gs.format(e, t) } function _s(e, t, a) { var r = Ko(e, t, a, "m"); return null == r ? r = Ko(e, t, a, "v") : isNaN(function (e) { var t = Number(e); if ("number" == typeof e) return e; if (!isNaN(t)) return t; var a = 1, r = e.replace(/([\d]),([\d])/g, "$1$2").replace(/[$]/g, "").replace(/[%]/g, (function () { return a *= 100, "" })); return isNaN(t = Number(r)) ? (r = r.replace(/[(](.*)[)]/, (function (e, t) { return a = -a, t })), isNaN(t = Number(r)) ? t : t / a) : t / a }(r)) ? null != a[e][t].ct && "d" == a[e][t].ct.t || null != a[e][t].ct && "b" == a[e][t].ct.t || (r = Ko(e, t, a, "v")) : "string" == typeof r && r.indexOf("%") > -1 || (r = Ko(e, t, a, "v")), r } function Cs(e, t, a, r) { null == a && (a = ga.flowdata); var n, l = a[e][t]; if ("object" == Cm(r) ? (null == l ? l = r : (null != r.f && (l.f = r.f), null != r.spl && (l.spl = r.spl), null != r.ct && (l.ct = r.ct)), n = "object" == Cm(r.v) ? r.v.v : r.v) : n = r, ya(n)) return "object" == Cm(l) ? (delete l.m, delete l.v) : l = null, void (a[e][t] = l); if ((ya(l) || ("string" === Cm(l) || "number" === Cm(l)) && l === r) && (l = {}), "'" == n.toString().substr(0, 1)) l.m = n.toString().substr(1), l.ct = { fa: "@", t: "s" }, l.v = n.toString().substr(1), l.qp = 1; else if (1 == l.qp) l.m = n.toString(), l.ct = { fa: "@", t: "s" }, l.v = n.toString(); else if ("TRUE" === n.toString().toUpperCase()) l.m = "TRUE", l.ct = { fa: "General", t: "b" }, l.v = !0; else if ("FALSE" === n.toString().toUpperCase()) l.m = "FALSE", l.ct = { fa: "General", t: "b" }, l.v = !1; else if (ka(n)) l.m = n.toString(), null != l.ct ? l.ct.t = "e" : l.ct = { fa: "General", t: "e" }, l.v = n; else if (null != l.f && ba(n) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(n)) if (l.v = parseFloat(n), null == l.ct && (l.ct = { fa: "General", t: "n" }), l.v == 1 / 0 || l.v == -1 / 0) l.m = l.v.toString(); else if (l.v.toString().indexOf("e") > -1) { var i; (i = 1 == l.v.toString().split(".").length ? 0 : l.v.toString().split(".")[1].split("e")[0].length) > 5 && (i = 5), l.m = l.v.toExponential(i).toString() } else { var o = Math.round(1e9 * l.v) / 1e9; if (null == l.ct) { var s = xs(o); l.m = s[0].toString() } else { var c = ws(l.ct.fa, o); l.m = c.toString() } } else if (null != l.ct && "@" == l.ct.fa) l.m = n.toString(), l.v = n; else if (null != l.ct && null != l.ct.fa && "General" != l.ct.fa) { ba(n) && (n = parseFloat(n)); var u = ws(l.ct.fa, n); u === n ? (u = xs(n), l.m = u[0].toString(), l.ct = u[1], l.v = u[2]) : (l.m = u.toString(), l.v = n) } else if (ba(n) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(n)) if (n = parseFloat(n), l.v = parseFloat(n), l.ct = { fa: "General", t: "n" }, l.v == 1 / 0 || l.v == -1 / 0) l.m = l.v.toString(); else { var d = xs(l.v); l.m = d[0].toString() } else { var h = xs(n); l.m = h[0].toString(), l.ct = h[1], l.v = h[2] } if (!pd.allowUpdate && !fa.pointEdit && null != l.ct && 0 == /^(w|W)((0?)|(0\.0+))$/.test(l.ct.fa) && "n" == l.ct.t && null != l.v && parseInt(l.v).toString().length > 4) { var m = function (e, t) { var a, r = "0."; if ("TRUE" == e) { if (null == t) return "w"; var n = parseInt(t); if (0 == n) return "w0"; r = "w0."; for (var l = 0; l < n; l++)r += "0"; a = r } else { if (null == t) return "General"; var i = parseInt(t); if (0 == i) return "0"; for (var o = 0; o < i; o++)r += "0"; a = r } return a.toString() }(fa.autoFormatw.toString().toUpperCase(), fa.accuracy); "General" != m && (l.ct.fa = m, l.m = ws(m, l.v)) } a[e][t] = l } function Ts(e, t) { var a = e.length - 1; return a = e.length < 40 || t <= e[20] || t >= e[a - 20] ? function (e, t) { for (var a = 0, r = 0, n = -1, l = e.length - 1; a < e.length && l >= 0 && l >= a;) { if (r = e[l], t >= (0 == l ? 0 : e[l - 1]) && t < r) { n = l; break } if (r = e[a], t >= (0 == a ? 0 : e[a - 1]) && t < r) { n = a; break } a++, l-- } return n }(e, t) : function (e, t) { for (var a = 0, r = e.length - 1; a <= r;) { var n = parseInt((r + a) / 2); if (t < e[n] && (0 == n || t >= e[n - 1])) return n; if (t >= e[n]) a = n + 1; else { if (!(t < e[n])) return -1; r = n - 1 } } }(e, t) } function As(e) { var t; return t = ga.visibledatarow[e], [0 == e ? 0 : ga.visibledatarow[e - 1], t, e] } function Ss(e) { var t = Ts(ga.visibledatarow, e); return -1 == t && e > 0 ? t = ga.visibledatarow.length - 1 : -1 == t && e <= 0 && (t = 0), As(t) } function Is(e) { var t; return t = ga.visibledatacolumn[e], [0 == e ? 0 : ga.visibledatacolumn[e - 1], t, e] } function Rs(e) { var t = Ts(ga.visibledatacolumn, e); return -1 == t && e > 0 ? t = ga.visibledatacolumn.length - 1 : -1 == t && e <= 0 && (t = 0), Is(t) } function $s(e, t) { var a = $("#" + ga.container).offset(); return [e - a.left - ga.rowHeaderWidth, t - a.top - ga.infobarHeight - ga.toolbarHeight - ga.calculatebarHeight - ga.columnHeaderHeight] } function qs(e, t, a, r) { var n = $.extend(!0, {}, r); null == n.rowlen && (n.rowlen = {}), null == n.customHeight && (n.customHeight = {}); var l = $("#luckysheetTableContent").get(0).getContext("2d"); l.textBaseline = "top"; for (var i = t; i <= a; i++)if (null == n.rowhidden || null == n.rowhidden[i]) { var o = ga.defaultrowlen; if (1 != n.customHeight[i]) { delete n.rowlen[i]; for (var s = 0; s < e[i].length; s++) { var c = e[i][s]; if (null != c && null == c.mc && (null != c && (null != c.v || No(c)))) { var u = Es(c, l, { r: i, c: s, cellWidth: Is(s)[1] - Is(s)[0] - 2 }), d = 0; null != u && (d = u.textHeightAll + 2), d > o && (o = d) } } (o /= ga.zoomRatio) != ga.defaultrowlen && (n.rowlen[i] = o) } } return n } function Ds(e, t) { for (var a = [], r = 0, n = 0; n < e; n++) { var l = ga.defaultrowlen; null != t.rowlen && null != t.rowlen[n] && (l = t.rowlen[n]), null == t.rowhidden || null == t.rowhidden[n] ? (r += l + 1, a.push(r)) : (l = t.rowhidden[n], a.push(r)) } return a } function Fs(e, t, a) { var r = ga.measureTextCache[e + "_" + t.font]; if (null != a && (r = ga.measureTextCache[e + "_" + a]), null != r) return r; if (null != a) { t.font; t.font = a } var n = t.measureText(e), l = {}; if (l.width = n.width, null != a && (t.font = a), l.actualBoundingBoxDescent = n.actualBoundingBoxDescent, l.actualBoundingBoxAscent = n.actualBoundingBoxAscent, null == l.actualBoundingBoxDescent || null == l.actualBoundingBoxAscent || isNaN(l.actualBoundingBoxDescent) || isNaN(l.actualBoundingBoxAscent)) { var i = "M"; xa(e) && (i = "田"); var o = .8 * xm.getTextSize(i, t.font)[1]; "top" == t.textBaseline ? (l.actualBoundingBoxDescent = o, l.actualBoundingBoxAscent = 0) : "middle" == t.textBaseline ? (l.actualBoundingBoxDescent = o / 2, l.actualBoundingBoxAscent = o / 2) : (l.actualBoundingBoxDescent = 0, l.actualBoundingBoxAscent = o) } if ("alphabetic" == t.textBaseline) { var s = ga.measureTextCache["gjpqy_" + t.font]; null != a && (s = ga.measureTextCache["gjpqy_" + a]); var c = ga.measureTextCache["abcdABCD_" + t.font]; null != a && (c = ga.measureTextCache["abcdABCD_" + a]), null == s && (s = t.measureText("gjpqy")), null == c && (c = t.measureText("abcdABCD")), l.actualBoundingBoxDescent <= c.actualBoundingBoxDescent && (l.actualBoundingBoxDescent = s.actualBoundingBoxDescent, null == l.actualBoundingBoxDescent && (l.actualBoundingBoxDescent = 0)) } return l.width *= ga.zoomRatio, l.actualBoundingBoxDescent *= ga.zoomRatio, l.actualBoundingBoxAscent *= ga.zoomRatio, ga.measureTextCache[e + "_" + ga.zoomRatio + "_" + t.font] = l, l } function Es(e, t, a) { var r = a.cellWidth, n = a.cellHeight, l = "", i = ""; null == r && (l = "onlyWidth", i = "_"); var o = ga.measureTextCellInfoCache[a.r + "_" + a.c + i + l]; if (null != o) return o; var s = a.space_width, c = a.space_height; null == s && (s = 2), null == c && (c = 2); var u = ts(e, "ht"), d = ts(e, "vt"), h = ts(e, "tb"), m = ts(e, "tr"), p = ts(e, "rt"), f = 1; null == p && ("0" == m ? p = 0 : "1" == m ? p = 45 : "4" == m ? p = 90 : "2" == m ? p = 135 : "5" == m && (p = 180), null == p && (p = 0)), (p > 180 || p < 0) && (p = 0), (p = parseInt(p)) > 90 && (p = 90 - p, f = 0), t.textAlign = "start"; var g, v, y = { values: [] }, b = "0", k = "0", x = 11, w = !1, _ = []; if (No(e)) { for (var C = e.ct.s, T = 0, A = 0; A < C.length; A++) { for (var S = C[A], I = qm(S), R = S.fc, $ = S.cl, q = S.un, D = S.v, F = S.fs, E = (D = D.replace(/\r\n/g, "_x000D_").replace(/&#13;&#10;/g, "_x000D_").replace(/\r/g, "_x000D_").replace(/\n/g, "_x000D_")).split("_x000D_"), M = 0; M < E.length; M++) { var N = E[M]; if ("" == N && M != E.length - 1) _.push({ fontset: I, fc: null == R ? "#000" : R, cl: null == $ ? 0 : $, un: null == q ? 0 : q, wrap: !0, fs: null == F ? 11 : F }), T++; else { for (var P = N.split(""), z = 0; z < P.length; z++) { var L = P[z]; _.push({ fontset: I, fc: null == R ? "#000" : R, cl: null == $ ? 0 : $, un: null == q ? 0 : q, v: L, si: T, fs: null == F ? 11 : F }) } M != E.length - 1 && (_.push({ fontset: I, fc: null == R ? "#000" : R, cl: null == $ ? 0 : $, un: null == q ? 0 : q, wrap: !0, fs: null == F ? 11 : F }), T++) } } T++ } w = !0 } else if (g = qm(e), t.font = g, b = ts(e, "cl"), k = ts(e, "un"), x = ts(e, "fs"), e instanceof Object ? null == (v = e.m) && (v = e.v) : v = e, ya(v)) return null; if ("3" == m) { t.textBaseline = "top"; var O = 0, B = 0, V = 0, H = 0, U = {}, j = []; if (w) for (var G = null, W = 0; W < _.length; W++) { var Y = _[W], X = Y.v, K = Y.v; if (!0 === Y.wrap && (X = "M", K = "", null != G && !0 !== G.wrap && W < _.length - 1)) j.push(H), H = 0, V += 1, G = Y; else { var Z = Fs(X, t, Y.fontset), Q = Z.width + s, J = Z.actualBoundingBoxAscent + Z.actualBoundingBoxDescent + c; H += J, "2" != h || Y.wrap || H > n && null != U[V] && (j.push(H - J), H = J, V += 1), W == _.length - 1 && j.push(H), null == U[V] && (U[V] = []); var ee = { content: K, style: Y, width: Q, height: J, left: 0, top: 0, colIndex: V, asc: Z.actualBoundingBoxAscent, desc: Z.actualBoundingBoxDescent, inline: !0 }; !0 === Y.wrap && (ee.wrap = !0), U[V].push(ee), console.log("normal", W, V, Y, G, U), G = Y } } else { var te = Fs(v, t), ae = te.actualBoundingBoxDescent + te.actualBoundingBoxAscent, re = []; (v = v.toString()).length > 1 ? re = v.split("") : re.push(v); for (var ne = Fs(re[0], t).width, le = 0; le < re.length; le++) { var ie = ne + s, oe = ae + c; H += oe, "2" == h && H > n && null != U[V] && (j.push(H - oe), H = oe, V += 1), le == re.length - 1 && j.push(H), null == U[V] && (U[V] = []), U[V].push({ content: re[le], style: g, width: ie, height: oe, left: 0, top: 0, colIndex: V, asc: te.actualBoundingBoxAscent, desc: te.actualBoundingBoxDescent }) } } for (var se = [], ce = 0; ce < j.length; ce++) { for (var ue = j[ce], de = U[ce], he = 0, me = 0; me < de.length; me++) { var pe = de[me]; he = Math.max(he, pe.width) } se.push(he), O += he, B = Math.max(B, ue) } if (y.type = "verticalWrap", y.textWidthAll = O, y.textHeightAll = B, "onlyWidth" == l) return y; for (var fe = 0, ge = 0; ge < j.length; ge++) { for (var ve = j[ge], ye = se[ge], be = U[ge], ke = 0, xe = 0; xe < be.length; xe++) { var we = be[xe], _e = s + fe; "0" == u ? _e = r / 2 + fe - O / 2 + s * j.length : "2" == u && (_e = r + fe - O + s); var Ce = n - c + ke - ve; "0" == d ? Ce = n / 2 + ke - ve / 2 : "1" == d && (Ce = c + ke), ke += we.height, we.left = _e, we.top = Ce, Ms(we, b, k, { width: ye, height: we.height, left: _e, top: Ce + we.height - c, asc: we.height, desc: 0, fs: x }), y.values.push(we) } fe += ye } } else { var Te = function (e) { return null != e.measureText("田").actualBoundingBoxAscent }(t); if (t.textBaseline = Te ? "alphabetic" : "bottom", "2" == h || w) { var Ae = 0, Se = 0, Ie = 0, Re = 0, $e = {}; y.rotate = p, p = Math.abs(p); var qe, De, Fe, Ee, Me = 0, Ne = 1, Pe = null, ze = null; if (w) for (; Ne <= _.length;) { var Le = _.slice(Me, Ne); if (!0 !== Le[Le.length - 1].wrap) { for (var Oe = 0, Be = 0, Ve = 0; Ve < Le.length; Ve++) { var He = Le[Ve]; null == He.measureText && (He.measureText = Fs(He.v, t, He.fontset)), Oe += He.measureText.width, Be = Math.max(He.measureText.actualBoundingBoxAscent + He.measureText.actualBoundingBoxDescent) } var Ue = Oe * Math.cos(p * Math.PI / 180) + Be * Math.sin(p * Math.PI / 180), je = Oe * Math.sin(p * Math.PI / 180) + Be * Math.cos(p * Math.PI / 180), Ge = Le[Le.length - 1]; if (" " != Ge.v && 2 != Ca(Ge.v) || (ze = Ne), 0 != p) if (console.log(je, c, n, Le, je + c > n), je + c > n && null != $e[Re] && "2" == h && Ne != _.length) if (null != ze && ze < Ne) { for (var We = 0; We < ze - Me; We++) { var Ye = Le[We]; $e[Re].push({ content: Ye.v, style: Ye, width: Ye.measureText.width, height: Ye.measureText.actualBoundingBoxAscent + Ye.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: Ye.measureText.actualBoundingBoxAscent, desc: Ye.measureText.actualBoundingBoxDescent, inline: !0, fs: Ye.fs }) } Me = ze, Ne = ze + 1, Re += 1, ze = null } else { Me = Ne - 1; for (var Xe = 0; Xe < Le.length - 1; Xe++) { var Ke = Le[Xe]; $e[Re].push({ content: Ke.v, style: Ke, width: Ke.measureText.width, height: Ke.measureText.actualBoundingBoxAscent + Ke.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: Ke.measureText.actualBoundingBoxAscent, desc: Ke.measureText.actualBoundingBoxDescent, inline: !0, fs: Ke.fs }) } Re += 1 } else { if (Ne == _.length) { null == $e[Re] && ($e[Re] = []); for (var Ze = 0; Ze < Le.length; Ze++) { var Qe = Le[Ze]; $e[Re].push({ content: Qe.v, style: Qe, width: Qe.measureText.width, height: Qe.measureText.actualBoundingBoxAscent + Qe.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: Qe.measureText.actualBoundingBoxAscent, desc: Qe.measureText.actualBoundingBoxDescent, inline: !0, fs: Qe.fs }) } break } null == $e[Re] && ($e[Re] = []), Ne++ } else if (Ue + s > r && null != $e[Re] && "2" == h && Ne != _.length) if (null != ze && ze < Ne) { for (var Je = 0; Je < ze - Me; Je++) { var et = Le[Je]; $e[Re].push({ content: et.v, style: et, width: et.measureText.width, height: et.measureText.actualBoundingBoxAscent + et.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: et.measureText.actualBoundingBoxAscent, desc: et.measureText.actualBoundingBoxDescent, inline: !0, fs: et.fs }) } Me = ze, Ne = ze + 1, Re += 1, ze = null } else { Me = Ne - 1; for (var tt = 0; tt < Le.length - 1; tt++) { var at = Le[tt]; $e[Re].push({ content: at.v, style: at, width: at.measureText.width, height: at.measureText.actualBoundingBoxAscent + at.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: at.measureText.actualBoundingBoxAscent, desc: at.measureText.actualBoundingBoxDescent, inline: !0, fs: at.fs }) } Re += 1 } else { if (Ne == _.length) { null == $e[Re] && ($e[Re] = []); for (var rt = 0; rt < Le.length; rt++) { var nt = Le[rt]; $e[Re].push({ content: nt.v, style: nt, width: nt.measureText.width, height: nt.measureText.actualBoundingBoxAscent + nt.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: nt.measureText.actualBoundingBoxAscent, desc: nt.measureText.actualBoundingBoxDescent, inline: !0, fs: nt.fs }) } break } null == $e[Re] && ($e[Re] = []), Ne++ } } else { if (Me = Ne, Le.length > 1) for (var lt = 0; lt < Le.length - 1; lt++) { var it = Le[lt], ot = { content: it.v, style: it, width: it.measureText.width, height: it.measureText.actualBoundingBoxAscent + it.measureText.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: it.measureText.actualBoundingBoxAscent, desc: it.measureText.actualBoundingBoxDescent, inline: !0, fs: it.fs }; $e[Re].push(ot) } if (1 == Le.length || Ne == _.length) { var st = Le[0], ct = Fs("M", t, st.fontset); null == $e[Re] && ($e[Re] = []), $e[Re].push({ content: "", style: st, width: ct.width, height: ct.actualBoundingBoxAscent + ct.actualBoundingBoxDescent, left: 0, top: 0, splitIndex: Re, asc: ct.actualBoundingBoxAscent, desc: ct.actualBoundingBoxDescent, inline: !0, wrap: !0, fs: st.fs }) } Re += 1, Ne++ } } else for (v = v.toString(); Ne <= v.length;) { var ut = v.substring(Me, Ne), dt = Fs(ut, t), ht = dt.width, mt = dt.actualBoundingBoxAscent + dt.actualBoundingBoxDescent, pt = ht * Math.cos(p * Math.PI / 180) + mt * Math.sin(p * Math.PI / 180), ft = ht * Math.sin(p * Math.PI / 180) + mt * Math.cos(p * Math.PI / 180), gt = ut.substr(ut.length - 1, 1); if (" " != gt && 2 != Ca(gt) || null != Ee && (Pe = { index: Ne, str: qe, width: Fe, height: De, asc: Ee.actualBoundingBoxAscent, desc: Ee.actualBoundingBoxDescent }), 0 != p) if (ft + c > n && null != $e[Re] && Ne != v.length) null != Pe && Pe.index < Ne ? (Me = Pe.index, Ne = Pe.index + 1, $e[Re].push({ content: Pe.str, style: g, width: Pe.width, height: Pe.height, left: 0, top: 0, splitIndex: Re, asc: Pe.asc, desc: Pe.desc, fs: x }), Re += 1, Pe = null) : (Me = Ne - 1, $e[Re].push({ content: qe, style: g, left: 0, top: 0, splitIndex: Re, height: De, width: Fe, asc: dt.actualBoundingBoxAscent, desc: dt.actualBoundingBoxDescent, fs: x }), Re += 1); else { if (Ne == v.length) { null == $e[Re] && ($e[Re] = []), $e[Re].push({ content: ut, style: g, left: 0, top: 0, splitIndex: Re, height: mt, width: ht, asc: dt.actualBoundingBoxAscent, desc: dt.actualBoundingBoxDescent, fs: x }); break } null == $e[Re] && ($e[Re] = []), Ne++ } else if (pt + s > r && null != $e[Re] && Ne != v.length) null != Pe && Pe.index < Ne ? (Me = Pe.index, Ne = Pe.index + 1, $e[Re].push({ content: Pe.str, style: g, width: Pe.width, height: Pe.height, left: 0, top: 0, splitIndex: Re, asc: Pe.asc, desc: Pe.desc, fs: x }), Re += 1, Pe = null) : (Pe = null, Me = Ne - 1, $e[Re].push({ content: qe, style: g, width: Fe, height: De, left: 0, top: 0, splitIndex: Re, asc: dt.actualBoundingBoxAscent, desc: dt.actualBoundingBoxDescent, fs: x }), Re += 1); else { if (Ne == v.length) { null == $e[Re] && ($e[Re] = []), $e[Re].push({ content: ut, style: g, width: ht, height: mt, left: 0, top: 0, splitIndex: Re, asc: dt.actualBoundingBoxAscent, desc: dt.actualBoundingBoxDescent, fs: x }); break } null == $e[Re] && ($e[Re] = []), Ne++ } qe = ut, De = mt, Fe = ht, Ee = dt } for (var vt = [], yt = Object.keys($e).length, bt = 0; bt < yt; bt++) { var kt = $e[bt]; if (null != kt) { for (var xt, wt = 0, _t = 0, Ct = 0, Tt = 0, At = 0, St = 0; St < kt.length; St++) { var It = kt[St]; wt += It.width, _t = Math.max(_t, It.height - (Te ? It.desc : 0)), Ct = Math.max(Ct, Te ? It.desc : 0), Tt = Math.max(Tt, It.asc), At++ } xt = _t / 2, 0 != p ? (_t += xt, Ie = Math.max(Ie, wt), Se += _t) : (_t += xt, Ae = Math.max(Ae, wt), Se += _t), vt.push({ width: wt, height: _t, desc: Ct, asc: Tt, lineHeight: xt, wordCount: At }) } } var Rt = 0, $t = 0, qt = p * Math.PI / 180, Dt = vt[yt - 1], Ft = Dt.lineHeight, Et = (Se = Se - Ft + Dt.desc) / Math.sin(qt) + Ie * Math.cos(qt), Mt = Ie * Math.sin(qt), Nt = 0; if (0 != p ? (1 == yt ? (Ae = Ie + Se / Math.tan(qt) * 2, Nt = Se / Math.tan(qt)) : Ae = Ie + Se / Math.tan(qt), y.textWidthAll = Et, y.textHeightAll = Mt) : (y.textWidthAll = Ae, y.textHeightAll = Se), "onlyWidth" == l) return y; if (0 != p && "1" == f) { t.textAlign = "end"; for (var Pt = 0; Pt < yt; Pt++) { var zt = $e[Pt]; if (null != zt) { var Lt = vt[Pt]; $t = 0; for (var Ot = zt.length - 1; Ot >= 0; Ot--) { var Bt = zt[Ot], Vt = void 0, Ht = void 0; if (0 != p) { var Ut, jt = Rt + Lt.asc; Ut = Rt / Math.tan(qt) - $t + Ie, "0" == u ? "0" == d ? (Vt = Ut + r / 2 - Ae / 2 + Ft * Math.cos(qt) / 2, Ht = jt + n / 2 - Se / 2 - Ft * Math.cos(qt) / 2) : "1" == d ? (Vt = Ut + r / 2 - Ae / 2, Ht = jt - (Se / 2 - Mt / 2)) : "2" == d && (Vt = Ut + r / 2 - Ae / 2 + Ft * Math.cos(qt), Ht = jt + n - Mt / 2 - Se / 2 - Ft * Math.cos(qt)) : "1" == u ? "0" == d ? (Vt = Ut - Mt * Math.sin(qt) / 2 + Ft * Math.cos(qt) / 2, Ht = jt + n / 2 + Mt * Math.cos(qt) / 2 - Ft * Math.cos(qt) / 2) : "1" == d ? (Vt = Ut - Mt * Math.sin(qt), Ht = jt + Mt * Math.cos(qt)) : "2" == d && (Vt = Ut + Ft * Math.cos(qt), Ht = jt + n - Ft * Math.cos(qt)) : "2" == u && ("0" == d ? (Vt = Ut + r - Et / 2 - (Ie / 2 + Se / 2 / Math.tan(qt)) + Ft * Math.cos(qt) / 2, Ht = jt + n / 2 - Se / 2 - Ft * Math.cos(qt) / 2) : "1" == d ? (Vt = Ut + r - Ae + Nt, Ht = jt - Se) : "2" == d && (Vt = Ut + r - Et * Math.cos(qt) + Ft * Math.cos(qt), Ht = jt + n - Et * Math.sin(qt) - Ft * Math.cos(qt))) } Bt.left = Vt, Bt.top = Ht, Ms(Bt, b, k, { width: Bt.width, height: Bt.height, left: Vt - Bt.width, top: Ht, asc: Lt.asc, desc: Lt.desc, fs: Bt.fs }), y.values.push(Bt), $t += Bt.width } Rt += Lt.height } } } else for (var Gt = 0; Gt < yt; Gt++) { var Wt = $e[Gt]; if (null != Wt) { var Yt = vt[Gt]; $t = 0; for (var Xt = 0; Xt < Wt.length; Xt++) { var Kt = Wt[Xt], Zt = void 0, Qt = void 0; if (0 != p) { var Jt, ea = Rt + Yt.asc; Jt = (Se - Rt) / Math.tan(qt) + $t, "0" == u ? "0" == d ? (Zt = Jt + r / 2 - Ae / 2 - Ft * Math.cos(qt) / 2, Qt = ea + n / 2 - Se / 2 + Ft * Math.cos(qt) / 2) : "1" == d ? (Zt = Jt + r / 2 - Ae / 2 - Ft * Math.cos(qt) / 2, Qt = ea - (Se / 2 - Mt / 2) + Ft * Math.cos(qt) / 2) : "2" == d && (Zt = Jt + r / 2 - Ae / 2 - Ft * Math.cos(qt), Qt = ea + n - Mt / 2 - Se / 2 - Ft * Math.cos(qt)) : "1" == u ? "0" == d ? (Zt = Jt - Mt * Math.sin(qt) / 2 - Ft * Math.cos(qt) / 2, Qt = ea - Se + n / 2 - Mt * Math.cos(qt) / 2 - Ft * Math.cos(qt) / 2) : "1" == d ? (Zt = Jt, Qt = ea - Se) : "2" == d && (Zt = Jt - Mt * Math.sin(qt) - Ft * Math.cos(qt), Qt = ea - Se + n - Mt * Math.cos(qt) - Ft * Math.cos(qt)) : "2" == u && ("0" == d ? (Zt = Jt + r - Et / 2 - Ae / 2 - Ft * Math.cos(qt) / 2, Qt = ea + n / 2 - Se / 2 - Ft * Math.cos(qt) / 2) : "1" == d ? (Zt = Jt + r - Et * Math.cos(qt), Qt = ea + Mt * Math.cos(qt)) : "2" == d && (Zt = Jt + r - Ae - Ft * Math.cos(qt) + Nt, Qt = ea + n - Ft * Math.cos(qt))), Ms(Kt, b, k, { width: Kt.width, height: Kt.height, left: Zt, top: Qt, asc: Yt.asc, desc: Yt.desc, fs: Kt.fs }) } else Zt = s + $t, "0" == u ? Zt = r / 2 + $t - Yt.width / 2 : "2" == u && (Zt = r + $t - Yt.width), Qt = n - c + Rt + Yt.asc - Se, "0" == d ? Qt = n / 2 + Rt - Se / 2 + Yt.asc : "1" == d && (Qt = c + Rt + Yt.asc), Ms(Kt, b, k, { width: Kt.width, height: Kt.height, left: Zt, top: Qt, asc: Yt.asc, desc: Yt.desc, fs: Kt.fs }); Kt.left = Zt, Kt.top = Qt, y.values.push(Kt), $t += Kt.width } Rt += Yt.height } } y.type = "plainWrap", 0 != p && ("0" == u ? "0" == d ? (y.textLeftAll = r / 2, y.textTopAll = n / 2) : "1" == d ? (y.textLeftAll = r / 2, y.textTopAll = Mt / 2) : "2" == d && (y.textLeftAll = r / 2, y.textTopAll = n - Mt / 2) : "1" == u ? "0" == d ? (y.textLeftAll = 0, y.textTopAll = n / 2) : "1" == d ? (y.textLeftAll = 0, y.textTopAll = 0) : "2" == d && (y.textLeftAll = 0, y.textTopAll = n) : "2" == u && ("0" == d ? (y.textLeftAll = r - Et / 2, y.textTopAll = n / 2) : "1" == d ? (y.textLeftAll = r, y.textTopAll = 0) : "2" == d && (y.textLeftAll = r, y.textTopAll = n))) } else { var ta = Fs(v, t), aa = ta.width, ra = ta.actualBoundingBoxDescent + ta.actualBoundingBoxAscent; y.rotate = p; var na = (p = Math.abs(p)) * Math.PI / 180, la = aa * Math.cos(na) + ra * Math.sin(na), ia = aa * Math.sin(na) + ra * Math.cos(na); if (y.textHeightAll = 0 != p ? ia : ia + ra / 2 - ta.actualBoundingBoxDescent - c, y.textWidthAll = la, "onlyWidth" == l) return y; var oa = la, sa = ia, ca = s + ra * Math.sin(na) * f; "0" == u ? ca = r / 2 - oa / 2 + ra * Math.sin(na) * f : "2" == u && (ca = r - s - oa + ra * Math.sin(na) * f); var ua = n - c - sa + ta.actualBoundingBoxAscent * Math.cos(na) + aa * Math.sin(na) * f; "0" == d ? ua = n / 2 - sa / 2 + ta.actualBoundingBoxAscent * Math.cos(na) + aa * Math.sin(na) * f : "1" == d && (ua = c + ta.actualBoundingBoxAscent * Math.cos(na) + aa * Math.sin(na) * f), y.type = "plain"; var da = { content: v, style: g, width: oa, height: sa, left: ca, top: ua }; Ms(da, b, k, { width: aa, height: ra, left: ca, top: ua, asc: ta.actualBoundingBoxAscent, desc: ta.actualBoundingBoxDescent, fs: x }), y.values.push(da), y.textLeftAll = ca, y.textTopAll = ua, y.asc = ta.actualBoundingBoxAscent, y.desc = ta.actualBoundingBoxDescent } } return y } function Ms(e, t, a, r) { var n = r.left, l = r.top, i = r.width, o = (r.height, r.asc), s = r.desc, c = r.fs; if (!0 !== e.wrap && (1 == e.inline && null != e.style && (t = e.style.cl, a = e.style.un), "0" != t && (e.cancelLine = {}, e.cancelLine.startX = n, e.cancelLine.startY = l - o / 2 + 1, e.cancelLine.endX = n + i, e.cancelLine.endY = l - o / 2 + 1, e.cancelLine.fs = c), "0" != a)) { if (e.underLine = [], "1" == a || "2" == a) { var u = {}; u.startX = n, u.startY = l, u.endX = n + i, u.endY = l, u.fs = c, e.underLine.push(u) } if ("2" == a) { var d = {}; d.startX = n, d.startY = l + s, d.endX = n + i, d.endY = l + s, d.fs = c, e.underLine.push(d) } if ("3" == a || "4" == a) { var h = {}; h.startX = n, h.startY = l + s, h.endX = n + i, h.endY = l + s, h.fs = c, e.underLine.push(h) } if ("4" == a) { var m = {}; m.startX = n, m.startY = l + s + 2, m.endX = n + i, m.endY = l + s + 2, m.fs = c, e.underLine.push(m) } } } var Ns = function (e) { for (var t = na(this), a = he(t.length), r = arguments.length, n = fe(r > 1 ? arguments[1] : void 0, a), l = r > 2 ? arguments[2] : void 0, i = void 0 === l ? a : fe(l, a); i > n;)t[n++] = e; return t }; Ee({ target: "Array", proto: !0 }, { fill: Ns }), or("fill"); var Ps, zs, Ls, Os = {}, Bs = $t("iterator"), Vs = !1;[].keys && ("next" in (Ls = [].keys()) ? (zs = Fr(Fr(Ls))) !== Object.prototype && (Ps = zs) : Vs = !0), null == Ps && (Ps = {}), _(Ps, Bs) || E(Ps, Bs, (function () { return this })); var Hs = { IteratorPrototype: Ps, BUGGY_SAFARI_ITERATORS: Vs }, Us = F.f, js = $t("toStringTag"), Gs = function (e, t, a) { e && !_(e = a ? e : e.prototype, js) && Us(e, js, { configurable: !0, value: t }) }, Ws = Hs.IteratorPrototype, Ys = function () { return this }, Xs = function (e, t, a) { var r = t + " Iterator"; return e.prototype = tt(Ws, { next: m(1, a) }), Gs(e, r, !1), Os[r] = Ys, e }, Ks = Hs.IteratorPrototype, Zs = Hs.BUGGY_SAFARI_ITERATORS, Qs = $t("iterator"), Js = function () { return this }, ec = function (e, t, a, r, n, l, i) { Xs(a, t, r); var o, s, c, u = function (e) { if (e === n && f) return f; if (!Zs && e in m) return m[e]; switch (e) { case "keys": case "values": case "entries": return function () { return new a(this, e) } }return function () { return new a(this) } }, d = t + " Iterator", h = !1, m = e.prototype, p = m[Qs] || m["@@iterator"] || n && m[n], f = !Zs && p || u(n), g = "Array" == t && m.entries || p; if (g && (o = Fr(g.call(new e)), Ks !== Object.prototype && o.next && (Fr(o) !== Ks && (Ge ? Ge(o, Ks) : "function" != typeof o[Qs] && E(o, Qs, Js)), Gs(o, d, !0))), "values" == n && p && "values" !== p.name && (h = !0, f = function () { return p.call(this) }), m[Qs] !== f && E(m, Qs, f), Os[t] = f, n) if (s = { values: u("values"), keys: l ? f : u("keys"), entries: u("entries") }, i) for (c in s) (Zs || h || !(c in m)) && ne(m, c, s[c]); else Ee({ target: t, proto: !0, forced: Zs || h }, s); return s }, tc = re.set, ac = re.getterFor("Array Iterator"), rc = ec(Array, "Array", (function (e, t) { tc(this, { type: "Array Iterator", target: b(e), index: 0, kind: t }) }), (function () { var e = ac(this), t = e.target, a = e.kind, r = e.index++; return !t || r >= t.length ? (e.target = void 0, { value: void 0, done: !0 }) : "keys" == a ? { value: r, done: !1 } : "values" == a ? { value: t[r], done: !1 } : { value: [r, t[r]], done: !1 } }), "values"); Os.Arguments = Os.Array, or("keys"), or("values"), or("entries"); var nc = $t("iterator"), lc = $t("toStringTag"), ic = rc.values; for (var oc in Vr) { var sc = l[oc], cc = sc && sc.prototype; if (cc) { if (cc[nc] !== ic) try { E(cc, nc, ic) } catch (va) { cc[nc] = ic } if (cc[lc] || E(cc, lc, oc), Vr[oc]) for (var uc in rc) if (cc[uc] !== rc[uc]) try { E(cc, uc, rc[uc]) } catch (va) { cc[uc] = rc[uc] } } } function dc() { if (0 != ga.luckysheet_select_save.length) { for (var e = 1 / 0, t = -1 / 0, a = 0, r = 0, n = 0; n < ga.luckysheet_select_save.length; n++)for (var l = Xo(ga.luckysheet_select_save[n]), i = 0; i < l.length; i++)for (var o = 0; o < l[0].length; o++)if (!ya(l[i][o]) && (r++, null == l[i][o].ct || "d" != l[i][o].ct.t)) { var s = l[i][o].v; ba(s) && (a += s = parseFloat(s), s < e && (e = s), s > t && (t = s)) } var c = gn().formula, u = ""; u += "<span>" + c.count + ":" + r + "</span>", (isFinite(t) || isFinite(e)) && (u += "<span>" + c.sum + ":" + ws("w", a) + "</span>", u += "<span>" + c.average + ":" + ws("w", Math.round(a / r * 1e4) / 1e4) + "</span>"), isFinite(t) && (u += "<span>" + c.max + ":" + ws("w", t) + "</span>"), isFinite(e) && (u += "<span>" + c.min + ":" + ws("w", e) + "</span>"), $("#luckysheet-sta-content").html(u) } } function hc(e, t, a, r, n) { null == a && (a = !0), e || (e = "down"), t || (t = "cell"), null == n && (n = !1); var l = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], i = null == l.row ? 0 : l.row[0], o = null == l.column ? 0 : l.column[0], s = null == l.row ? 0 : l.row[0], c = null == l.column ? 0 : l.column[0], u = null == l.row ? 0 : l.row[1], d = null == l.column ? 0 : l.column[1]; if (Ih.fucntionboxshow(i, o), "range" == t) { var h = ga.luckysheet_shiftpositon.row[0], m = ga.luckysheet_shiftpositon.column[0], p = ga.luckysheet_shiftpositon.row[1], f = ga.luckysheet_shiftpositon.column[1]; "down" == e || "up" == e ? p < u ? i = null == l.row ? 0 : l.row[1] : h > s ? i = null == l.row ? 0 : l.row[0] : p == u && h == s && (i = "down" == e ? null == l.row ? 0 : l.row[1] : null == l.row ? 0 : l.row[0]) : "right" != e && "left" != e || (f < d ? o = null == l.column ? 0 : l.column[1] : m > c ? o = null == l.column ? 0 : l.column[0] : f == d && m == c && (o = "right" == e ? null == l.column ? 0 : l.column[1] : null == l.column ? 0 : l.column[0])) } var g = ga.flowdata.length, v = ga.flowdata[0].length, y = ga.flowdata, b = "", k = 0; if ("up" == e) { if (0 == i) return; for (var x = [], w = null, _ = 0, C = null, T = c; T <= d; T++) { x = [], _ = 0; for (var A = i - 1; A >= 0; A--) { var S = y[A][T]; if ("object" == Cm(S) && ya(S.v) || ya(S) ? x.push(!1) : x.push(!0), x.length > 1) { if (1 == x[_] && 0 == x[_ - 1]) { w = A; break } if (0 == x[_] && 1 == x[_ - 1]) { w = A + 1; break } } _++ } null == w && (w = 0), (null == C || w < C) && (C = w) } b = "down", k = C - i } else if ("down" == e) { if (i == g - 1) return; for (var I = [], R = null, $ = 0, q = null, D = c; D <= d; D++) { I = [], $ = 0; for (var F = i + 1; F < y.length; F++) { var E = y[F][D]; if ("object" == Cm(E) && ya(E.v) || ya(E) ? I.push(!1) : I.push(!0), I.length > 1) { if (1 == I[$] && 0 == I[$ - 1]) { R = F; break } if (0 == I[$] && 1 == I[$ - 1]) { R = F - 1; break } } $++ } null == R && (R = y.length - 1), (null == q || R > q) && (q = R) } b = "down", k = q - i } else if ("left" == e) { if (0 == o) return; for (var M = [], N = null, P = 0, z = null, L = s; L <= u; L++) { M = [], P = 0; for (var O = o - 1; O >= 0; O--) { var B = y[L][O]; if ("object" == Cm(B) && ya(B.v) || ya(B) ? M.push(!1) : M.push(!0), M.length > 1) { if (1 == M[P] && 0 == M[P - 1]) { N = O; break } if (0 == M[P] && 1 == M[P - 1]) { N = O + 1; break } } P++ } null == N && (N = 0), (null == z || N < z) && (z = N) } b = "right", k = z - o } else if ("right" == e) { if (o == v - 1) return; for (var V = [], H = null, U = 0, j = null, G = s; G <= u; G++) { V = [], U = 0; for (var W = o + 1; W < y[0].length; W++) { var Y = y[G][W]; if ("object" == Cm(Y) && ya(Y.v) || ya(Y) ? V.push(!1) : V.push(!0), V.length > 1) { if (1 == V[U] && 0 == V[U - 1]) { H = W; break } if (0 == V[U] && 1 == V[U - 1]) { H = W - 1; break } } U++ } null == H && (H = y[0].length - 1), (null == j || H > j) && (j = H) } b = "right", k = j - o } if ("range" == t && ("up" == e ? p_endR < u && k + i < p_endR && (k = p_endR - i) : "down" == e ? h > s && k + i > h && (k = h - i) : "left" == e ? p_endC < d && k + o < p_endC && (k = p_endC - o) : "right" == e && m > c && k + o > m && (k = m - o), null != r && Math.abs(k) > Math.abs(r) && (k = r)), n) return k; "cell" == t ? mc(b, k, "rangeOfSelect", a) : "range" == t && fc(b, k, "rangeOfSelect", a) } function mc(e, t, a, r) { null == r && (r = !0); var n, l, i, o, s, c, u, d, h = ga.flowdata.length, m = ga.flowdata[0].length; if ("rangeOfSelect" == a) { var p, f, g = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; p = null == g.row_focus ? g.row[0] : g.row_focus, f = null == g.column_focus ? g.column[0] : g.column_focus; var v = xm.mergeborer(ga.flowdata, p, f); if (v) { var y = v.row[2], b = v.row[3], k = v.column[2], x = v.column[3]; t > 0 ? "down" == e ? (p = b, f = k) : "right" == e && (p = y, f = x) : (p = y, f = k) } var w = null == g.moveXY ? p : g.moveXY.x, _ = null == g.moveXY ? f : g.moveXY.y; "down" == e ? w = p += t : "right" == e && (_ = f += t), p >= h && (w = p = h - 1), p < 0 && (w = p = 0), f >= m && (_ = f = m - 1), f < 0 && (_ = f = 0); var C = xm.mergeborer(ga.flowdata, p, f); C ? (n = C.row[1], l = C.row[0], i = C.row[2], o = C.row[3], s = C.column[1], c = C.column[0], u = C.column[2], d = C.column[3]) : (n = ga.visibledatarow[w], l = w - 1 == -1 ? 0 : ga.visibledatarow[w - 1], i = w, o = w, s = ga.visibledatacolumn[_], c = _ - 1 == -1 ? 0 : ga.visibledatacolumn[_ - 1], u = _, d = _), g.row = [i, o], g.column = [u, d], g.row_focus = i, g.column_focus = u, g.moveXY = { x: w, y: _ }, Rh(), Ru.pivotclick(i, u), Ih.fucntionboxshow(i, u) } else if ("rangeOfFormula" == a) { var T, A, S = Ih.func_selectedrange; T = null == S.row_focus ? S.row[0] : S.row_focus, A = null == S.column_focus ? S.column[0] : S.column_focus; var I = xm.mergeborer(ga.flowdata, T, A); if (I) { var R = I.row[2], q = I.row[3], D = I.column[2], F = I.column[3]; t > 0 ? "down" == e ? (T = q, A = D) : "right" == e && (T = R, A = F) : (T = R, A = D) } var E = null == S.moveXY ? T : S.moveXY.x, M = null == S.moveXY ? A : S.moveXY.y; "down" == e ? E = T += t : "right" == e && (M = A += t), T >= h && (E = T = h - 1), T < 0 && (E = T = 0), A >= m && (M = A = m - 1), A < 0 && (M = A = 0); var N = xm.mergeborer(ga.flowdata, T, A); N ? (n = N.row[1], l = N.row[0], i = N.row[2], o = N.row[3], s = N.column[1], c = N.column[0], u = N.column[2], d = N.column[3]) : (n = ga.visibledatarow[E], l = E - 1 == -1 ? 0 : ga.visibledatarow[E - 1], i = E, o = E, s = ga.visibledatacolumn[M], c = M - 1 == -1 ? 0 : ga.visibledatacolumn[M - 1], u = M, d = M), Ih.func_selectedrange = { left: c, width: s - c - 1, top: l, height: n - l - 1, left_move: c, width_move: s - c - 1, top_move: l, height_move: n - l - 1, row: [i, o], column: [u, d], row_focus: i, column_focus: u, moveXY: { x: E, y: M } }, $("#luckysheet-formula-functionrange-select").css({ left: c, width: s - c - 1, top: l, height: n - l - 1 }).show(), Ih.rangeSetValue({ row: [i, o], column: [u, d] }) } var P = $("#luckysheet-cell-main").scrollLeft(), z = $("#luckysheet-cell-main").scrollTop(), L = $("#luckysheet-cell-main").height(), O = $("#luckysheet-cell-main").width(), B = 0, V = 0; s - P - O + 20 > 0 ? (B = s - O + 20, r && $("#luckysheet-scrollbar-x").scrollLeft(B)) : c - P - 20 < 0 && (B = c - 20, r && $("#luckysheet-scrollbar-x").scrollLeft(B)), n - z - L + 20 > 0 ? (V = n - L + 20, r && $("#luckysheet-scrollbar-y").scrollTop(V)) : l - z - 20 < 0 && (V = l - 20, r && $("#luckysheet-scrollbar-y").scrollTop(V)), clearTimeout(ga.countfuncTimeout), dc(), pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save) } function pc(e, t, a) { var r, n, l, i; if (a || (a = !0), "rangeOfSelect" == t) { var o = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], s = o.row_focus, c = o.column_focus, u = !1, d = {}; if (null != ga.config.merge && s + "_" + c in ga.config.merge && (u = !0, d = ga.config.merge[s + "_" + c]), "down" == e) { if (s == ga.flowdata.length - 1) return; s = xc("down", c, u ? d.r + d.rs - 1 : s, ga.flowdata.length - 1) } else if ("up" == e) { if (0 == s) return; s = xc("up", c, 0, u ? d.r : s) } else if ("right" == e) { if (c == ga.flowdata[0].length - 1) return; c = xc("right", s, u ? d.c + d.cs - 1 : c, ga.flowdata[0].length - 1) } else if ("left" == e) { if (0 == c) return; c = xc("left", s, 0, u ? d.c : c) } var h = [s, s], m = [c, c]; r = ga.visibledatarow[s], n = s - 1 == -1 ? 0 : ga.visibledatarow[s - 1], l = ga.visibledatacolumn[c], i = c - 1 == -1 ? 0 : ga.visibledatacolumn[c - 1]; var p = xm.mergeMoveMain(m, h, o, n, r - n - 1, i, l - i - 1); null != p && (m = p[0], h = p[1]), ga.luckysheet_select_save = [{ row: h, column: m }], Rh(), Ru.pivotclick(s, c), Ih.fucntionboxshow(s, c) } else if ("rangeOfFormula" == t) { var f = Ih.func_selectedrange, g = f.row_focus, v = f.column_focus, y = !1, b = {}; if (null != ga.config.merge && g + "_" + v in ga.config.merge && (y = !0, b = ga.config.merge[g + "_" + v]), "down" == e) { if (g == ga.flowdata.length - 1) return; g = xc("down", v, y ? b.r + b.rs - 1 : g, ga.flowdata.length - 1) } else if ("up" == e) { if (0 == g) return; g = xc("up", v, 0, y ? b.r : g) } else if ("right" == e) { if (v == ga.flowdata[0].length - 1) return; v = xc("right", g, y ? b.c + b.cs - 1 : v, ga.flowdata[0].length - 1) } else if ("left" == e) { if (0 == v) return; v = xc("left", g, 0, y ? b.c : v) } var k = [g, g], x = [v, v]; r = ga.visibledatarow[g], n = g - 1 == -1 ? 0 : ga.visibledatarow[g - 1], l = ga.visibledatacolumn[v]; var w = n, _ = r - n - 1, C = i = v - 1 == -1 ? 0 : ga.visibledatacolumn[v - 1], T = l - i - 1, A = xm.mergeMoveMain(x, k, f, w, _, C, T); null != A && (x = A[0], k = A[1], w = A[2], _ = A[3], C = A[4], T = A[5]), Ih.func_selectedrange = { left: C, width: T, top: w, height: _, left_move: C, width_move: T, top_move: w, height_move: _, row: k, column: x, row_focus: g, column_focus: v }, $("#luckysheet-formula-functionrange-select").css({ left: C, width: T, top: w, height: _ }).show(), Ih.rangeSetValue({ row: k, column: x }) } var S = $("#luckysheet-cell-main").scrollLeft(), I = $("#luckysheet-cell-main").scrollTop(), R = $("#luckysheet-cell-main").height(), q = $("#luckysheet-cell-main").width(), D = 0, F = 0; l - S - q + 20 > 0 ? (D = l - q + 20, a && $("#luckysheet-scrollbar-x").scrollLeft(D)) : i - S - 20 < 0 && (D = i - 20, a && $("#luckysheet-scrollbar-x").scrollLeft(D)), r - I - R + 20 > 0 ? (F = r - R + 20, a && $("#luckysheet-scrollbar-y").scrollTop(F)) : n - I - 20 < 0 && (F = n - 20, a && $("#luckysheet-scrollbar-y").scrollTop(F)), clearTimeout(ga.countfuncTimeout), dc() } function fc(e, t, a, r) { var n, l, i, o; if (null == r && (r = !0), "rangeOfSelect" == a) { var s = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], c = s.row[0], u = s.row[1], d = s.column[0], h = s.column[1], m = s.row_focus, p = s.column_focus, f = ga.flowdata.length, g = ga.flowdata[0].length; if ("down" == e) { if (vc(m, d, h)) { var v = bc(m, d, h), y = v[0], b = v[1]; y > c && b == u ? (t > 0 && vc(c, d, h) && (c = bc(c, d, h)[1]), c += t) : b < u && y == c ? (t < 0 && vc(u, d, h) && (u = bc(u, d, h)[0]), u += t) : t > 0 ? u += t : c += t } else m > c && m == u ? (t > 0 && vc(c, d, h) && (c = bc(c, d, h)[1]), c += t) : m < u && m == c ? (t < 0 && vc(u, d, h) && (u = bc(u, d, h)[0]), u += t) : m == c && m == u && (t > 0 ? u += t : c += t); u >= f && (u = f - 1), u < 0 && (u = 0), c >= f && (c = f - 1), c < 0 && (c = 0) } else { if (yc(p, c, u)) { var k = kc(p, c, u), x = k[0], w = k[1]; x > d && w == h ? (t > 0 && yc(d, c, u) && (d = kc(d, c, u)[1]), d += t) : w < h && x == d ? (t < 0 && yc(h, c, u) && (h = kc(h, c, u)[0]), h += t) : t > 0 ? h += t : d += t } else p > d && p == h ? (t > 0 && yc(d, c, u) && (d = kc(d, c, u)[1]), d += t) : p < h && p == d ? (t < 0 && yc(h, c, u) && (h = kc(h, c, u)[0]), h += t) : p == d && p == h && (t > 0 ? h += t : d += t); h >= g && (h = g - 1), h < 0 && (h = 0), d >= g && (d = g - 1), d < 0 && (d = 0) } var _ = [c, u], C = [d, h]; n = ga.visibledatarow[u], l = c - 1 == -1 ? 0 : ga.visibledatarow[c - 1], i = ga.visibledatacolumn[h], o = d - 1 == -1 ? 0 : ga.visibledatacolumn[d - 1]; var T = xm.mergeMoveMain(C, _, s, l, n - l - 1, o, i - o - 1); null != T && (C = T[0], _ = T[1]), s.row = _, s.column = C, Rh() } else if ("rangeOfFormula" == a) { var A = Ih.func_selectedrange, S = A.row[0], I = A.row[1], R = A.column[0], q = A.column[1], D = A.row_focus, F = A.column_focus, E = ga.flowdata.length, M = ga.flowdata[0].length; if ("down" == e) { if (vc(D, R, q)) { var N = bc(D, R, q), P = N[0], z = N[1]; P > S && z == I ? (t > 0 && vc(S, R, q) && (S = bc(S, R, q)[1]), S += t) : z < I && P == S ? (t < 0 && vc(I, R, q) && (I = bc(I, R, q)[0]), I += t) : t > 0 ? I += t : S += t } else D > S && D == I ? (t > 0 && vc(S, R, q) && (S = bc(S, R, q)[1]), S += t) : D < I && D == S ? (t < 0 && vc(I, R, q) && (I = bc(I, R, q)[0]), I += t) : D == S && D == I && (t > 0 ? I += t : S += t); I >= E && (I = E - 1), I < 0 && (I = 0), S >= E && (S = E - 1), S < 0 && (S = 0) } else { if (yc(F, S, I)) { var L = kc(F, S, I), O = L[0], B = L[1]; O > R && B == q ? (t > 0 && yc(R, S, I) && (R = kc(R, S, I)[1]), R += t) : B < q && O == R ? (t < 0 && yc(q, S, I) && (q = kc(q, S, I)[0]), q += t) : t > 0 ? q += t : R += t } else F > R && F == q ? (t > 0 && yc(R, S, I) && (R = kc(R, S, I)[1]), R += t) : F < q && F == R ? (t < 0 && yc(q, S, I) && (q = kc(q, S, I)[0]), q += t) : F == R && F == q && (t > 0 ? q += t : R += t); q >= M && (q = M - 1), q < 0 && (q = 0), R >= M && (R = M - 1), R < 0 && (R = 0) } var V = [S, I], H = [R, q]; n = ga.visibledatarow[I], l = S - 1 == -1 ? 0 : ga.visibledatarow[S - 1], i = ga.visibledatacolumn[q]; var U = l, j = n - l - 1, G = o = R - 1 == -1 ? 0 : ga.visibledatacolumn[R - 1], W = i - o - 1, Y = xm.mergeMoveMain(H, V, A, U, j, G, W); null != Y && (H = Y[0], V = Y[1], U = Y[2], j = Y[3], G = Y[4], W = Y[5]), Ih.func_selectedrange = { left: G, width: W, top: U, height: j, left_move: G, width_move: W, top_move: U, height_move: j, row: V, column: H, row_focus: D, column_focus: F }, $("#luckysheet-formula-functionrange-select").css({ left: G, width: W, top: U, height: j }).show(), Ih.rangeSetValue({ row: V, column: H }) } var X = $("#luckysheet-cell-main").scrollLeft(), K = $("#luckysheet-cell-main").scrollTop(), Z = $("#luckysheet-cell-main").height(), Q = $("#luckysheet-cell-main").width(), J = 0, ee = 0; i - X - Q + 20 > 0 ? (J = i - Q + 20, r && $("#luckysheet-scrollbar-x").scrollLeft(J)) : o - X - 20 < 0 && (J = o - 20, r && $("#luckysheet-scrollbar-x").scrollLeft(J)), n - K - Z + 20 > 0 ? (ee = n - Z + 20, r && $("#luckysheet-scrollbar-y").scrollTop(ee)) : l - K - 20 < 0 && (ee = l - 20, r && $("#luckysheet-scrollbar-y").scrollTop(ee)), clearTimeout(ga.countfuncTimeout), dc() } function gc(e, t, a) { var r, n, l, i; if (a || (a = !0), "rangeOfSelect" == t) { var o = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], s = o.row_focus, c = o.column_focus, u = o.row[0], d = o.row[1], h = o.column[0], m = o.column[1]; if ("down" == e) { if (d == ga.flowdata.length - 1) return; if (vc(s, h, m)) { var p = bc(s, h, m), f = p[0], g = p[1]; f > u && g == d ? u = xc("down", c, u, d) : d = xc("down", c, d, ga.flowdata.length - 1) } else s > u && s == d ? u = xc("down", c, u, d) : d = xc("down", c, d, ga.flowdata.length - 1) } else if ("up" == e) { if (0 == u) return; if (vc(s, h, m)) { var v = bc(s, h, m), y = v[0]; v[1] < d && y == u ? d = xc("up", c, u, d) : u = xc("up", c, 0, u) } else s < d && s == u ? d = xc("up", c, u, d) : u = xc("up", c, 0, u) } else if ("right" == e) { if (m == ga.flowdata[0].length - 1) return; if (yc(c, u, d)) { var b = kc(c, u, d), k = b[0], x = b[1]; k > h && x == m ? h = xc("right", s, h, m) : m = xc("right", s, m, ga.flowdata[0].length - 1) } else c > h && c == m ? h = xc("right", s, h, m) : m = xc("right", s, m, ga.flowdata[0].length - 1) } else if ("left" == e) { if (0 == h) return; if (yc(c, u, d)) { var w = kc(c, u, d), _ = w[0]; w[1] < m && _ == h ? m = xc("left", s, h, m) : h = xc("left", s, 0, h) } else c < m && c == h ? m = xc("left", s, h, m) : h = xc("left", s, 0, h) } var C = [u, d], T = [h, m]; r = ga.visibledatarow[d], n = u - 1 == -1 ? 0 : ga.visibledatarow[u - 1], l = ga.visibledatacolumn[m], i = h - 1 == -1 ? 0 : ga.visibledatacolumn[h - 1]; var A = xm.mergeMoveMain(T, C, o, n, r - n - 1, i, l - i - 1); null != A && (T = A[0], C = A[1]), o.row = C, o.column = T, Rh() } else if ("rangeOfFormula" == t) { var S = Ih.func_selectedrange, I = S.row_focus, R = S.column_focus, q = S.row[0], D = S.row[1], F = S.column[0], E = S.column[1]; if ("down" == e) { if (D == ga.flowdata.length - 1) return; if (vc(I, F, E)) { var M = bc(I, F, E), N = M[0], P = M[1]; N > q && P == D ? q = xc("down", R, q, D) : D = xc("down", R, D, ga.flowdata.length - 1) } else I > q && I == D ? q = xc("down", R, q, D) : D = xc("down", R, D, ga.flowdata.length - 1) } else if ("up" == e) { if (0 == q) return; if (vc(I, F, E)) { var z = bc(I, F, E), L = z[0]; z[1] < D && L == q ? D = xc("up", R, q, D) : q = xc("up", R, 0, q) } else I < D && I == q ? D = xc("up", R, q, D) : q = xc("up", R, 0, q) } else if ("right" == e) { if (E == ga.flowdata[0].length - 1) return; if (yc(R, q, D)) { var O = kc(R, q, D), B = O[0], V = O[1]; B > F && V == E ? F = xc("right", I, F, E) : E = xc("right", I, E, ga.flowdata[0].length - 1) } else R > F && R == E ? F = xc("right", I, F, E) : E = xc("right", I, E, ga.flowdata[0].length - 1) } else if ("left" == e) { if (0 == F) return; if (yc(R, q, D)) { var H = kc(R, q, D), U = H[0]; H[1] < E && U == F ? E = xc("left", I, F, E) : F = xc("left", I, 0, F) } else R < E && R == F ? E = xc("left", I, F, E) : F = xc("left", I, 0, F) } var j = [q, D], G = [F, E]; r = ga.visibledatarow[D], n = q - 1 == -1 ? 0 : ga.visibledatarow[q - 1], l = ga.visibledatacolumn[E]; var W = n, Y = r - n - 1, X = i = F - 1 == -1 ? 0 : ga.visibledatacolumn[F - 1], K = l - i - 1, Z = xm.mergeMoveMain(G, j, S, W, Y, X, K); null != Z && (G = Z[0], j = Z[1], W = Z[2], Y = Z[3], X = Z[4], K = Z[5]), Ih.func_selectedrange = { left: X, width: K, top: W, height: Y, left_move: X, width_move: K, top_move: W, height_move: Y, row: j, column: G, row_focus: I, column_focus: R }, $("#luckysheet-formula-functionrange-select").css({ left: X, width: K, top: W, height: Y }).show(), Ih.rangeSetValue({ row: j, column: G }) } var Q = $("#luckysheet-cell-main").scrollLeft(), J = $("#luckysheet-cell-main").scrollTop(), ee = $("#luckysheet-cell-main").height(), te = $("#luckysheet-cell-main").width(), ae = 0, re = 0; l - Q - te + 20 > 0 ? (ae = l - te + 20, a && $("#luckysheet-scrollbar-x").scrollLeft(ae)) : i - Q - 20 < 0 && (ae = i - 20, a && $("#luckysheet-scrollbar-x").scrollLeft(ae)), r - J - ee + 20 > 0 ? (re = r - ee + 20, a && $("#luckysheet-scrollbar-y").scrollTop(re)) : n - J - 20 < 0 && (re = n - 20, a && $("#luckysheet-scrollbar-y").scrollTop(re)), clearTimeout(ga.countfuncTimeout), dc() } function vc(e, t, a) { for (var r = !1, n = t; n <= a; n++) { var l = ga.flowdata[e][n]; if ("object" == Cm(l) && "mc" in l) { r = !0; break } } return r } function yc(e, t, a) { for (var r = !1, n = t; n <= a; n++) { var l = ga.flowdata[n][e]; if ("object" == Cm(l) && "mc" in l) { r = !0; break } } return r } function bc(e, t, a) { var r = ga.flowdata.length - 1, n = null; if (e > 0) for (var l = e; l >= 0; l--) { for (var i = t; i <= a; i++) { var o = ga.flowdata[l][i]; if ("object" == Cm(o) && "mc" in o) { var s = ga.config.merge[o.mc.r + "_" + o.mc.c]; (null == n || s.r < n) && (n = s.r) } } if (!(vc(n - 1, t, a) && n > 0)) break; l = n - 1 } else n = 0; var c = null; if (e < r) for (var u = e; u <= r; u++) { for (var d = t; d <= a; d++) { var h = ga.flowdata[u][d]; if ("object" == Cm(h) && "mc" in h) { var m = ga.config.merge[h.mc.r + "_" + h.mc.c]; (null == c || m.r + m.rs - 1 > c) && (c = m.r + m.rs - 1) } } if (!(vc(c + 1, t, a) && c < r)) break; u = c + 1 } else c = r; return [n, c] } function kc(e, t, a) { var r = ga.flowdata[0].length - 1, n = null; if (e > 0) for (var l = e; l >= 0; l--) { for (var i = t; i <= a; i++) { var o = ga.flowdata[i][l]; if ("object" == Cm(o) && "mc" in o) { var s = ga.config.merge[o.mc.r + "_" + o.mc.c]; (null == n || s.c < n) && (n = s.c) } } if (!(yc(n - 1, t, a) && n > 0)) break; l = n - 1 } else n = 0; var c = null; if (e < r) for (var u = e; u <= r; u++) { for (var d = t; d <= a; d++) { var h = ga.flowdata[d][u]; if ("object" == Cm(h) && "mc" in h) { var m = ga.config.merge[h.mc.r + "_" + h.mc.c]; (null == c || m.c + m.cs - 1 > c) && (c = m.c + m.cs - 1) } } if (!(yc(c + 1, t, a) && c < r)) break; u = c + 1 } else c = r; return [n, c] } function xc(e, t, a, r) { var n, l = null; if ("down" == e) { var i = ga.flowdata[a][t]; n = !("object" != Cm(i) || !ya(i.v)) || !!ya(i), console.log(n, "stNull"); for (var o = [], s = 0, c = a + 1; c <= r; c++) { var u = ga.flowdata[c][t]; if ("object" == Cm(u) && ya(u.v) || ya(u) ? o.push(!0) : o.push(!1), 1 == o.length && 1 == n && 0 == o[s]) { l = a + s + 1; break } if (o.length > 1) { if (n && 0 == o[s]) { l = a + s + 1; break } if (!n) { if (0 == o[s] && 1 == o[s - 1]) { l = a + s + 1; break } if (1 == o[s] && 0 == o[s - 1]) { l = a + s; break } } } c == r && (l = r), s++ } } else if ("up" == e) { var d = ga.flowdata[r][t]; n = !("object" != Cm(d) || !ya(d.v)) || !!ya(d); for (var h = [], m = 0, p = r - 1; p >= a; p--) { var f = ga.flowdata[p][t]; if ("object" == Cm(f) && ya(f.v) || ya(f) ? h.push(!0) : h.push(!1), 1 == h.length && n && 0 == h[m]) { l = r - (m + 1); break } if (h.length > 1) { if (n && 0 == h[m]) { l = r - (m + 1); break } if (!n) { if (0 == h[m] && 1 == h[m - 1]) { l = r - (m + 1); break } if (1 == h[m] && 0 == h[m - 1]) { l = r - m; break } } } p == a && (l = a), m++ } } else if ("right" == e) { var g = ga.flowdata[t][a]; n = !("object" != Cm(g) || !ya(g.v)) || !!ya(g); for (var v = [], y = 0, b = a + 1; b <= r; b++) { var k = ga.flowdata[t][b]; if ("object" == Cm(k) && ya(k.v) || ya(k) ? v.push(!0) : v.push(!1), 1 == v.length && n && 0 == v[y]) { l = a + y + 1; break } if (v.length > 1) { if (n && 0 == v[y]) { l = a + y + 1; break } if (!n) { if (0 == v[y] && 1 == v[y - 1]) { l = a + y + 1; break } if (1 == v[y] && 0 == v[y - 1]) { l = a + y; break } } } b == r && (l = r), y++ } } else if ("left" == e) { var x = ga.flowdata[t][r]; n = !("object" != Cm(x) || !ya(x.v)) || !!ya(x); for (var w = [], _ = 0, C = r - 1; C >= a; C--) { var T = ga.flowdata[t][C]; if ("object" == Cm(T) && ya(T.v) || ya(T) ? w.push(!0) : w.push(!1), 1 == w.length && n && 0 == w[_]) { l = r - (_ + 1); break } if (w.length > 1) { if (n && 0 == w[_]) { l = r - (_ + 1); break } if (!n) { if (0 == w[_] && 1 == w[_ - 1]) { l = r - (_ + 1); break } if (1 == w[_] && 0 == w[_ - 1]) { l = r - _; break } } } C == a && (l = a), _++ } } return l } var wc = { rangefocus: !1, modelfocusIndex: null, FixedModelColor: [{ head: { fc: "#000", bc: "#bfbdbe" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f8f3f7" }, foot: { fc: "#000", bc: "#dde2de" } }, { head: { fc: "#000", bc: "#4bd4e7" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#eaf7ff" }, foot: { fc: "#000", bc: "#aae9f8" } }, { head: { fc: "#000", bc: "#5ed593" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#e5fbee" }, foot: { fc: "#000", bc: "#a5efcc" } }, { head: { fc: "#000", bc: "#f6cb4b" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fff9e7" }, foot: { fc: "#000", bc: "#ffebac" } }, { head: { fc: "#000", bc: "#f96420" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#ffe5d9" }, foot: { fc: "#000", bc: "#ffcfba" } }, { head: { fc: "#000", bc: "#5599fc" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#ecf2fe" }, foot: { fc: "#000", bc: "#afcbfa" } }, { head: { fc: "#000", bc: "#22a69b" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#dff2f8" }, foot: { fc: "#000", bc: "#8dd4d0" } }, { head: { fc: "#000", bc: "#7a939a" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f0eff7" }, foot: { fc: "#000", bc: "#bdcad0" } }, { head: { fc: "#000", bc: "#d7a270" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fdf3f1" }, foot: { fc: "#000", bc: "#ead2b6" } }, { head: { fc: "#000", bc: "#89c54b" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f1f7e9" }, foot: { fc: "#000", bc: "#c5e3a7" } }, { head: { fc: "#000", bc: "#8f88f0" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f0e5ff" }, foot: { fc: "#000", bc: "#c6c4f6" } }, { head: { fc: "#000", bc: "#fd1664" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#feddee" }, foot: { fc: "#000", bc: "#f98ab5" } }, { head: { fc: "#000", bc: "#da96d3" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fce8fb" }, foot: { fc: "#000", bc: "#f2caee" } }, { head: { fc: "#000", bc: "#b49191" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f5ebe8" }, foot: { fc: "#000", bc: "#d8c3c3" } }, { head: { fc: "#000", bc: "#91b493" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f0fbf0" }, foot: { fc: "#000", bc: "#b4cfb6" } }, { head: { fc: "#000", bc: "#b4a891" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f8f6f1" }, foot: { fc: "#000", bc: "#d3cab8" } }, { head: { fc: "#000", bc: "#91abb4" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#eff7fa" }, foot: { fc: "#000", bc: "#b7cbd3" } }, { head: { fc: "#000", bc: "#b7ba82" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fafbeb" }, foot: { fc: "#000", bc: "#dadcb4" } }, { head: { fc: "#000", bc: "#df3e3e" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fde9e9" }, foot: { fc: "#000", bc: "#f89292" } }, { head: { fc: "#000", bc: "#f2711c" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#fef0d7" }, foot: { fc: "#000", bc: "#fbb335" } }, { head: { fc: "#000", bc: "#b5cc18" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f9fbd4" }, foot: { fc: "#000", bc: "#e2ed2a" } }, { head: { fc: "#000", bc: "#00b5ad" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#ccfaf9" }, foot: { fc: "#000", bc: "#00e4df" } }, { head: { fc: "#000", bc: "#2185d0" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#d8f3fc" }, foot: { fc: "#000", bc: "#3cc4f0" } }, { head: { fc: "#000", bc: "#a5673f" }, one: { fc: "#000", bc: "#ffffff" }, two: { fc: "#000", bc: "#f6ede5" }, foot: { fc: "#000", bc: "#d3a47c" } }], getModelBox: function (e, t) { $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList").empty(), $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom").empty(); for (var a = "", r = 0; r < this.FixedModelColor.length; r++) { var n = this.FixedModelColor[r], l = void 0, i = void 0, o = void 0, s = void 0; e && t ? (l = n.head, i = n.one, o = n.two, s = n.foot) : e ? (l = n.head, i = n.one, o = n.two, s = n.one) : t ? (l = n.one, i = n.two, o = n.one, s = n.foot) : (l = n.one, i = n.two, o = n.one, s = n.two), a += '<div class="modelbox"><div class="box"><span style="color:' + l.fc + ";background-color:" + l.bc + '"> — </span><span style="color:' + i.fc + ";background-color:" + i.bc + '"> — </span><span style="color:' + o.fc + ";background-color:" + o.bc + '"> — </span><span style="color:' + s.fc + ";background-color:" + s.bc + '"> — </span></div></div>' } $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList").append(a); var c = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save_modelCustom; if (null != c && c.length > 0) { for (var u = "", d = 0; d < c.length; d++) { var h = c[d], m = void 0, p = void 0, f = void 0, g = void 0; e && t ? (m = h.head, p = h.one, f = h.two, g = h.foot) : e ? (m = h.head, p = h.one, f = h.two, g = h.one) : t ? (m = h.one, p = h.two, f = h.one, g = h.foot) : (m = h.one, p = h.two, f = h.one, g = h.two), u += '<div class="modelbox"><div class="box"><span style="color:' + m.fc + ";background-color:" + m.bc + '"> — </span><span style="color:' + p.fc + ";background-color:" + p.bc + '"> — </span><span style="color:' + f.fc + ";background-color:" + f.bc + '"> — </span><span style="color:' + g.fc + ";background-color:" + g.bc + '"> — </span></div></div>' } $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom").append(u) } }, init: function () { var e, t, a = this; $("#luckysheet-modal-dialog-slider-alternateformat").remove(), $("body").append((e = gn(), t = e.alternatingColors, '<div id="luckysheet-modal-dialog-slider-alternateformat" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-alternateformat" style="display: block;"><div class="luckysheet-modal-dialog-slider-title"><span>' + e.toolbar.alternatingColors + '</span><span class="luckysheet-model-close-btn" title="' + t.close + '"><i class="fa fa-times" aria-hidden="true"></i></span></div><div class="luckysheet-modal-dialog-slider-content"><div class="textTitle">' + t.applyRange + '</div><div id="luckysheet-alternateformat-range"><input class="formulaInputFocus" placeholder="' + t.selectRange + '"/><i class="fa fa-table" aria-hidden="true"></i></div><div id="luckysheet-alternateformat-checkbox"><div class="cf"><input type="checkbox" id="luckysheet-alternateformat-rowHeader"/><label for="luckysheet-alternateformat-rowHeader">' + t.header + '</label></div><div class="cf"><input type="checkbox" id="luckysheet-alternateformat-rowFooter"/><label for="luckysheet-alternateformat-rowFooter">' + t.footer + '</label></div></div><div class="textTitle">' + t.textTitle + '</div><div id="luckysheet-alternateformat-modelList" class="cf"></div><div class="textTitle">' + t.custom + '</div><div id="luckysheet-alternateformat-modelCustom" class="cf"></div><div id="luckysheet-alternateformat-modelToning"><div class="toningbox header"><div class="toningShow"> ' + t.header + ' </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionTextColor + '" style="border-bottom-color: #000;margin-right: 10px;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color" style="user-select: none;"> </div> </div> </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionCellColor + '" style="border-bottom-color: #fff;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color" style="user-select: none;"> </div> </div> </div></div><div class="toningbox ctOne"><div class="toningShow"> ' + t.colorShow + '1 </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionTextColor + '" style="border-bottom-color: #000;margin-right: 10px;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color" style="user-select: none;"> </div> </div> </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionCellColor + '" style="border-bottom-color: #fff;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color" style="user-select: none;"> </div> </div> </div></div><div class="toningbox ctTwo"><div class="toningShow"> ' + t.colorShow + '2 </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionTextColor + '" style="border-bottom-color: #000;margin-right: 10px;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color" style="user-select: none;"> </div> </div> </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionCellColor + '" style="border-bottom-color: #fff;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color" style="user-select: none;"> </div> </div> </div></div><div class="toningbox footer"><div class="toningShow"> ' + t.footer + ' </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionTextColor + '" style="border-bottom-color: #000;margin-right: 10px;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color" style="user-select: none;"> </div> </div> </div><div class="luckysheet-color-menu-button-indicator" title="' + t.selectionCellColor + '" style="border-bottom-color: #fff;"> <div class="luckysheet-icon luckysheet-inline-block"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color" style="user-select: none;"> </div> </div> </div></div></div><button id="luckysheet-alternateformat-remove" class="btn btn-default" style="margin: 10px;">' + t.removeColor + "</button></div></div>")), Uc(), $("#luckysheet-modal-dialog-slider-alternateformat .luckysheet-model-close-btn").click((function () { $("#luckysheet-modal-dialog-slider-alternateformat").hide(), Uc() })), $(document).off("focus.AFrangeInput").on("focus.AFrangeInput", "#luckysheet-alternateformat-range input", (function () { a.rangefocus = !0 })), $(document).off("blur.AFrangeInput").on("blur.AFrangeInput", "#luckysheet-alternateformat-range input", (function () { a.rangefocus = !1 })), $(document).off("keydown.AFrangeInput").on("keydown.AFrangeInput", "#luckysheet-alternateformat-range input", (function (e) { $(this).val().trim(); 13 == e.keyCode && a.update() })), $(document).off("click.AFrangeIcon").on("click.AFrangeIcon", "#luckysheet-alternateformat-range .fa-table", (function () { $("#luckysheet-modal-dialog-slider-alternateformat").hide(), Uc(); var e = $(this).parents("#luckysheet-alternateformat-range").find("input").val().trim(); a.rangeDialog(e) })), $(document).off("click.AFrDCf").on("click.AFrDCf", "#luckysheet-alternateformat-rangeDialog-confirm", (function () { var e = $(this).parents("#luckysheet-alternateformat-rangeDialog").find("input").val().trim(); $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input").val(e), $(this).parents("#luckysheet-alternateformat-rangeDialog").hide(), $("#luckysheet-modal-dialog-slider-alternateformat").show(), Uc(), a.update() })), $(document).off("click.AFrDCl").on("click.AFrDCl", "#luckysheet-alternateformat-rangeDialog-close", (function () { $(this).parents("#luckysheet-alternateformat-rangeDialog").hide(), $("#luckysheet-modal-dialog-slider-alternateformat").show(), Uc() })), $(document).off("click.AFrDTitle").on("click.AFrDTitle", "#luckysheet-alternateformat-rangeDialog .luckysheet-modal-dialog-title-close", (function () { $(this).parents("#luckysheet-alternateformat-rangeDialog").hide(), $("#luckysheet-modal-dialog-slider-alternateformat").show(), Uc() })), $(document).off("change.AFrowHeader").on("change.AFrowHeader", "#luckysheet-alternateformat-rowHeader", (function () { var e, t; e = !!$(this).is(":checked"), t = !!$("#luckysheet-alternateformat-rowFooter").is(":checked"), a.checkboxChange(e, t), a.modelboxOn(), a.update() })), $(document).off("change.AFrowFooter").on("change.AFrowFooter", "#luckysheet-alternateformat-rowFooter", (function () { var e, t; e = !!$("#luckysheet-alternateformat-rowHeader").is(":checked"), t = !!$(this).is(":checked"), a.checkboxChange(e, t), a.modelboxOn(), a.update() })), $(document).off("click.AFmodelbox").on("click.AFmodelbox", "#luckysheet-modal-dialog-slider-alternateformat .modelbox", (function () { var e = $(this).index(), t = $(this).parents(".cf").attr("id"); if ("luckysheet-alternateformat-modelList" == t) a.modelfocusIndex = e; else if ("luckysheet-alternateformat-modelCustom" == t) { var r = a.FixedModelColor.length; a.modelfocusIndex = e + r } a.modelboxOn(), a.update() })), $(document).off("click.AFselectColor").on("click.AFselectColor", "#luckysheet-modal-dialog-slider-alternateformat .luckysheet-color-menu-button-indicator", (function () { var e, t, r, n = $(this).closest(".toningbox"); $(this).find(".luckysheet-icon-img").hasClass("luckysheet-icon-text-color") ? (e = "fc", t = n.find(".toningShow").data("fc")) : $(this).find(".luckysheet-icon-img").hasClass("luckysheet-icon-cell-color") && (e = "bc", t = n.find(".toningShow").data("bc")), n.hasClass("header") ? r = "0" : n.hasClass("ctOne") ? r = "1" : n.hasClass("ctTwo") ? r = "2" : n.hasClass("footer") && (r = "3"), a.colorSelectDialog(t, e, r) })), $(document).off("click.AFselectColorConfirm").on("click.AFselectColorConfirm", "#luckysheet-alternateformat-colorSelect-dialog-confirm", (function () { var e = $(this).parents("#luckysheet-alternateformat-colorSelect-dialog"), t = gn().alternatingColors; $("#luckysheet-modal-dialog-mask").hide(), e.hide(); var r, n = e.find(".currenColor span").attr("title"); e.find(".luckysheet-modal-dialog-title-text").text() == t.selectionTextColor ? r = "fc" : e.find(".luckysheet-modal-dialog-title-text").text() == t.selectionCellColor && (r = "bc"); var l, i, o = e.find(".currenColor").attr("data-source"); "0" == o ? ("fc" == r && ($("#luckysheet-alternateformat-modelToning .header .toningShow").css("color", n), $("#luckysheet-alternateformat-modelToning .header .toningShow").data("fc", n), $("#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n)), "bc" == r && ($("#luckysheet-alternateformat-modelToning .header .toningShow").css("background-color", n), $("#luckysheet-alternateformat-modelToning .header .toningShow").data("bc", n), $("#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n))) : "1" == o ? ("fc" == r && ($("#luckysheet-alternateformat-modelToning .ctOne .toningShow").css("color", n), $("#luckysheet-alternateformat-modelToning .ctOne .toningShow").data("fc", n), $("#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n)), "bc" == r && ($("#luckysheet-alternateformat-modelToning .ctOne .toningShow").css("background-color", n), $("#luckysheet-alternateformat-modelToning .ctOne .toningShow").data("bc", n), $("#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n))) : "2" == o ? ("fc" == r && ($("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").css("color", n), $("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").data("fc", n), $("#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n)), "bc" == r && ($("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").css("background-color", n), $("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").data("bc", n), $("#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n))) : "3" == o && ("fc" == r && ($("#luckysheet-alternateformat-modelToning .footer .toningShow").css("color", n), $("#luckysheet-alternateformat-modelToning .footer .toningShow").data("fc", n), $("#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n)), "bc" == r && ($("#luckysheet-alternateformat-modelToning .footer .toningShow").css("background-color", n), $("#luckysheet-alternateformat-modelToning .footer .toningShow").data("bc", n), $("#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", n))), l = !!$("#luckysheet-alternateformat-rowHeader").is(":checked"), i = !!$("#luckysheet-alternateformat-rowFooter").is(":checked"); var s, c, u = a.modelfocusIndex, d = a.FixedModelColor.length; if (u < d) s = $.extend(!0, {}, a.getFormatByIndex()); else { var h = (c = ga.luckysheetfile[_l(ga.currentSheetIndex)]).luckysheet_alternateformat_save_modelCustom; s = $.extend(!0, {}, h[u - d]) } "0" == o ? "fc" == r ? s.head.fc = n : "bc" == r && (s.head.bc = n) : "1" == o ? "fc" == r ? s.one.fc = n : "bc" == r && (s.one.bc = n) : "2" == o ? "fc" == r ? s.two.fc = n : "bc" == r && (s.two.bc = n) : "3" == o && ("fc" == r && (s.foot.fc = n), "bc" == r && (s.foot.bc = n)), a.modelfocusIndex < d ? (a.addCustomModel(s), a.modelfocusIndex = a.getIndexByFormat(s)) : (c.luckysheet_alternateformat_save_modelCustom[u - d] = s, pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, c.luckysheet_alternateformat_save_modelCustom, { k: "luckysheet_alternateformat_save_modelCustom" })), a.getModelBox(l, i), a.modelboxOn(), a.update() })), $(document).off("click.AFremove").on("click.AFremove", "#luckysheet-alternateformat-remove", (function () { var e = $(this).data("index"), t = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save, r = $.extend(!0, [], t); t.length > 1 ? t.splice(e, 1) : t = []; var n = $.extend(!0, [], t); a.ref(r, n), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, t, { k: "luckysheet_alternateformat_save" }), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-modal-dialog-slider-alternateformat").hide(), Uc() })) }, perfect: function () { var e = $.extend(!0, {}, ga.luckysheet_select_save[0]), t = this.rangeIsExists(e)[1], a = $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save[t]), r = a.cellrange; $("#luckysheet-alternateformat-range input").val(Cl(ga.currentSheetIndex, { row: r.row, column: r.column }, ga.currentSheetIndex)), ga.luckysheet_select_save = [{ row: r.row, column: r.column }], Rh(); var n = a.hasRowHeader, l = a.hasRowFooter, i = a.format; this.modelfocusIndex = this.getIndexByFormat(i), null == this.modelfocusIndex && (this.addCustomModel(i), this.modelfocusIndex = this.getIndexByFormat(i)), this.checkboxChange(n, l), this.modelboxOn(), $("#luckysheet-alternateformat-remove").data("index", t) }, checkboxChange: function (e, t) { e ? ($("#luckysheet-alternateformat-rowHeader").prop("checked", !0), $("#luckysheet-alternateformat-modelToning .header").show()) : ($("#luckysheet-alternateformat-rowHeader").removeAttr("checked"), $("#luckysheet-alternateformat-modelToning .header").hide()), t ? ($("#luckysheet-alternateformat-rowFooter").prop("checked", !0), $("#luckysheet-alternateformat-modelToning .footer").show()) : ($("#luckysheet-alternateformat-rowFooter").removeAttr("checked"), $("#luckysheet-alternateformat-modelToning .footer").hide()), this.getModelBox(e, t) }, modelboxOn: function () { $("#luckysheet-modal-dialog-slider-alternateformat .modelbox").removeClass("on"); var e = this.modelfocusIndex, t = this.FixedModelColor.length; e < t ? $("#luckysheet-alternateformat-modelList .modelbox").eq(e).addClass("on") : $("#luckysheet-alternateformat-modelCustom .modelbox").eq(e - t).addClass("on"), this.modelToningColor() }, modelToningColor: function () { var e = this.getFormatByIndex(); $("#luckysheet-alternateformat-modelToning .header .toningShow").css({ color: e.head.fc, "background-color": e.head.bc }), $("#luckysheet-alternateformat-modelToning .header .toningShow").data("fc", e.head.fc).data("bc", e.head.bc), $("#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.head.fc), $("#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.head.bc), $("#luckysheet-alternateformat-modelToning .ctOne .toningShow").css({ color: e.one.fc, "background-color": e.one.bc }), $("#luckysheet-alternateformat-modelToning .ctOne .toningShow").data("fc", e.one.fc).data("bc", e.one.bc), $("#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.one.fc), $("#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.one.bc), $("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").css({ color: e.two.fc, "background-color": e.two.bc }), $("#luckysheet-alternateformat-modelToning .ctTwo .toningShow").data("fc", e.two.fc).data("bc", e.two.bc), $("#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.two.fc), $("#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.two.bc), $("#luckysheet-alternateformat-modelToning .footer .toningShow").css({ color: e.foot.fc, "background-color": e.foot.bc }), $("#luckysheet-alternateformat-modelToning .footer .toningShow").data("fc", e.foot.fc).data("bc", e.foot.bc), $("#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.foot.fc), $("#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color").parents(".luckysheet-color-menu-button-indicator").css("border-bottom-color", e.foot.bc) }, addCustomModel: function (e) { var t = ga.luckysheetfile[_l(ga.currentSheetIndex)]; null == t.luckysheet_alternateformat_save_modelCustom && (t.luckysheet_alternateformat_save_modelCustom = []), t.luckysheet_alternateformat_save_modelCustom.push(e), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, t.luckysheet_alternateformat_save_modelCustom, { k: "luckysheet_alternateformat_save_modelCustom" }) }, colorSelectDialog: function (e, t, a) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-alternateformat-colorSelect-dialog").remove(); var r, n = gn(), l = n.alternatingColors, i = n.button, o = n.toolbar; "fc" == t ? r = l.selectionTextColor : "bc" == t && (r = l.selectionCellColor), $("body").append(_m(bn, { id: "luckysheet-alternateformat-colorSelect-dialog", addclass: "luckysheet-alternateformat-colorSelect-dialog", title: r, content: "<div class='currenColor' data-source='" + a + "'>" + l.currentColor + "<span title='" + e + "' style='background-color:" + e + "'></span></div><div class='colorshowbox'></div>", botton: '<button id="luckysheet-alternateformat-colorSelect-dialog-confirm" class="btn btn-primary">' + i.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + i.cancel + "</button>", style: "z-index:100003" })); var s = $("#luckysheet-alternateformat-colorSelect-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), c = s.outerHeight(), u = s.outerWidth(), d = $(window).width(), h = $(window).height(), m = $(document).scrollLeft(), p = $(document).scrollTop(); $("#luckysheet-alternateformat-colorSelect-dialog").css({ left: (d + m - u) / 2, top: (h + p - c) / 3 }).show(), $("#luckysheet-alternateformat-colorSelect-dialog").find(".colorshowbox").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, showButtons: !1, maxPaletteSize: 8, maxSelectionSize: 8, color: e, cancelText: i.cancel, chooseText: o.confirmColor, togglePaletteMoreText: o.customColor, togglePaletteLessText: o.collapse, togglePaletteOnly: !0, clearText: o.clearText, noColorSelectedText: o.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"]], move: function (e) { e = null != e ? e.toHexString() : "#000", $("#luckysheet-alternateformat-colorSelect-dialog .currenColor span").css("background-color", e).attr("title", e) } }) }, rangeDialog: function (e) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-alternateformat-rangeDialog").remove(); var t = gn(), a = t.alternatingColors, r = t.button; $("body").append(_m(bn, { id: "luckysheet-alternateformat-rangeDialog", addclass: "luckysheet-alternateformat-rangeDialog", title: a.selectRange, content: '<input readonly="readonly" placeholder="' + a.tipSelectRange + '" value="' + e + '"/>', botton: '<button id="luckysheet-alternateformat-rangeDialog-confirm" class="btn btn-primary">' + r.confirm + '</button><button id="luckysheet-alternateformat-rangeDialog-close" class="btn btn-default">' + r.cancel + "</button>", style: "z-index:100003" })); var n = $("#luckysheet-alternateformat-rangeDialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-alternateformat-rangeDialog").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show() }, rangeIsExists: function (e, t) { var a = !1, r = null, n = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save); if (null != t && null != t && (n.length > 1 ? n.splice(t, 1) : n = []), n.length > 0) { for (var l = [], i = 0; i < n.length; i++) { var o = { index: i, map: this.getRangeMap(n[i].cellrange.row, n[i].cellrange.column) }; l.push(o) } var s = this.getRangeMap(e.row, e.column); for (var c in s) { if (a) break; for (var u = 0; u < l.length; u++)if (c in l[u].map) { a = !0, r = l[u].index; break } } } return [a, r] }, getRangeMap: function (e, t) { for (var a = {}, r = e[0], n = e[1], l = t[0], i = t[1], o = r; o <= n; o++)for (var s = l; s <= i; s++)a[o + "_" + s] = 0; return a }, getIndexByFormat: function (e) { for (var t = null, a = this.FixedModelColor, r = 0; r < a.length; r++) { var n = a[r]; if (e.head.fc == n.head.fc && e.head.bc == n.head.bc && e.one.fc == n.one.fc && e.one.bc == n.one.bc && e.two.fc == n.two.fc && e.two.bc == n.two.bc && e.foot.fc == n.foot.fc && e.foot.bc == n.foot.bc) { t = r; break } } var l = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save_modelCustom; if (null != l && l.length > 0) for (var i = 0; i < l.length; i++) { var o = l[i]; if (e.head.fc == o.head.fc && e.head.bc == o.head.bc && e.one.fc == o.one.fc && e.one.bc == o.one.bc && e.two.fc == o.two.fc && e.two.bc == o.two.bc && e.foot.fc == o.foot.fc && e.foot.bc == o.foot.bc) { t = a.length + i; break } } return t }, getFormatByIndex: function () { var e = this.modelfocusIndex, t = this.FixedModelColor.length; return e < t ? this.FixedModelColor[e] : ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save_modelCustom[e - t] }, new: function (e) { var t = this.getFormatByIndex(), a = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save; null == a && (a = []); var r = $.extend(!0, [], a), n = { cellrange: { row: e.row, column: e.column }, format: t, hasRowHeader: !0, hasRowFooter: !1 }; a.push(n); var l = $.extend(!0, [], a); this.ref(r, l), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, a, { k: "luckysheet_alternateformat_save" }) }, update: function () { var e = gn().alternatingColors, t = $("#luckysheet-alternateformat-remove").data("index"), a = $("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input").val().trim(); if (Ih.iscelldata(a)) { var r = Ih.getcellrange(a); if (this.rangeIsExists(r, t)[0]) wa() ? alert(e.errorExistColors) : fd.info(e.errorExistColors, ""); else { var n, l; n = !!$("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowHeader").is(":checked"), l = !!$("#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowFooter").is(":checked"); var i = this.getFormatByIndex(), o = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save; null == o && (o = []); var s = $.extend(!0, [], o), c = { cellrange: { row: r.row, column: r.column }, format: i, hasRowHeader: n, hasRowFooter: l }; o[t] = c; var u = $.extend(!0, [], o); this.ref(s, u), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, o, { k: "luckysheet_alternateformat_save" }) } } else wa() ? alert(e.errorNoRange) : fd.info(e.errorNoRange, "") }, checksAF: function (e, t, a) { return e + "_" + t in a ? a[e + "_" + t] : null }, getComputeMap: function () { var e = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_alternateformat_save; return this.compute(e) }, compute: function (e) { var t = {}; if (null != e && e.length > 0) for (var a = 0; a < e.length; a++) { var r = e[a].cellrange, n = e[a].format, l = e[a].hasRowHeader, i = e[a].hasRowFooter, o = r.row[0], s = r.row[1], c = r.column[0], u = r.column[1]; if (l && i) { for (var d = c; d <= u; d++)t[o + "_" + d] = [n.head.fc, n.head.bc]; if (s - o > 1) for (var h = o + 1; h < s; h++) { var m = void 0, p = void 0; (h - o) % 2 != 0 ? (m = n.one.fc, p = n.one.bc) : (m = n.two.fc, p = n.two.bc); for (var f = c; f <= u; f++)t[h + "_" + f] = [m, p] } if (s > o) for (var g = c; g <= u; g++)t[s + "_" + g] = [n.foot.fc, n.foot.bc] } else if (l) { for (var v = c; v <= u; v++)t[o + "_" + v] = [n.head.fc, n.head.bc]; if (s > o) for (var y = o + 1; y <= s; y++) { var b = void 0, k = void 0; (y - o) % 2 != 0 ? (b = n.one.fc, k = n.one.bc) : (b = n.two.fc, k = n.two.bc); for (var x = c; x <= u; x++)t[y + "_" + x] = [b, k] } } else if (i) { if (s > o) for (var w = o; w < s; w++) { var _ = void 0, C = void 0; (w - o) % 2 == 0 ? (_ = n.one.fc, C = n.one.bc) : (_ = n.two.fc, C = n.two.bc); for (var T = c; T <= u; T++)t[w + "_" + T] = [_, C] } for (var A = c; A <= u; A++)t[s + "_" + A] = [n.foot.fc, n.foot.bc] } else for (var S = o; S <= s; S++) { var I = void 0, R = void 0; (S - o) % 2 == 0 ? (I = n.one.fc, R = n.one.bc) : (I = n.two.fc, R = n.two.bc); for (var $ = c; $ <= u; $++)t[S + "_" + $] = [I, R] } } return t }, ref: function (e, t) { if (ga.clearjfundo) { ga.jfundo.length = 0; var a = { type: "updateAF" }; a.sheetIndex = ga.currentSheetIndex, a.data = { historyRules: e, currentRules: t }, ga.jfredo.push(a) } var r = _l(ga.currentSheetIndex); ga.luckysheetfile[r].luckysheet_alternateformat_save = t, setTimeout((function () { md() }), 1) } }, _c = { parseJsonParm: function (e) { if (null == e) return {}; if ("string" != Cm(e)) return e; try { return new Function("return " + e)() } catch (e) { return {} } }, hasKey: function (e) { var t = this.parseJsonParm(e); for (var a in t) return !0; return !1 } }; function Cc(e, t, a, r, n, l, i, o, s, c) { if (t ? (e.addClass("luckysheet-filter-options-active").data("rowhidden", JSON.stringify(a)).data("caljs", JSON.stringify(r)).html('<i class="fa fa-filter luckysheet-mousedown-cancel" aria-hidden="true"></i>'), null != r && (e.data("byconditionvalue", r.value).data("byconditiontype", r.type).data("byconditiontext", r.text), null != r.value1 && e.data("byconditionvalue1", r.value1), null != r.value2 && e.data("byconditionvalue2", r.value2))) : (e.removeClass("luckysheet-filter-options-active").data("rowhidden", "").data("caljs", "").html('<i class="fa fa-caret-down luckysheet-mousedown-cancel" aria-hidden="true"></i>'), e.data("byconditionvalue", "null").data("byconditiontype", "0").data("byconditiontext", "无").data("byconditionvalue1", "").data("byconditionvalue2", "")), n) { var u = ga.luckysheetfile[_l(ga.currentSheetIndex)]; if (null == u.filter && (u.filter = {}), t) { var d = { caljs: r, rowhidden: a, optionstate: t, str: l, edr: i, cindex: o, stc: s, edc: c }; u.filter[o - s] = d } else delete u.filter[o - s]; pd.saveParam("all", ga.currentSheetIndex, u.filter, { k: "filter" }) } } function Tc(e, t, a, r, n, l) { for (var i = rs.deepCopyFlowData(ga.flowdata), o = !1, s = [], c = e += 1; c <= a; c++) { for (var u = [], d = t; d <= r; d++) { if (null != i[c][d] && null != i[c][d].mc) { o = !0; break } u.push(i[c][d]) } s.push(u) } if (o) { var h = gn().filter; wa() ? alert(h.mergeError) : fd.info(h.mergeError, "") } else { s = ku(s, n - t, l); for (var m = e; m <= a; m++)for (var p = t; p <= r; p++)i[m][p] = s[m - e][p - t]; var f = {}; if (null != ga.config.rowlen) { var g = $.extend(!0, {}, ga.config); f = { cfg: g = qs(i, e, a, g), RowlChange: !0 } } id(i, [{ row: [e, a], column: [t, r] }], f) } } function Ac() { if (bu(ga.currentSheetIndex, "filter")) if (ga.luckysheet_select_save.length > 1) { $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), $("#" + ga.container).attr("tabindex", 0).focus(); var e = gn().splitText; wa() ? alert(e.tipNoMulti) : fd.info(e.tipNoMulti, "") } else if (!ga.luckysheetfile[_l(ga.currentSheetIndex)].isPivotTable) { $("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex + ", #luckysheet-filter-options-sheet" + ga.currentSheetIndex).remove(); var t = ga.luckysheet_select_save[0]; if (t.row[0] == t.row[1] && t.column[0] == t.column[1]) { for (var a, r, n = t.row[1], l = 0; l < ga.flowdata[n].length; l++) { var i = ga.flowdata[n][l]; if (null == i || ya(i.v)) { if (null != a) { r = l - 1; break } } else null == a && (a = l) } null == r && (r = ga.flowdata[n].length - 1), ga.luckysheet_select_save = [{ row: [n, n], column: [a, r] }], Rh(), ga.luckysheet_shiftpositon = $.extend(!0, {}, t), hc("down", "range") } else t.row[1] - t.row[0] < 2 && (ga.luckysheet_shiftpositon = $.extend(!0, {}, t), hc("down", "range")); ga.luckysheet_filter_save = $.extend(!0, {}, ga.luckysheet_select_save[0]), Sc(ga.luckysheet_filter_save), pd.saveParam("all", ga.currentSheetIndex, ga.luckysheet_filter_save, { k: "filter_select" }), ga.filterchage && ga.jfredo.push({ type: "filtershow", data: [], curdata: [], sheetIndex: ga.currentSheetIndex, filter_save: ga.luckysheet_filter_save }) } } function Sc(e, t) { if ($("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex).remove(), $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex).remove(), null != e && "{}" != JSON.stringify(e)) { var a = e.row[0], r = e.row[1], n = e.column[0], l = e.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 = '<div id="luckysheet-filter-selected-sheet' + ga.currentSheetIndex + '" class="luckysheet-cell-selected luckysheet-filter-selected" style="left:' + c + "px;width:" + (s - c - 1) + "px;top:" + o + "px;height:" + (i - o - 1) + 'px;display:block;border-color:#897BFF;z-index:20;background:none;"></div>'; $("#luckysheet-cell-main").append(u); for (var d = "", h = n; h <= l; h++)if (null == t || null == t[h - n]) d += '<div data-rowhidden="" data-str="' + a + '" data-edr="' + r + '" data-cindex="' + h + '" data-stc="' + n + '" data-edc="' + l + '" class="luckysheet-filter-options" style="left:' + (ga.visibledatacolumn[h] - 20) + "px;top:" + o + 'px;display:block;"><i class="fa fa-caret-down" aria-hidden="true"></i></div>'; else { var m = void 0; if (null != t[h - n].caljs) { var p = void 0; p = null != t[h - n].caljs.value1 ? 'data-byconditionvalue1="' + t[h - n].caljs.value1 + '" ' : ""; var f = void 0; f = null != t[h - n].caljs.value2 ? 'data-byconditionvalue2="' + t[h - n].caljs.value2 + '" ' : "", m = 'data-caljs="' + JSON.stringify(t[h - n].caljs) + '" data-byconditionvalue="' + t[h - n].caljs.value + '" data-byconditiontype="' + t[h - n].caljs.type + '" data-byconditiontext="' + t[h - n].caljs.text + '" ' + p + f } else m = ""; d += '<div data-rowhidden="' + JSON.stringify(t[h - n].rowhidden).replace(/\"/g, "'") + '" ' + m + ' data-str="' + a + '" data-edr="' + r + '" data-cindex="' + h + '" data-stc="' + n + '" data-edc="' + l + '" class="luckysheet-filter-options luckysheet-filter-options-active" style="left:' + (ga.visibledatacolumn[h] - 20) + "px;top:" + o + 'px;display:block;"><i class="fa fa-filter luckysheet-mousedown-cancel" aria-hidden="true"></i></div>' } $("#luckysheet-cell-main").append('<div id="luckysheet-filter-options-sheet' + ga.currentSheetIndex + '" class="luckysheet-filter-options-c">' + d + "</div>"), $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), $("#luckysheet-cell-main").scrollTop() > e.top_move && $("#luckysheet-scrollbar-y").scrollTop(e.top_move), ga.luckysheetfile[_l(ga.currentSheetIndex)].filter_select = e } } var Ic, Rc = { imgItem: { type: "3", src: "", originWidth: null, originHeight: null, default: { width: null, height: null, left: null, top: null }, crop: { width: null, height: null, offsetLeft: 0, offsetTop: 0 }, isFixedPos: !1, fixedLeft: null, fixedTop: null, border: { width: 0, radius: 0, style: "solid", color: "#000" } }, images: null, currentImgId: null, currentWinW: null, currentWinH: null, resize: null, resizeXY: null, move: !1, moveXY: null, cropChange: null, cropChangeXY: null, cropChangeObj: null, copyImgItemObj: null, inserImg: function (e) { var t = this, a = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], r = a.row_focus || 0, n = a.column_focus || 0, l = 0 == n ? 0 : ga.visibledatacolumn[n - 1], i = 0 == r ? 0 : ga.visibledatarow[r - 1], o = new Image; o.onload = function () { var a = o.width, r = o.height, n = { src: e, left: l, top: i, originWidth: a, originHeight: r }; t.addImgItem(n) }, o.src = e }, generateRandomId: function (e) { null == e && (e = "img"); 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() }, modelHtml: function (e, t) { var a = t.src, r = this.getImgItemParam(t), n = r.width * ga.zoomRatio, l = r.height * ga.zoomRatio, i = r.left * ga.zoomRatio, o = r.top * ga.zoomRatio, s = r.position, c = t.border.width; return '<div id="'.concat(e, '" class="luckysheet-modal-dialog luckysheet-modal-dialog-image" style="width:').concat(n, "px;height:").concat(l, "px;padding:0;position:").concat(s, ";left:").concat(i, "px;top:").concat(o, 'px;z-index:200;">\n <div class="luckysheet-modal-dialog-content" style="width:100%;height:100%;overflow:hidden;position:relative;">\n <img src="').concat(a, '" style="position:absolute;width:').concat(t.default.width * ga.zoomRatio, "px;height:").concat(t.default.height * ga.zoomRatio, "px;left:").concat(-t.crop.offsetLeft * ga.zoomRatio, "px;top:").concat(-t.crop.offsetTop * ga.zoomRatio, 'px;" />\n </div>\n <div class="luckysheet-modal-dialog-border" style="border:').concat(c, "px ").concat(t.border.style, " ").concat(t.border.color, ";border-radius:").concat(t.border.radius * ga.zoomRatio, "px;position:absolute;left:").concat(-c, "px;right:").concat(-c, "px;top:").concat(-c, "px;bottom:").concat(-c, 'px;"></div>\n </div>') }, getSliderHtml: function () { var e = gn().imageText; return '<div id="luckysheet-modal-dialog-slider-imageCtrl" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-imageCtrl" style="display:block;">\n <div class="luckysheet-modal-dialog-slider-title">\n <span>'.concat(e.imageSetting, '</span>\n <span class="luckysheet-model-close-btn" title="').concat(e.close, '">\n <i class="fa fa-times" aria-hidden="true"></i>\n </span>\n </div>\n <div class="luckysheet-modal-dialog-slider-content">\n <div class="slider-box">\n <div class="slider-box-title">').concat(e.conventional, '</div>\n <div class="slider-box-radios">\n <div class="radio-item">\n <input type="radio" id="imgItemType1" name="imgItemType" value="1">\n <label for="imgItemType1">').concat(e.moveCell1, '</label>\n </div>\n <div class="radio-item">\n <input type="radio" id="imgItemType2" name="imgItemType" value="2">\n <label for="imgItemType2">').concat(e.moveCell2, '</label>\n </div>\n <div class="radio-item">\n <input type="radio" id="imgItemType3" name="imgItemType" value="3">\n <label for="imgItemType3">').concat(e.moveCell3, '</label>\n </div>\n </div>\n <div class="slider-box-checkbox">\n <input type="checkbox" id="imgItemIsFixedPos">\n <label for="imgItemIsFixedPos">').concat(e.fixedPos, '</label>\n </div>\n </div>\n <div class="slider-box">\n <div class="slider-box-title">').concat(e.border, '</div>\n <div class="slider-box-borderConfig">\n <div class="border-item">\n <label>').concat(e.width, '</label>\n <input type="number" id="imgItemBorderWidth" min="0">\n </div>\n <div class="border-item">\n <label>').concat(e.radius, '</label>\n <input type="number" id="imgItemBorderRadius" min="0">\n </div>\n <div class="border-item">\n <label>').concat(e.style, '</label>\n <select id="imgItemBorderStyle">\n <option value="solid">').concat(e.solid, '</option>\n <option value="dashed">').concat(e.dashed, '</option>\n <option value="dotted">').concat(e.dotted, '</option>\n <option value="double">').concat(e.double, '</option>\n </select>\n </div>\n <div class="border-item">\n <label>').concat(e.color, '</label>\n <div id="imgItemBorderColor" class="imgItemBorderColor">\n <span></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>') }, sliderHtmlShow: function () { $("#luckysheet-modal-dialog-slider-imageCtrl").remove(); var e = this.getSliderHtml(); $("body").append(e), Uc(); var t = this.images[this.currentImgId], a = t.type; $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemType" + a).prop("checked", !0); var r = t.isFixedPos; $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemIsFixedPos").prop("checked", r); var n = t.border; $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderWidth").val(n.width), $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderRadius").val(n.radius), $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderStyle").val(n.style), $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span").css("background-color", n.color).attr("title", n.color), this.init() }, colorSelectDialog: function (e) { var t = gn(), a = t.button, r = t.toolbar, n = t.imageCtrl; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-imageCtrl-colorSelect-dialog").remove(), $("body").append(_m(bn, { id: "luckysheet-imageCtrl-colorSelect-dialog", addclass: "luckysheet-imageCtrl-colorSelect-dialog", title: n.borderTile, content: '<div class="currenColor">\n '.concat(n.borderCur, ':<span title="').concat(e, '" style="background-color:').concat(e, '"></span>\n </div>\n <div class="colorshowbox"></div>'), botton: '<button id="luckysheet-imageCtrl-colorSelect-dialog-confirm" class="btn btn-primary">'.concat(a.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(a.cancel, "</button>"), style: "z-index:100003" })); var l = $("#luckysheet-imageCtrl-colorSelect-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), i = l.outerHeight(), o = l.outerWidth(), s = $(window).width(), c = $(window).height(), u = $(document).scrollLeft(), d = $(document).scrollTop(); $("#luckysheet-imageCtrl-colorSelect-dialog").css({ left: (s + u - o) / 2, top: (c + d - i) / 3 }).show(), $("#luckysheet-imageCtrl-colorSelect-dialog").find(".colorshowbox").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, showButtons: !1, maxPaletteSize: 8, maxSelectionSize: 8, color: e, cancelText: a.cancel, chooseText: r.confirmColor, togglePaletteMoreText: r.customColor, togglePaletteLessText: r.collapse, togglePaletteOnly: !0, clearText: r.clearText, noColorSelectedText: r.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"]], move: function (e) { e = null != e ? e.toHexString() : "#000", $("#luckysheet-imageCtrl-colorSelect-dialog .currenColor span").css("background-color", e).attr("title", e) } }) }, init: function () { var e = this; $("#luckysheet-modal-dialog-slider-imageCtrl .luckysheet-model-close-btn").click((function () { $("#luckysheet-modal-dialog-slider-imageCtrl").hide(), Uc() })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("change.radio").on("change.radio", ".radio-item input[type=radio][name=imgItemType]", (function () { e.configChange("type", this.value) })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("change.checkbox").on("change.checkbox", ".slider-box-checkbox input[type=checkbox]", (function () { e.configChange("fixedPos", this.checked) })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("change.borderWidth").on("change.borderWidth", "#imgItemBorderWidth", (function () { e.configChange("border-width", this.valueAsNumber) })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("change.borderRadius").on("change.borderRadius", "#imgItemBorderRadius", (function () { e.configChange("border-radius", this.valueAsNumber) })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("change.borderStyle").on("change.borderStyle", "#imgItemBorderStyle", (function () { e.configChange("border-style", this.value) })), $("#luckysheet-modal-dialog-slider-imageCtrl").off("click.color").on("click.color", "#imgItemBorderColor", (function () { var t = $(this).find("span").attr("title"); e.colorSelectDialog(t) })), $(document).off("click.selectColorConfirm").on("click.selectColorConfirm", "#luckysheet-imageCtrl-colorSelect-dialog-confirm", (function () { var t = $(this).parents("#luckysheet-imageCtrl-colorSelect-dialog"); $("#luckysheet-modal-dialog-mask").hide(), t.hide(); var a = t.find(".currenColor span").attr("title"); $("#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span").css("background-color", a).attr("title", a), e.configChange("border-color", a) })), $("#luckysheet-image-showBoxs").off("mousedown.active").on("mousedown.active", ".luckysheet-modal-dialog-image", (function (t) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { $(this).hide(); var a = $(this).attr("id"); null != e.currentImgId && e.currentImgId != a && e.cancelActiveImgItem(), e.currentImgId = a; var r = e.images[a], n = e.getImgItemParam(r), l = n.width * ga.zoomRatio, i = n.height * ga.zoomRatio, o = n.left * ga.zoomRatio, s = n.top * ga.zoomRatio, c = n.position; $("#luckysheet-modal-dialog-activeImage").show().css({ width: l, height: i, left: o, top: s, position: c }), $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({ "background-image": "url(" + r.src + ")", "background-size": r.default.width * ga.zoomRatio + "px " + r.default.height * ga.zoomRatio + "px", "background-position": -r.crop.offsetLeft * ga.zoomRatio + "px " + -r.crop.offsetTop * ga.zoomRatio + "px" }), $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border").css({ "border-width": r.border.width * ga.zoomRatio, "border-style": r.border.style, "border-color": r.border.color, "border-radius": r.border.radius * ga.zoomRatio, left: -r.border.width * ga.zoomRatio, right: -r.border.width * ga.zoomRatio, top: -r.border.width * ga.zoomRatio, bottom: -r.border.width * ga.zoomRatio }), e.sliderHtmlShow(), t.stopPropagation() } })), $("#luckysheet-modal-dialog-activeImage").off("mousedown.move").on("mousedown.move", ".luckysheet-modal-dialog-content", (function (t) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { $("#luckysheet-modal-dialog-slider-imageCtrl").is(":visible") || e.sliderHtmlShow(), e.move = !0, e.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth, e.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight; var a = $("#luckysheet-modal-dialog-activeImage").offset(); e.moveXY = [t.pageX - a.left, t.pageY - a.top], Il(!0), t.stopPropagation() } })), $("#luckysheet-modal-dialog-activeImage").off("mousedown.resize").on("mousedown.resize", ".luckysheet-modal-dialog-resize-item", (function (t) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { e.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth, e.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight, e.resize = $(this).data("type"); var a = $("#luckysheet-cell-main").scrollTop(), r = $("#luckysheet-cell-main").scrollLeft(), n = $s(t.pageX, t.pageY), l = n[0] + r, i = n[1] + a, o = $("#luckysheet-modal-dialog-activeImage").position(), s = $("#luckysheet-modal-dialog-activeImage").width(), c = $("#luckysheet-modal-dialog-activeImage").height(); e.resizeXY = [l, i, s, c, o.left + r, o.top + a, r, a], Il(!0), t.stopPropagation() } })), $("#luckysheet-modal-dialog-activeImage").off("mousedown.croppingEnter").on("mousedown.croppingEnter", ".luckysheet-modal-controll-crop", (function (t) { e.croppingEnter(), t.stopPropagation() })), $("#luckysheet-modal-dialog-cropping").off("mousedown.croppingExit").on("mousedown.croppingExit", ".luckysheet-modal-controll-crop", (function (t) { e.croppingExit(), t.stopPropagation() })), $("#luckysheet-modal-dialog-cropping").off("mousedown.cropChange").on("mousedown.cropChange", ".resize-item", (function (t) { e.cropChange = $(this).data("type"); var a = $("#luckysheet-cell-main").scrollTop(), r = $("#luckysheet-cell-main").scrollLeft(), n = $s(t.pageX, t.pageY), l = n[0] + r, i = n[1] + a; e.cropChangeXY = [l, i], Il(!0), t.stopPropagation() })), $("#luckysheet-image-showBoxs").off("mousedown.restore").on("mousedown.restore", ".luckysheet-modal-controll-restore", (function (t) { e.restoreImgItem(), t.stopPropagation() })), $("#luckysheet-image-showBoxs").off("mousedown.delete").on("mousedown.delete", ".luckysheet-modal-controll-del", (function (t) { e.removeImgItem(), t.stopPropagation() })) }, configChange: function (e, t) { var a = this.images[this.currentImgId]; switch (e) { case "type": a.type = t; break; case "fixedPos": a.isFixedPos = t; var r = this.getImgItemParam(a), n = r.width, l = r.height, i = r.left, o = r.top, s = r.position; $("#luckysheet-modal-dialog-activeImage").show().css({ width: n, height: l, left: i, top: o, position: s }); break; case "border-width": a.border.width = t, $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border").css({ "border-width": t, left: -t, right: -t, top: -t, bottom: -t }); break; case "border-radius": a.border.radius = t, $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border").css("border-radius", t); break; case "border-style": a.border.style = t, $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border").css("border-style", t); break; case "border-color": a.border.color = t, $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border").css("border-color", t) }this.ref() }, getImgItemParam: function (e) { var t = e.isFixedPos, a = e.default.width, r = e.default.height, n = e.default.left, l = e.default.top; e.crop.width == a && e.crop.height == r || (a = e.crop.width, r = e.crop.height, n += e.crop.offsetLeft, l += e.crop.offsetTop); var i = "absolute"; return t && (i = "fixed", n = e.fixedLeft + e.crop.offsetLeft, l = e.fixedTop + e.crop.offsetTop), { width: a, height: r, left: n, top: l, position: i } }, cancelActiveImgItem: function () { $("#luckysheet-modal-dialog-activeImage").hide(), $("#luckysheet-modal-dialog-cropping").hide(), $("#luckysheet-modal-dialog-slider-imageCtrl").hide(); var e = this.images[this.currentImgId], t = this.getImgItemParam(e), a = t.width * ga.zoomRatio, r = t.height * ga.zoomRatio, n = t.left * ga.zoomRatio, l = t.top * ga.zoomRatio, i = t.position; $("#" + this.currentImgId).show().css({ width: a, height: r, left: n, top: l, position: i }), $("#" + this.currentImgId + " img").css({ width: e.default.width * ga.zoomRatio, height: e.default.height * ga.zoomRatio, left: -e.crop.offsetLeft * ga.zoomRatio, top: -e.crop.offsetTop * ga.zoomRatio }), $("#" + this.currentImgId + " .luckysheet-modal-dialog-border").css({ "border-width": e.border.width * ga.zoomRatio, "border-style": e.border.style, "border-color": e.border.color, "border-radius": e.border.radius * ga.zoomRatio, left: -e.border.width * ga.zoomRatio, right: -e.border.width * ga.zoomRatio, top: -e.border.width * ga.zoomRatio, bottom: -e.border.width * ga.zoomRatio }), this.currentImgId = null }, addImgItem: function (e) { var t, a; e.originHeight < e.originWidth ? (a = Math.round(e.originHeight * (400 / e.originWidth)), t = 400) : (t = Math.round(e.originWidth * (400 / e.originHeight)), a = 400), null == this.images && (this.images = {}); var r = $.extend(!0, {}, this.imgItem); r.src = e.src, r.originWidth = e.originWidth, r.originHeight = e.originHeight, r.default.width = t, r.default.height = a, r.default.left = e.left, r.default.top = e.top, r.crop.width = t, r.crop.height = a; var n = $("#luckysheet-cell-main").scrollTop(), l = $("#luckysheet-cell-main").scrollLeft(); r.fixedLeft = e.left - l + ga.rowHeaderWidth, r.fixedTop = e.top - n + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight; var i = this.generateRandomId(), o = this.modelHtml(i, r); $("#luckysheet-image-showBoxs .img-list").append(o), this.images[i] = r, this.ref(), this.init() }, moveImgItem: function () { this.move = !1; var e = $("#luckysheet-modal-dialog-activeImage")[0], t = this.images[this.currentImgId]; t.isFixedPos ? (t.fixedLeft = e.offsetLeft - t.crop.offsetLeft, t.fixedTop = e.offsetTop - t.crop.offsetTop) : (t.default.left = e.offsetLeft - t.crop.offsetLeft, t.default.top = e.offsetTop - t.crop.offsetTop), this.ref() }, resizeImgItem: function () { this.resize = null; var e = $("#luckysheet-modal-dialog-activeImage")[0], t = this.images[this.currentImgId], a = e.clientWidth / t.crop.width, r = e.clientHeight / t.crop.height; t.default.width = Math.round(t.default.width * a), t.default.height = Math.round(t.default.height * r), t.crop.width = Math.round(t.crop.width * a), t.crop.height = Math.round(t.crop.height * r), t.crop.offsetLeft = Math.round(t.crop.offsetLeft * a), t.crop.offsetTop = Math.round(t.crop.offsetTop * r), t.isFixedPos ? (t.fixedLeft = e.offsetLeft, t.fixedTop = e.offsetTop) : (t.default.left = e.offsetLeft - t.crop.offsetLeft, t.default.top = e.offsetTop - t.crop.offsetTop), this.ref() }, croppingEnter: function () { if (this.cropping = !0, bu(ga.currentSheetIndex, "editObjects", !1)) { $("#luckysheet-modal-dialog-activeImage").hide(), $("#luckysheet-modal-dialog-slider-imageCtrl").hide(); var e = this.images[this.currentImgId], t = this.getImgItemParam(e), a = t.width, r = t.height, n = t.left, l = t.top, i = t.position; $("#luckysheet-modal-dialog-cropping").show().css({ width: a, height: r, left: n, top: l, position: i }), $("#luckysheet-modal-dialog-cropping .cropping-mask").css({ width: e.default.width, height: e.default.height, "background-image": "url(" + e.src + ")", left: -e.crop.offsetLeft, top: -e.crop.offsetTop }), $("#luckysheet-modal-dialog-cropping .cropping-content").css({ "background-image": "url(" + e.src + ")", "background-size": e.default.width + "px " + e.default.height + "px", "background-position": -e.crop.offsetLeft + "px " + -e.crop.offsetTop + "px" }), $("#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-border").css({ "border-width": e.border.width, "border-style": e.border.style, "border-color": e.border.color, "border-radius": e.border.radius, left: -e.border.width, right: -e.border.width, top: -e.border.width, bottom: -e.border.width }) } }, croppingExit: function () { this.cropping = !1, $("#luckysheet-modal-dialog-cropping").hide(); var e = this.images[this.currentImgId], t = this.getImgItemParam(e), a = t.width, r = t.height, n = t.left, l = t.top, i = t.position; $("#luckysheet-modal-dialog-activeImage").show().css({ width: a, height: r, left: n, top: l, position: i }), $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({ "background-image": "url(" + e.src + ")", "background-size": e.default.width + "px " + e.default.height + "px", "background-position": -e.crop.offsetLeft + "px " + -e.crop.offsetTop + "px" }) }, cropChangeImgItem: function () { this.cropChange = null; var e = this.images[this.currentImgId]; e.crop.width = this.cropChangeObj.width, e.crop.height = this.cropChangeObj.height, e.crop.offsetLeft = this.cropChangeObj.offsetLeft, e.crop.offsetTop = this.cropChangeObj.offsetTop, this.ref() }, restoreImgItem: function () { var e = this.images[this.currentImgId]; e.default.width = e.originWidth, e.default.height = e.originHeight, e.crop.width = e.originWidth, e.crop.height = e.originHeight, e.crop.offsetLeft = 0, e.crop.offsetTop = 0; var t = this.getImgItemParam(e), a = t.width, r = t.height, n = t.left, l = t.top, i = t.position; $("#luckysheet-modal-dialog-activeImage").show().css({ width: a, height: r, left: n, top: l, position: i }), $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({ "background-image": "url(" + e.src + ")", "background-size": e.default.width + "px " + e.default.height + "px", "background-position": -e.crop.offsetLeft + "px " + -e.crop.offsetTop + "px" }), this.ref() }, removeImgItem: function () { $("#luckysheet-modal-dialog-activeImage").hide(), $("#luckysheet-modal-dialog-cropping").hide(), $("#luckysheet-modal-dialog-slider-imageCtrl").hide(), $("#" + this.currentImgId).remove(), delete this.images[this.currentImgId], this.currentImgId = null, this.ref() }, copyImgItem: function (e) { this.copyImgItemObj = $.extend(!0, {}, this.images[this.currentImgId]); var t = window.clipboardData; t || (t = e.originalEvent.clipboardData); var a = '<table data-type="luckysheet_copy_action_image"><tr><td><td></tr></table>'; if (t) return t.setData("Text", a), !1; var r = $("#luckysheet-copy-content"); r.html(a), r.focus(), r.select(), document.execCommand("selectAll"), document.execCommand("Copy"), setTimeout((function () { $("#luckysheet-copy-content").blur() }), 10) }, pasteImgItem: function () { var e = ga.luckysheet_select_save[0].row_focus || 0, t = ga.luckysheet_select_save[0].column_focus || 0, a = 0 == t ? 0 : ga.visibledatacolumn[t - 1], r = 0 == e ? 0 : ga.visibledatarow[e - 1], n = $.extend(!0, {}, this.copyImgItemObj); n.default.left = a - n.crop.offsetLeft, n.default.top = r - n.crop.offsetTop; var l = $("#luckysheet-cell-main").scrollTop(), i = $("#luckysheet-cell-main").scrollLeft(); n.fixedLeft = n.default.left - i + ga.rowHeaderWidth, n.fixedTop = n.default.top - l + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight; var o = this.generateRandomId(), s = this.modelHtml(o, n); $("#luckysheet-image-showBoxs .img-list").append(s), this.images[o] = n, this.ref(), this.init() }, allImagesShow: function () { if ($("#luckysheet-modal-dialog-activeImage").hide(), $("#luckysheet-modal-dialog-cropping").hide(), $("#luckysheet-modal-dialog-slider-imageCtrl").hide(), $("#luckysheet-image-showBoxs .img-list").empty(), null != this.images) for (var e in this.images) { var t = this.images[e], a = this.modelHtml(e, t); $("#luckysheet-image-showBoxs .img-list").append(a) } }, moveChangeSize: function (e, t, a) { var r = $.extend(!0, {}, this.images); if ("row" == e) { var n = ga.visibledatarow[t], l = a - (n - (t - 1 == -1 ? 0 : ga.visibledatarow[t - 1]) - 1); for (var i in r) { var o = r[i], s = this.getImgItemParam(o), c = o.type; if ("1" == c) { if (s.top >= n) o.default.top = s.top + l - o.crop.offsetTop; else if (s.top + s.height >= n - 2) if (s.top < n + l) { var u = (s.height + l) / s.height; o.default.height = Math.round(o.default.height * u), o.crop.height = Math.round(o.crop.height * u), o.crop.offsetTop = Math.round(o.crop.offsetTop * u) } else { var d = (s.top + s.height - n) / s.height; o.default.height = Math.round(o.default.height * d), o.crop.height = Math.round(o.crop.height * d), o.crop.offsetTop = Math.round(o.crop.offsetTop * d), o.default.top = n + l - o.crop.offsetTop } else if (s.top > n + l) { var h = 1 / s.height; o.default.height = Math.round(o.default.height * h), o.crop.height = Math.round(o.crop.height * h), o.crop.offsetTop = Math.round(o.crop.offsetTop * h), o.default.top = n + l - o.crop.offsetTop } else if (s.top + s.height > n + l) { var m = (n + l - s.top) / s.height; o.default.height = Math.round(o.default.height * m), o.crop.height = Math.round(o.crop.height * m), o.crop.offsetTop = Math.round(o.crop.offsetTop * m) } } else "2" == c && (s.top >= n ? o.default.top = s.top + l - o.crop.offsetTop : s.top > n + l && (o.default.top = n + l - o.crop.offsetTop)) } } else if ("column" == e) { var p = ga.visibledatacolumn[t], f = a - (p - (t - 1 == -1 ? 0 : ga.visibledatacolumn[t - 1]) - 1); for (var g in r) { var v = r[g], y = this.getImgItemParam(v), b = v.type; if ("1" == b) { if (y.left >= p) v.default.left = y.left + f - v.crop.offsetLeft; else if (y.left + y.width >= p - 2) if (y.left < p + f) { var k = (y.width + f) / y.width; v.default.width = Math.round(v.default.width * k), v.crop.width = Math.round(v.crop.width * k), v.crop.offsetLeft = Math.round(v.crop.offsetLeft * k) } else { var x = (y.left + y.width - p) / y.width; v.default.width = Math.round(v.default.width * x), v.crop.width = Math.round(v.crop.width * x), v.crop.offsetLeft = Math.round(v.crop.offsetLeft * x), v.default.left = p + f - v.crop.offsetLeft } else if (y.left > p + f) { var w = 1 / y.width; v.default.width = Math.round(v.default.width * w), v.crop.width = Math.round(v.crop.width * w), v.crop.offsetLeft = Math.round(v.crop.offsetLeft * w), v.default.left = p + f - v.crop.offsetLeft } else if (y.left + y.width > p + f) { var _ = (p + f - y.left) / y.width; v.default.width = Math.round(v.default.width * _), v.crop.width = Math.round(v.crop.width * _), v.crop.offsetLeft = Math.round(v.crop.offsetLeft * _) } } else "2" == b && (y.left >= p ? v.default.left = y.left + f - v.crop.offsetLeft : y.left > p + f && (v.default.left = p + f - v.crop.offsetLeft)) } } return r }, ref: function () { var e = ga.luckysheetfile[_l(ga.currentSheetIndex)], t = this.images; ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "imageCtrl", sheetIndex: ga.currentSheetIndex, images: null == e.images ? null : $.extend(!0, {}, e.images), curImages: t })), e.images = $.extend(!0, {}, t), pd.saveParam("all", ga.currentSheetIndex, e.images, { k: "images" }) } }, $c = { defaultItem: { type: "dropdown", type2: null, value1: "", value2: "", checked: !1, remote: !1, prohibitInput: !1, hintShow: !1, hintText: "" }, curItem: null, dataVerification: null, selectRange: [], selectStatus: !1, optionLabel: { number: "数值", number_integer: "整数", number_decimal: "小数", bw: "介于", nb: "不介于", eq: "等于", ne: "不等于", gt: "大于", lt: "小于", gte: "大于等于", lte: "小于等于", include: "包括", exclude: "不包括", equal: "等于", bf: "早于", nbf: "不早于", af: "晚于", naf: "不晚于", card: "身份证号码", phone: "手机号" }, optionLabel_en: { number: "numeric", number_integer: "integer", number_decimal: "decimal", bw: "between", nb: "not between", eq: "equal to", ne: "not equal to", gt: "greater", lt: "less than", gte: "greater or equal to", lte: "less than or equal to", include: "include", exclude: "not include", equal: "equal to", bf: "earlier than", nbf: "not earlier than", af: "later than", naf: "not later than", card: "identification number", phone: "phone number" }, createDialog: function () { var e = gn(), t = e.dataVerification, a = e.toolbar, r = e.button; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-dataVerification-dialog").remove(); var n = '<div class="box">\n <div class="box-item" style="border-top:1px solid #E1E4E8;">\n <div class="box-item-title">'.concat(t.cellRange, '</div>\n <div id="data-verification-range" class="range">\n <input class="formulaInputFocus" spellcheck="false">\n <i class="fa fa-table" aria-hidden="true" title="').concat(t.selectCellRange, '"></i>\n </div>\n </div>\n <div class="box-item">\n <div class="box-item-title">').concat(t.verificationCondition, '</div>\n <select id="data-verification-type-select">\n <option value="dropdown">').concat(t.dropdown, '</option>\n <option value="checkbox">').concat(t.checkbox, '</option>\n <option value="number">').concat(t.number, '</option>\n <option value="number_integer">').concat(t.number_integer, '</option>\n <option value="number_decimal">').concat(t.number_decimal, '</option>\n <option value="text_content">').concat(t.text_content, '</option>\n <option value="text_length">').concat(t.text_length, '</option>\n <option value="date">').concat(t.date, '</option>\n <option value="validity">').concat(t.validity, '</option>\n </select>\n <div class="show-box">\n <div class="show-box-item show-box-item-dropdown">\n <div class="range">\n <input class="formulaInputFocus data-verification-value1" placeholder="').concat(t.placeholder1, '" spellcheck="false">\n <i class="fa fa-table" aria-hidden="true" title="').concat(t.selectCellRange, '"></i>\n </div>\n </div>\n <div class="show-box-item show-box-item-checkbox">\n <div class="check-box">\n <span>').concat(t.selected, ' ——</span>\n <input type="text" class="data-verification-value1" placeholder="').concat(t.placeholder2, '">\n </div>\n <div class="check-box">\n <span>').concat(t.notSelected, ' ——</span>\n <input type="text" class="data-verification-value2" placeholder="').concat(t.placeholder2, '">\n </div>\n </div>\n <div class="show-box-item show-box-item-number">\n <select id="data-verification-number-select">\n <option value="bw">').concat(t.between, '</option>\n <option value="nb">').concat(t.notBetween, '</option>\n <option value="eq">').concat(t.equal, '</option>\n <option value="ne">').concat(t.notEqualTo, '</option>\n <option value="gt">').concat(t.moreThanThe, '</option>\n <option value="lt">').concat(t.lessThan, '</option>\n <option value="gte">').concat(t.greaterOrEqualTo, '</option>\n <option value="lte">').concat(t.lessThanOrEqualTo, '</option>\n </select>\n <div class="input input1">\n <input type="number" class="data-verification-value1" placeholder="1">\n <span>-</span>\n <input type="number" class="data-verification-value2" placeholder="100">\n </div>\n <div class="input input2">\n <input type="number" class="data-verification-value1" placeholder="').concat(t.placeholder3, '">\n </div>\n </div>\n <div class="show-box-item show-box-item-text">\n <select id="data-verification-text-select">\n <option value="include">').concat(t.include, '</option>\n <option value="exclude">').concat(t.exclude, '</option>\n <option value="equal">').concat(t.equal, '</option>\n </select>\n <div class="input input2">\n <input type="text" class="data-verification-value1" placeholder="').concat(t.placeholder4, '"/>\n </div>\n </div>\n <div class="show-box-item show-box-item-textLength">\n <select id="data-verification-textLength-select">\n <option value="bw">').concat(t.between, '</option>\n <option value="nb">').concat(t.notBetween, '</option>\n <option value="eq">').concat(t.equal, '</option>\n <option value="ne">').concat(t.notEqualTo, '</option>\n <option value="gt">').concat(t.moreThanThe, '</option>\n <option value="lt">').concat(t.lessThan, '</option>\n <option value="gte">').concat(t.greaterOrEqualTo, '</option>\n <option value="lte">').concat(t.lessThanOrEqualTo, '</option>\n </select>\n <div class="input input1">\n <input type="number" class="data-verification-value1" placeholder="1">\n <span>-</span>\n <input type="number" class="data-verification-value2" placeholder="100">\n </div>\n <div class="input input2">\n <input type="number" class="data-verification-value1" placeholder="').concat(t.placeholder3, '">\n </div>\n </div>\n <div class="show-box-item show-box-item-date">\n <select id="data-verification-date-select">\n <option value="bw">').concat(t.between, '</option>\n <option value="nb">').concat(t.notBetween, '</option>\n <option value="eq">').concat(t.equal, '</option>\n <option value="ne">').concat(t.notEqualTo, '</option>\n <option value="bf">').concat(t.earlierThan, '</option>\n <option value="nbf">').concat(t.noEarlierThan, '</option>\n <option value="af">').concat(t.laterThan, '</option>\n <option value="naf">').concat(t.noLaterThan, '</option>\n </select>\n <div class="input input1">\n <input type="date" class="data-verification-value1" placeholder="2020/9/10">\n <span>-</span>\n <input type="date" class="data-verification-value2" placeholder="2020/9/10">\n </div>\n <div class="input input2">\n <input type="date" class="data-verification-value1" placeholder="2020/9/10">\n </div>\n </div>\n <div class="show-box-item show-box-item-validity">\n <select id="data-verification-validity-select">\n <option value="card">').concat(t.identificationNumber, '</option>\n <option value="phone">').concat(t.phoneNumber, '</option>\n </select>\n </div>\n </div>\n </div>\n <div class="box-item">\n <div class="check">\n <input type="checkbox" id="data-verification-remote" class="data-verification-remote">\n <label for="data-verification-remote">').concat(t.remote, '</label>\n </div>\n <div class="check">\n <input type="checkbox" id="data-verification-prohibitInput">\n <label for="data-verification-prohibitInput">').concat(t.prohibitInput, '</label>\n </div>\n <div class="check">\n <input type="checkbox" id="data-verification-hint-show">\n <label for="data-verification-hint-show">').concat(t.hintShow, '</label>\n </div>\n <div class="data-verification-hint-text">\n <input type="text" placeholder="').concat(t.placeholder5, '">\n </div>\n </div>\n </div>'); $("body").append(_m(bn, { id: "luckysheet-dataVerification-dialog", addclass: "luckysheet-dataVerification-dialog", title: a.dataVerification, content: n, botton: '<button id="luckysheet-dataVerification-dialog-confirm" class="btn btn-primary">'.concat(r.confirm, '</button>\n <button id="luckysheet-dataVerification-dialog-delete" class="btn btn-default">').concat(t.deleteVerification, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(r.cancel, "</button>"), style: "z-index:100003" })); var l = $("#luckysheet-dataVerification-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 350).end(), i = l.outerHeight(), o = l.outerWidth(), s = $(window).width(), c = $(window).height(), u = $(document).scrollLeft(), d = $(document).scrollTop(); $("#luckysheet-dataVerification-dialog").css({ left: (s + u - o) / 2, top: (c + d - i) / 3 }).show(), this.dataAllocation() }, init: function () { var e = this, t = gn().dataVerification; $(document).off("click.dropdownBtn").on("click.dropdownBtn", "#luckysheet-dataVerification-dropdown-btn", (function (t) { e.dropdownListShow(), t.stopPropagation() })), $(document).off("click.dropdownListItem").on("click.dropdownListItem", "#luckysheet-dataVerification-dropdown-List .dropdown-List-item", (function (e) { $("#luckysheet-dataVerification-dropdown-List").hide(); var t = e.target.innerText, a = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], r = a.row_focus, n = a.column_focus; $("#luckysheet-rich-text-editor").text(t), Ih.updatecell(r, n), e.stopPropagation() })), $(document).off("click.dvRange").on("click.dvRange", "#data-verification-range .fa-table", (function (t) { $("#luckysheet-dataVerification-dialog").hide(); var a = $(this).siblings("input").val().trim(); e.rangeDialog("0", a), e.selectRange = []; var r = e.getRangeByTxt(a); if (Ih.rangetosheet = ga.currentSheetIndex, r[0].sheetIndex != ga.currentSheetIndex && Sh.changeSheetExec(r[0].sheetIndex), r.length > 0) for (var n = 0; n < r.length; n++) { var l = r[n].row[0], i = r[n].row[1], o = r[n].column[0], s = r[n].column[1], c = ga.visibledatarow[i], u = l - 1 == -1 ? 0 : ga.visibledatarow[l - 1], d = ga.visibledatacolumn[s], h = o - 1 == -1 ? 0 : ga.visibledatacolumn[o - 1]; e.selectRange.push({ left: h, width: d - h - 1, top: u, height: c - u - 1, left_move: h, width_move: d - h - 1, top_move: u, height_move: c - u - 1, row: [l, i], column: [o, s], row_focus: l, column_focus: o }) } Eh(e.selectRange) })), $(document).off("click.dvRange2").on("click.dvRange2", "#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table", (function (t) { $("#luckysheet-dataVerification-dialog").hide(); var a = $(this).siblings("input").val().trim(); e.rangeDialog("1", a), e.selectRange = []; var r = e.getRangeByTxt(a); if (Ih.rangetosheet = ga.currentSheetIndex, r[0].sheetIndex != ga.currentSheetIndex && Sh.changeSheetExec(r[0].sheetIndex), r.length > 0) for (var n = 0; n < r.length; n++) { var l = r[n].row[0], i = r[n].row[1], o = r[n].column[0], s = r[n].column[1], c = ga.visibledatarow[i], u = l - 1 == -1 ? 0 : ga.visibledatarow[l - 1], d = ga.visibledatacolumn[s], h = o - 1 == -1 ? 0 : ga.visibledatacolumn[o - 1]; e.selectRange.push({ left: h, width: d - h - 1, top: u, height: c - u - 1, left_move: h, width_move: d - h - 1, top_move: u, height_move: c - u - 1, row: [l, i], column: [o, s], row_focus: l, column_focus: o }) } Eh(e.selectRange) })), $(document).off("click.dvRangeConfirm").on("click.dvRangeConfirm", "#luckysheet-dataVerificationRange-dialog-confirm", (function (t) { var a = $(this).attr("data-source"), r = $(this).parents("#luckysheet-dataVerificationRange-dialog").find("input").val(); if (e.getRangeByTxt(r).length > 1) fd.info('<i class="fa fa-exclamation-triangle"></i>', "不能对多重选择区域执行此操作,请选择单个区域,然后再试"); else { "0" == a ? $("#luckysheet-dataVerification-dialog #data-verification-range input").val(r) : "1" == a && $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input").val(r), $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-dataVerification-dialog").show(), null != Ih.rangetosheet && Ih.rangetosheet != ga.currentSheetIndex && (Sh.changeSheetExec(Ih.rangetosheet), Ih.rangetosheet = null); Eh([]) } })), $(document).off("click.dvRangeClose").on("click.dvRangeClose", "#luckysheet-dataVerificationRange-dialog-close", (function (e) { $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-dataVerification-dialog").show(), null != Ih.rangetosheet && Ih.rangetosheet != ga.currentSheetIndex && (Sh.changeSheetExec(Ih.rangetosheet), Ih.rangetosheet = null); Eh([]) })), $(document).on("click", "#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close", (function (e) { $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-dataVerification-dialog").show(), null != Ih.rangetosheet && Ih.rangetosheet != ga.currentSheetIndex && (Sh.changeSheetExec(Ih.rangetosheet), Ih.rangetosheet = null); Eh([]) })), $(document).off("change.typeSelect").on("change.typeSelect", "#data-verification-type-select", (function (t) { $("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide(); var a = this.value, r = e.curItem; if ("dropdown" == a) { $("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show(); var n = ""; a == r.type && (n = r.value1), $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(n) } else if ("checkbox" == a) { $("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show(); var l = "", i = ""; a == r.type && (l = r.value1, i = r.value2), $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(l), $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(i) } else if ("number" == a || "number_integer" == a || "number_decimal" == a) { $("#luckysheet-dataVerification-dialog .show-box-item-number").show(), $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide(); var o = "bw", s = "", c = ""; "number" != r.type && "number_integer" != r.type && "number_decimal" != r.type || (o = r.type2, s = r.value1, c = r.value2), $("#luckysheet-dataVerification-dialog #data-verification-number-select").val(o), "bw" == o || "nb" == o ? $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(s), $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(c) } else if ("text_content" == a) { $("#luckysheet-dataVerification-dialog .show-box-item-text").show(); var u = "include", d = ""; a == r.type && (u = r.type2, d = r.value1), $("#luckysheet-dataVerification-dialog #data-verification-text-select").val(u), $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(d) } else if ("text_length" == a) { $("#luckysheet-dataVerification-dialog .show-box-item-textLength").show(), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide(); var h = "bw", m = "", p = ""; a == r.type && (h = r.type2, m = r.value1, p = r.value2), $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(h), "bw" == h || "nb" == h ? $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(m), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(p) } else if ("date" == a) { $("#luckysheet-dataVerification-dialog .show-box-item-date").show(), $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide(); var f = "bw", g = "", v = ""; a == r.type && (f = r.type2, g = r.value1, v = r.value2), $("#luckysheet-dataVerification-dialog #data-verification-date-select").val(f), "bw" == f || "nb" == f ? $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(g), $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(v) } else if ("validity" == a) { $("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show(); var y = "card"; a == r.type && (y = r.type2), $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(y) } })), $(document).off("change.numberSelect").on("change.numberSelect", "#data-verification-number-select", (function (e) { $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide(); var t = this.value; "bw" == t || "nb" == t ? $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show() })), $(document).off("change.dateSelect").on("change.dateSelect", "#data-verification-date-select", (function (e) { $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide(); var t = this.value; "bw" == t || "nb" == t ? $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show() })), $(document).off("change.hintShow").on("change.hintShow", "#data-verification-hint-show", (function (e) { this.checked ? $("#luckysheet-dataVerification-dialog .data-verification-hint-text").show() : $("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide() })), $(document).off("click.dvSaveConfirm").on("click.dvSaveConfirm", "#luckysheet-dataVerification-dialog-confirm", (function (a) { var r = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim(), n = e.getRangeByTxt(r); if (0 != n.length) { var l = n[n.length - 1].row[0], i = n[n.length - 1].row[1], o = n[n.length - 1].column[0], s = n[n.length - 1].column[1], c = rs.deepCopyFlowData(ga.flowdata); l < 0 && (l = 0), i > c.length - 1 && (i = c.length - 1), o < 0 && (o = 0), s > c[0].length - 1 && (s = c[0].length - 1); var u = $("#luckysheet-dataVerification-dialog #data-verification-type-select").val(), d = null, h = "", m = ""; if ("dropdown" == u) { if (0 == (h = $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val().trim()).length) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo1) } else if ("checkbox" == u) { if (h = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val().trim(), m = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val().trim(), 0 == h.length || 0 == m.length) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo2) } else if ("number" == u || "number_integer" == u || "number_decimal" == u) { if (d = $("#luckysheet-dataVerification-dialog #data-verification-number-select").val(), !ba(h = $("#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value1").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo3); if ("bw" == d || "nb" == d) { if (!ba(m = $("#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value2").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo3); if (Number(m) < Number(h)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo4) } } else if ("text_content" == u) { if (d = $("#luckysheet-dataVerification-dialog #data-verification-text-select").val(), 0 == (h = $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val().trim()).length) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo5) } else if ("text_length" == u) { if (d = $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(), !ba(h = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value1").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo3); if ("bw" == d || "nb" == d) { if (!ba(m = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value2").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo3); if (Number(m) < Number(h)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo4) } } else if ("date" == u) { if (d = $("#luckysheet-dataVerification-dialog #data-verification-date-select").val(), !ds(h = $("#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value1").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo6); if ("bw" == d || "nb" == d) { if (!ds(m = $("#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value2").val().trim())) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo6); if (hs(h, m) > 0) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo7) } } else "validity" == u && (d = $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val()); var p = $("#luckysheet-dataVerification-dialog #data-verification-remote").is(":checked"), f = $("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").is(":checked"), g = $("#luckysheet-dataVerification-dialog #data-verification-hint-show").is(":checked"), v = ""; g && (v = $("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val().trim()); for (var y = { type: u, type2: d, value1: h, value2: m, checked: !1, remote: p, prohibitInput: f, hintShow: g, hintText: v }, b = $.extend(!0, {}, e.dataVerification), k = $.extend(!0, {}, e.dataVerification), x = l; x <= i; x++)for (var w = o; w <= s; w++)k[x + "_" + w] = y, "checkbox" == u && Cs(x, w, c, y.value2); "checkbox" == u ? e.refOfCheckbox(b, k, ga.currentSheetIndex, c, n[n.length - 1]) : e.ref(b, k, ga.currentSheetIndex), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-dataVerification-dialog").hide() } else fd.info('<i class="fa fa-exclamation-triangle"></i>', t.selectCellRange2) })), $(document).off("click.delete").on("click.delete", "#luckysheet-dataVerification-dialog-delete", (function (a) { var r = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim(), n = e.getRangeByTxt(r); if (0 != n.length) { for (var l = $.extend(!0, {}, e.dataVerification), i = $.extend(!0, {}, e.dataVerification), o = n[n.length - 1].row[0], s = n[n.length - 1].row[1], c = n[n.length - 1].column[0], u = n[n.length - 1].column[1], d = o; d <= s; d++)for (var h = c; h <= u; h++)delete i[d + "_" + h]; e.ref(l, i, ga.currentSheetIndex), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-dataVerification-dialog").hide() } else fd.info('<i class="fa fa-exclamation-triangle"></i>', t.selectCellRange2) })), $(document).on("click", "#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn", (function (e) { $(this).parents("#luckysheet-info").hide(), $("#luckysheet-dataVerification-dialog").is(":visible") && $("#luckysheet-modal-dialog-mask").show(), e.stopPropagation() })) }, dataAllocation: function () { var e = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], t = Cl(ga.currentSheetIndex, e, ga.currentSheetIndex); $("#luckysheet-dataVerification-dialog #data-verification-range input").val(t); var a = e.row_focus || e.row[0], r = e.column_focus || e.column[0], n = $.extend(!0, {}, this.dataVerification)[a + "_" + r]; null == n && (n = $.extend(!0, {}, this.defaultItem)), this.curItem = n, $("#luckysheet-dataVerification-dialog #data-verification-type-select").val(n.type), $("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide(), "dropdown" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show(), $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(n.value1)) : "checkbox" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show(), $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(n.value1), $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(n.value2)) : "number" == n.type || "number_integer" == n.type || "number_decimal" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box-item-number").show(), $("#luckysheet-dataVerification-dialog #data-verification-number-select").val(n.type2), $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide(), "bw" == n.type2 || "nb" == n.type2 ? $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(n.value1), $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(n.value2)) : "text_content" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box-item-text").show(), $("#luckysheet-dataVerification-dialog #data-verification-text-select").val(n.type2), $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(n.value1)) : "text_length" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box-item-textLength").show(), $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(n.type2), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide(), "bw" == n.type2 || "nb" == n.type2 ? $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(n.value1), $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(n.value2)) : "date" == n.type ? ($("#luckysheet-dataVerification-dialog .show-box-item-date").show(), $("#luckysheet-dataVerification-dialog #data-verification-date-select").val(n.type2), $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide(), "bw" == n.type2 || "nb" == n.type2 ? $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show() : $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show(), $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(n.value1), $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(n.value2)) : "validity" == n.type && ($("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show(), $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(n.type2)), $("#luckysheet-dataVerification-dialog #data-verification-remote").prop("checked", n.remote), $("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").prop("checked", n.prohibitInput), $("#luckysheet-dataVerification-dialog #data-verification-hint-show").prop("checked", n.hintShow), n.hintShow ? $("#luckysheet-dataVerification-dialog .data-verification-hint-text").show() : $("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide(), $("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val(n.hintText) }, rangeDialog: function (e, t) { var a = gn(), r = a.dataVerification, n = a.button; $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-dataVerificationRange-dialog").remove(), $("body").append(_m(bn, { id: "luckysheet-dataVerificationRange-dialog", addclass: "luckysheet-dataVerificationRange-dialog", title: r.selectCellRange, content: '<input readonly="readonly" placeholder="'.concat(r.selectCellRange2, '" value="').concat(t, '"/>'), botton: '<button id="luckysheet-dataVerificationRange-dialog-confirm" class="btn btn-primary" data-source="'.concat(e, '">').concat(n.confirm, '</button>\n <button id="luckysheet-dataVerificationRange-dialog-close" class="btn btn-default">').concat(n.close, "</button>"), style: "z-index:100003" })); var l = $("#luckysheet-dataVerificationRange-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), i = l.outerHeight(), o = l.outerWidth(), s = $(window).width(), c = $(window).height(), u = $(document).scrollLeft(), d = $(document).scrollTop(); $("#luckysheet-dataVerificationRange-dialog").css({ left: (s + u - o) / 2, top: (c + d - i) / 3 }).show() }, 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.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 }, cellFocus: function (e, t, a) { $("#luckysheet-dataVerification-dropdown-btn").hide(), $("#luckysheet-dataVerification-showHintBox").hide(); if (null != this.dataVerification && null != this.dataVerification[e + "_" + t]) { 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); o && (r = o.row[1], n = o.row[0], l = o.column[1], i = o.column[0]); var s = this.dataVerification[e + "_" + t]; if (a && "checkbox" == s.type) this.checkboxChange(e, t); else { var c; if ("dropdown" == s.type) { if ($("#luckysheet-dataVerification-dropdown-btn").show().css({ "max-width": l - i, "max-height": r - n, left: l - 20, top: n + (r - n - 20) / 2 }), $("#luckysheet-dataVerification-dropdown-List").is(":visible")) $("#luckysheet-dataVerification-dropdown-List").prop("data-index") != e + "_" + t && $("#luckysheet-dataVerification-dropdown-List").hide() } else $("#luckysheet-dataVerification-dropdown-List").hide(); if (s.hintShow) return c = "en" == ga.lang ? '<span style="color:#f5a623;">Hint: </span>' : '<span style="color:#f5a623;">提示:</span>', c += this.getHintText(s), void $("#luckysheet-dataVerification-showHintBox").html(c).show().css({ left: i, top: r }); var u, d = Ko(e, t, null); if (!ya(d)) if (!this.validateCellData(d, s)) u = "en" == ga.lang ? '<span style="color:#f72626;">Failure: </span>' : '<span style="color:#f72626;">失效:</span>', u += this.getFailureText(s), $("#luckysheet-dataVerification-showHintBox").html(u).show().css({ left: i, top: r }) } } else $("#luckysheet-dataVerification-dropdown-List").hide() }, getHintText: function (e) { var t = e.hintText || ""; return 0 == t.length && ("en" == ga.lang ? "dropdown" == e.type ? t += "please select an option in the drop-down list" : "checkbox" == e.type || ("number" == e.type || "number_integer" == e.type || "number_decimal" == e.type ? (t += "please enter a " + this.optionLabel_en[e.type] + " " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "text_content" == e.type ? t += "please enter text " + this.optionLabel_en[e.type2] + " " + e.value1 : "text_length" == e.type ? (t += "please enter text with length " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "date" == e.type ? (t += "please enter a date " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "validity" == e.type && (t += "please enter the correct " + this.optionLabel_en[e.type2])) : "dropdown" == e.type ? t += "请选择下拉列表中的选项" : "checkbox" == e.type || ("number" == e.type || "number_integer" == e.type || "number_decimal" == e.type ? (t += "请输入" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的" + this.optionLabel[e.type]) : "text_content" == e.type ? t += "请输入内容" + this.optionLabel[e.type2] + e.value1 + "的文本" : "text_length" == e.type ? (t += "请输入长度" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的文本") : "date" == e.type ? (t += "请输入" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的日期") : "validity" == e.type && (t += "请输入正确的" + this.optionLabel[e.type2]))), t }, getFailureText: function (e) { var t = ""; return "en" == ga.lang ? "dropdown" == e.type ? t += "what you selected is not an option in the drop-down list" : "checkbox" == e.type || ("number" == e.type || "number_integer" == e.type || "number_decimal" == e.type ? (t += "what you entered is not a " + this.optionLabel_en[e.type] + " " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "text_content" == e.type ? t += "what you entered is not text that " + this.optionLabel_en[e.type2] + " " + e.value1 : "text_length" == e.type ? (t += "the text you entered is not length " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "date" == e.type ? (t += "the date you entered is not " + this.optionLabel_en[e.type2] + " " + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += " and " + e.value2)) : "validity" == e.type && (t += "what you entered is not a correct " + this.optionLabel_en[e.type2])) : "dropdown" == e.type ? t += "你选择的不是下拉列表中的选项" : "checkbox" == e.type || ("number" == e.type || "number_integer" == e.type || "number_decimal" == e.type ? (t += "你输入的不是" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的" + this.optionLabel[e.type]) : "text_content" == e.type ? t += "你输入的不是内容" + this.optionLabel[e.type2] + e.value1 + "的文本" : "text_length" == e.type ? (t += "你输入的不是长度" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的文本") : "date" == e.type ? (t += "你输入的不是" + this.optionLabel[e.type2] + e.value1, "bw" != e.type2 && "nb" != e.type2 || (t += "和" + e.value2 + "之间"), t += "的日期") : "validity" == e.type && (t += "你输入的不是一个正确的" + this.optionLabel[e.type2])), t }, validateCellData: function (e, t) { var a = t.type, r = t.type2, n = t.value1, l = t.value2; if ("dropdown" == a) { for (var i = this.getDropdownList(n), o = !1, s = 0; s < i.length; s++)if (i[s] == e) { o = !0; break } return o } if ("checkbox" == a); else if ("number" == a || "number_integer" == a || "number_decimal" == a) { if (!ba(e)) return !1; if (e = Number(e), "number_integer" == a && e % 1 != 0) return !1; if ("number_decimal" == a && e % 1 == 0) return !1; if (n = Number(n), l = Number(l), "bw" == r && (e < n || e > l)) return !1; if ("nb" == r && e >= n && e <= l) return !1; if ("eq" == r && e != n) return !1; if ("ne" == r && e == n) return !1; if ("gt" == r && e <= n) return !1; if ("lt" == r && e >= n) return !1; if ("gte" == r && e < n) return !1; if ("lte" == r && e > n) return !1 } else if ("text_content" == a) { if (e = e.toString(), n = n.toString(), "include" == r && -1 == e.indexOf(n)) return !1; if ("exclude" == r && e.indexOf(n) > -1) return !1; if ("equal" == r && e != n) return !1 } else if ("text_length" == a) { if (e = e.toString().length, n = Number(n), l = Number(l), "bw" == r && (e < n || e > l)) return !1; if ("nb" == r && e >= n && e <= l) return !1; if ("eq" == r && e != n) return !1; if ("ne" == r && e == n) return !1; if ("gt" == r && e <= n) return !1; if ("lt" == r && e >= n) return !1; if ("gte" == r && e < n) return !1; if ("lte" == r && e > n) return !1 } else if ("date" == a) { if (!ds(e)) return !1; if ("bw" == r && (hs(e, n) < 0 || hs(e, l) > 0)) return !1; if ("nb" == r && hs(e, n) >= 0 && hs(e, l) <= 0) return !1; if ("eq" == r && 0 != hs(e, n)) return !1; if ("ne" == r && 0 == hs(e, n)) return !1; if ("bf" == r && hs(e, n) >= 0) return !1; if ("nbf" == r && hs(e, n) < 0) return !1; if ("af" == r && hs(e, n) <= 0) return !1; if ("naf" == r && hs(e, n) > 0) return !1 } else if ("validity" == a) { if ("card" == r && !/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(e)) return !1; if ("phone" == r && !/^[1][3,4,5,7,8][0-9]{9}$/.test(e)) return !1 } return !0 }, dropdownListShow: function () { $("#luckysheet-dataVerification-showHintBox").hide(); var e = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], t = e.row_focus, a = e.column_focus, r = ga.visibledatarow[t], n = 0 == t ? 0 : ga.visibledatarow[t - 1], l = ga.visibledatacolumn[a], i = 0 == a ? 0 : ga.visibledatacolumn[a - 1], o = xm.mergeborer(ga.flowdata, t, a); o && (r = o.row[1], n = o.row[0], l = o.column[1], i = o.column[0]); var s = this.dataVerification[t + "_" + a], c = this.getDropdownList(s.value1), u = ""; c.forEach((function (e) { u += '<div class="dropdown-List-item luckysheet-mousedown-cancel">'.concat(e, "</div>") })), $("#luckysheet-dataVerification-dropdown-List").html(u).prop("data-index", t + "_" + a).show().css({ width: l - i - 1, left: i, top: r }); var d = $("#luckysheet-dataVerification-dropdown-List").outerHeight(); r + d > $("#luckysheet-cell-main")[0].scrollHeight - 42 - 6 && $("#luckysheet-dataVerification-dropdown-List").css({ top: n - d }) }, getDropdownList: function (e) { var t = []; if (Ih.iscelldata(e)) { for (var a = Ih.getcellrange(e), r = ga.luckysheetfile[_l(a.sheetIndex)].data, n = a.row[0]; n <= a.row[1]; n++)for (var l = a.column[0]; l <= a.column[1]; l++)if (null != r[n]) { var i = r[n][l]; if (null != i && null != i.v) { var o = i.m || i.v; t.includes(o) || t.push(o) } } } else for (var s = e.split(","), c = 0; c < s.length; c++) { var u = s[c]; 0 != u.length && (t.includes(u) || t.push(u)) } return t }, checkboxChange: function (e, t) { var a = $.extend(!0, {}, this.dataVerification), r = $.extend(!0, {}, this.dataVerification), n = r[e + "_" + t]; n.checked = !n.checked; var l = n.value2; n.checked && (l = n.value1); var i = rs.deepCopyFlowData(ga.flowdata); Cs(e, t, i, l), this.refOfCheckbox(a, r, ga.currentSheetIndex, i, { row: [e, e], column: [t, t] }) }, ref: function (e, t, a) { if (ga.clearjfundo) { ga.jfundo.length = 0; var r = { type: "updateDataVerification" }; r.sheetIndex = a, r.historyDataVerification = e, r.currentDataVerification = t, ga.jfredo.push(r) } this.dataVerification = t, ga.luckysheetfile[_l(a)].dataVerification = t, pd.allowUpdate && pd.saveParam("all", a, t, { k: "dataVerification" }), setTimeout((function () { md() }), 1) }, refOfCheckbox: function (e, t, a, r, n) { if (ga.clearjfundo) { ga.jfundo.length = 0; var l = { type: "updateDataVerificationOfCheckbox" }; l.sheetIndex = a, l.historyDataVerification = e, l.currentDataVerification = t, l.data = ga.flowdata, l.curData = r, l.range = n, ga.jfredo.push(l) } this.dataVerification = t, ga.luckysheetfile[_l(a)].dataVerification = t, ga.flowdata = r, rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(a)].data = ga.flowdata, pd.allowUpdate && (pd.saveParam("all", a, t, { k: "dataVerification" }), pd.historyParam(ga.flowdata, a, n)), setTimeout((function () { md() }), 1) } }; function qc(e, t, a, r, n) { if (n = n || ga.currentSheetIndex, ("row" != e || bu(n, "insertRows")) && ("column" != e || bu(n, "insertColumns"))) { var l = _l(n), i = ga.luckysheetfile[l], o = $.extend(!0, [], i.data); a = Math.floor(a); var s = $.extend(!0, {}, i.config); null == s.merge && (s.merge = {}); var c = {}; for (var u in s.merge) { var d = s.merge[u], h = d.r, m = d.c, p = d.rs, f = d.cs; "row" == e ? t < h ? c[h + a + "_" + m] = { r: h + a, c: m, rs: p, cs: f } : t == h ? "lefttop" == r ? c[h + a + "_" + m] = { r: h + a, c: m, rs: p, cs: f } : c[h + "_" + m] = { r: h, c: m, rs: p + a, cs: f } : c[h + "_" + m] = t < h + p - 1 || t == h + p - 1 && "lefttop" == r ? { r: h, c: m, rs: p + a, cs: f } : { r: h, c: m, rs: p, cs: f } : "column" == e && (t < m ? c[h + "_" + (m + a)] = { r: h, c: m + a, rs: p, cs: f } : t == m ? "lefttop" == r ? c[h + "_" + (m + a)] = { r: h, c: m + a, rs: p, cs: f } : c[h + "_" + m] = { r: h, c: m, rs: p, cs: f + a } : c[h + "_" + m] = t < m + f - 1 || t == m + f - 1 && "lefttop" == r ? { r: h, c: m, rs: p, cs: f + a } : { r: h, c: m, rs: p, cs: f }) } s.merge = c; var g = i.calcChain, v = []; if (null != g && g.length > 0) for (var y = 0; y < g.length; y++) { var b = $.extend(!0, {}, g[y]), k = b.r, x = b.c, w = Qo(k, x, b.index); if ("row" == e) { var _ = "=" + Ih.functionStrChange(w, "add", "row", r, t, a); o[k][x] && o[k][x].f == w && (o[k][x].f = _), "lefttop" == r ? k >= t && (b.r += a) : "rightbottom" == r && k > t && (b.r += a), v.push(b) } else if ("column" == e) { var C = "=" + Ih.functionStrChange(w, "add", "col", r, t, a); o[k][x] && o[k][x].f == w && (o[k][x].f = C), "lefttop" == r ? x >= t && (b.c += a) : "rightbottom" == r && x > t && (b.c += a), v.push(b) } } var T = i.filter_select, A = i.filter, S = null; if (null != T && "{}" != JSON.stringify(T)) { S = { filter_select: null, filter: null }; var I = T.row[0], R = T.row[1], q = T.column[0], D = T.column[1]; if ("row" == e) { if (I < t ? (R == t && "lefttop" == r || R > t) && (R += a) : I == t ? "lefttop" == r ? (I += a, R += a) : "rightbottom" == r && R > t && (R += a) : (I += a, R += a), null != A) for (var F in S.filter = {}, A) { var E = A[F].rowhidden, M = {}; for (var N in E) (N = parseFloat(N)) < t ? M[N] = 0 : N == t ? "lefttop" == r ? M[N + a] = 0 : "rightbottom" == r && (M[N] = 0) : M[N + a] = 0; S.filter[F] = $.extend(!0, {}, A[F]), S.filter[F].rowhidden = M, S.filter[F].str = I, S.filter[F].edr = R } } else if ("column" == e && (q < t ? (D == t && "lefttop" == r || D > t) && (D += a) : q == t ? "lefttop" == r ? (q += a, D += a) : "rightbottom" == r && D > t && (D += a) : (q += a, D += a), null != A)) for (var P in S.filter = {}, A) { var z = A[P].cindex; (z == t && "lefttop" == r || z > t) && (z += a), S.filter[z - q] = $.extend(!0, {}, A[P]), S.filter[z - q].cindex = z, S.filter[z - q].stc = q, S.filter[z - q].edc = D } S.filter_select = { row: [I, R], column: [q, D] } } if (null != S && null != S.filter) for (var L in null == s.rowhidden && (s.rowhidden = {}), S.filter) { var O = S.filter[L].rowhidden; for (var B in O) s.rowhidden[B] = 0 } var V = i.luckysheet_conditionformat_save, H = []; if (null != V && V.length > 0) for (var U = 0; U < V.length; U++) { for (var j = V[U].cellrange, G = [], W = 0; W < j.length; W++) { var Y = j[W].row[0], X = j[W].row[1], K = j[W].column[0], Z = j[W].column[1]; "row" == e ? Y < t ? (X == t && "lefttop" == r || X > t) && (X += a) : Y == t ? "lefttop" == r ? (Y += a, X += a) : "rightbottom" == r && X > t && (X += a) : (Y += a, X += a) : "column" == e && (K < t ? (Z == t && "lefttop" == r || Z > t) && (Z += a) : K == t ? "lefttop" == r ? (K += a, Z += a) : "rightbottom" == r && Z > t && (Z += a) : (K += a, Z += a)), G.push({ row: [Y, X], column: [K, Z] }) } var Q = $.extend(!0, {}, V[U]); Q.cellrange = G, H.push(Q) } var J = i.luckysheet_alternateformat_save, ee = []; if (null != J && J.length > 0) for (var te = 0; te < J.length; te++) { var ae = J[te].cellrange.row[0], re = J[te].cellrange.row[1], ne = J[te].cellrange.column[0], le = J[te].cellrange.column[1], ie = $.extend(!0, {}, J[te]); "row" == e ? ae < t ? (re == t && "lefttop" == r || re > t) && (re += a) : ae == t ? "lefttop" == r ? (ae += a, re += a) : "rightbottom" == r && re > t && (re += a) : (ae += a, re += a) : "column" == e && (ne < t ? (le == t && "lefttop" == r || le > t) && (le += a) : ne == t ? "lefttop" == r ? (ne += a, le += a) : "rightbottom" == r && le > t && (le += a) : (ne += a, le += a)), ie.cellrange = { row: [ae, re], column: [ne, le] }, ee.push(ie) } var oe = { freezenhorizontaldata: null, freezenverticaldata: null }; if (null != Bc.freezenhorizontaldata && "row" == e) { var se = Bc.freezenhorizontaldata[2], ce = Bc.freezenhorizontaldata[1] - 1; (ce == t && "lefttop" == r || ce > t) && (ce += a); var ue = ga.visibledatarow[ce] - 2 - se + ga.columnHeaderHeight; oe.freezenhorizontaldata = [ga.visibledatarow[ce], ce + 1, se, Bc.cutVolumn(ga.visibledatarow, ce + 1), ue] } else oe.freezenhorizontaldata = Bc.freezenhorizontaldata; if (null != Bc.freezenverticaldata && "column" == e) { var de = Bc.freezenverticaldata[2], he = Bc.freezenverticaldata[1] - 1; (he == t && "lefttop" == r || he > t) && (he += a); var me = ga.visibledatacolumn[he] - 2 - de + ga.rowHeaderWidth; oe.freezenverticaldata = [ga.visibledatacolumn[he], he + 1, de, Bc.cutVolumn(ga.visibledatacolumn, he + 1), me] } else oe.freezenverticaldata = Bc.freezenverticaldata; var pe = i.dataVerification, fe = {}; if (null != pe) for (var ge in pe) { var ve = Number(ge.split("_")[0]), ye = Number(ge.split("_")[1]), be = pe[ge]; if ("row" == e) if (t < ve) fe[ve + a + "_" + ye] = be; else if (t == ve) if ("lefttop" == r) { fe[ve + a + "_" + ye] = be; for (var ke = 0; ke < a; ke++)fe[ve + ke + "_" + ye] = be } else { fe[ve + "_" + ye] = be; for (var xe = 0; xe < a; xe++)fe[ve + xe + 1 + "_" + ye] = be } else fe[ve + "_" + ye] = be; else if ("column" == e) if (t < ye) fe[ve + "_" + (ye + a)] = be; else if (t == ye) if ("lefttop" == r) { fe[ve + "_" + (ye + a)] = be; for (var we = 0; we < a; we++)fe[ve + "_" + (ye + we)] = be } else { fe[ve + "_" + ye] = be; for (var _e = 0; _e < a; _e++)fe[ve + "_" + (ye + _e + 1)] = be } else fe[ve + "_" + ye] = be } var Ce, Te = i.hyperlink, Ae = {}; if (null != Te) for (var Se in Te) { var Ie = Number(Se.split("_")[0]), Re = Number(Se.split("_")[1]), $e = Te[Se]; "row" == e ? t < Ie || t == Ie && "lefttop" == r ? Ae[Ie + a + "_" + Re] = $e : Ae[Ie + "_" + Re] = $e : "column" == e && (t < Re || t == Re && "lefttop" == r ? Ae[Ie + "_" + (Re + a)] = $e : Ae[Ie + "_" + Re] = $e) } if ("row" == e) { if (Ce = "r", null != s.rowlen) { var qe = {}; for (var De in s.rowlen) (De = parseFloat(De)) < t ? qe[De] = s.rowlen[De] : De == t ? "lefttop" == r ? qe[De + a] = s.rowlen[De] : "rightbottom" == r && (qe[De] = s.rowlen[De]) : qe[De + a] = s.rowlen[De]; s.rowlen = qe } if (null != s.rowhidden) { var Fe = {}; for (var Ee in s.rowhidden) (Ee = parseFloat(Ee)) < t ? Fe[Ee] = s.rowhidden[Ee] : Ee == t ? "lefttop" == r ? Fe[Ee + a] = s.rowhidden[Ee] : "rightbottom" == r && (Fe[Ee] = s.rowhidden[Ee]) : Fe[Ee + a] = s.rowhidden[Ee]; s.rowhidden = Fe } for (var Me = [], Ne = 0; Ne < o[0].length; Ne++)Me.push(null); if (s.borderInfo && s.borderInfo.length > 0) { for (var Pe = [], ze = 0; ze < s.borderInfo.length; ze++) { var Le = s.borderInfo[ze].rangeType; if ("range" == Le) { for (var Oe = s.borderInfo[ze].range, Be = [], Ve = 0; Ve < Oe.length; Ve++) { var He = Oe[Ve].row[0], Ue = Oe[Ve].row[1]; "lefttop" == r ? t <= He ? (He += a, Ue += a) : t <= Ue && (Ue += a) : t < He ? (He += a, Ue += a) : t < Ue && (Ue += a), Ue >= He && Be.push({ row: [He, Ue], column: Oe[Ve].column }) } if (Be.length > 0) { var je = { rangeType: "range", borderType: s.borderInfo[ze].borderType, style: s.borderInfo[ze].style, color: s.borderInfo[ze].color, range: Be }; Pe.push(je) } } else if ("cell" == Le) { var Ge = s.borderInfo[ze].value.row_index; "lefttop" == r ? t <= Ge && (Ge += a) : t < Ge && (Ge += a), s.borderInfo[ze].value.row_index = Ge, Pe.push(s.borderInfo[ze]) } } s.borderInfo = Pe } for (var We = [], Ye = 0; Ye < a; Ye++)We.push(JSON.stringify(Me)); "lefttop" == r ? 0 == t ? new Function("d", "return d.unshift(" + We.join(",") + ")")(o) : new Function("d", "return d.splice(" + t + ", 0, " + We.join(",") + ")")(o) : new Function("d", "return d.splice(" + (t + 1) + ", 0, " + We.join(",") + ")")(o) } else { if (Ce = "c", null != s.columnlen) { var Xe = {}; for (var Ke in s.columnlen) (Ke = parseFloat(Ke)) < t ? Xe[Ke] = s.columnlen[Ke] : Ke == t ? "lefttop" == r ? Xe[Ke + a] = s.columnlen[Ke] : "rightbottom" == r && (Xe[Ke] = s.columnlen[Ke]) : Xe[Ke + a] = s.columnlen[Ke]; s.columnlen = Xe } if (null != s.colhidden) { var Ze = {}; for (var Qe in s.colhidden) (Qe = parseFloat(Qe)) < t ? Ze[Qe] = s.colhidden[Qe] : Qe == t ? "lefttop" == r ? Ze[Qe + a] = s.colhidden[Qe] : "rightbottom" == r && (Ze[Qe] = s.colhidden[Qe]) : Ze[Qe + a] = s.colhidden[Qe]; s.colhidden = Ze } for (var Je = [], et = 0; et < o.length; et++)Je.push(null); if (s.borderInfo && s.borderInfo.length > 0) { for (var tt = [], at = 0; at < s.borderInfo.length; at++) { var rt = s.borderInfo[at].rangeType; if ("range" == rt) { for (var nt = s.borderInfo[at].range, lt = [], it = 0; it < nt.length; it++) { var ot = nt[it].column[0], st = nt[it].column[1]; "lefttop" == r ? t <= ot ? (ot += a, st += a) : t <= st && (st += a) : t < ot ? (ot += a, st += a) : t < st && (st += a), st >= ot && lt.push({ row: nt[it].row, column: [ot, st] }) } if (lt.length > 0) { var ct = { rangeType: "range", borderType: s.borderInfo[at].borderType, style: s.borderInfo[at].style, color: s.borderInfo[at].color, range: lt }; tt.push(ct) } } else if ("cell" == rt) { var ut = s.borderInfo[at].value.col_index; "lefttop" == r ? t <= ut && (ut += a) : t < ut && (ut += a), s.borderInfo[at].value.col_index = ut, tt.push(s.borderInfo[at]) } } s.borderInfo = tt } for (var dt = 0; dt < o.length; dt++)for (var ht = o[dt], mt = 0; mt < a; mt++)"lefttop" == r ? 0 == t ? ht.unshift(Je[dt]) : ht.splice(t, 0, Je[dt]) : ht.splice(t + 1, 0, Je[dt]) } i.index == ga.currentSheetIndex ? cd(o, s, "addRC", { index: t, len: a, direction: r, rc: Ce, restore: !1 }, v, S, H, ee, oe, fe, Ae) : (i.data = o, i.config = s, i.calcChain = v, i.filter = S.filter, i.filter_select = S.filter_select, i.luckysheet_conditionformat_save = H, i.luckysheet_alternateformat_save = ee, i.dataVerification = fe, i.hyperlink = Ae); var pt = null; if (pt = "row" == e ? "lefttop" == r ? [{ row: [t, t + a - 1], column: [0, o[0].length - 1] }] : [{ row: [t + 1, t + a], column: [0, o[0].length - 1] }] : "lefttop" == r ? [{ row: [0, o.length - 1], column: [t, t + a - 1] }] : [{ row: [0, o.length - 1], column: [t + 1, t + a] }], i.luckysheet_select_save = pt, i.index == ga.currentSheetIndex && (ga.luckysheet_select_save = pt, Rh()), "row" == e) { $("#luckysheet-cell-main").scrollLeft(); var ft = $("#luckysheet-cell-main").scrollTop(), gt = $("#luckysheet-cell-main").height(), vt = ($("#luckysheet-cell-main").width(), ga.visibledatarow[pt[0].row[1]]), yt = pt[0].row[0] - 1 == -1 ? 0 : ga.visibledatarow[pt[0].row[0] - 1]; vt - ft - gt + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(vt - gt + 20) : yt - ft - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(yt - 20), a > 30 && ($("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide()) } } } function Dc(e, t, a, r) { if (r = r || ga.currentSheetIndex, ("row" != e || bu(r, "deleteRows")) && ("column" != e || bu(r, "deleteColumns"))) { var n = _l(r), l = ga.luckysheetfile[n], i = $.extend(!0, [], l.data); if (t < 0 && (t = 0), a < 0 && (a = 0), "row" == e ? (t > i.length - 1 && (t = i.length - 1), a > i.length - 1 && (a = i.length - 1)) : (t > i[0].length - 1 && (t = i[0].length - 1), a > i[0].length - 1 && (a = i[0].length - 1)), !(t > a)) { var o = a - t + 1, s = $.extend(!0, {}, l.config); null == s.merge && (s.merge = {}); var c = {}; for (var u in s.merge) { var d = s.merge[u], h = d.r, m = d.c, p = d.rs, f = d.cs; "row" == e ? h < t ? h + p - 1 < t ? c[h + "_" + m] = { r: h, c: m, rs: p, cs: f } : h + p - 1 >= t && h + p - 1 < a ? c[h + "_" + m] = { r: h, c: m, rs: t - h, cs: f } : h + p - 1 >= a && (c[h + "_" + m] = { r: h, c: m, rs: p - o, cs: f }) : h >= t && h <= a ? h + p - 1 > a && (c[t + "_" + m] = { r: t, c: m, rs: h + p - 1 - a, cs: f }) : h > a && (c[h - o + "_" + m] = { r: h - o, c: m, rs: p, cs: f }) : "column" == e && (m < t ? m + f - 1 < t ? c[h + "_" + m] = { r: h, c: m, rs: p, cs: f } : m + f - 1 >= t && m + f - 1 < a ? c[h + "_" + m] = { r: h, c: m, rs: p, cs: t - m } : m + f - 1 >= a && (c[h + "_" + m] = { r: h, c: m, rs: p, cs: f - o }) : m >= t && m <= a ? m + f - 1 > a && (c[h + "_" + t] = { r: h, c: t, rs: p, cs: m + f - 1 - a }) : m > a && (c[h + "_" + (m - o)] = { r: h, c: m - o, rs: p, cs: f })) } s.merge = c; var g = l.calcChain, v = []; if (null != g && g.length > 0) for (var y = 0; y < g.length; y++) { var b = $.extend(!0, {}, g[y]), k = b.r, x = b.c, w = Qo(k, x, b.index); if ("row" == e) { if (k < t || k > a) { var _ = "=" + Ih.functionStrChange(w, "del", "row", null, t, o); i[k][x] && i[k][x].f == w && (i[k][x].f = _), k > a && (b.r = k - o), v.push(b) } } else if ("column" == e && (x < t || x > a)) { var C = "=" + Ih.functionStrChange(w, "del", "col", null, t, o); i[k][x] && i[k][x].f == w && (i[k][x].f = C), x > a && (b.c = x - o), v.push(b) } } var T = l.filter_select, A = l.filter, S = null; if (null != T && "{}" != JSON.stringify(T)) { S = { filter_select: null, filter: null }; var I = T.row[0], R = T.row[1], q = T.column[0], D = T.column[1]; if ("row" == e) { if (I > a ? (I -= o, R -= o, S.filter_select = { row: [I, R], column: [q, D] }) : I < t && (R < t || (R <= a ? R = t - 1 : R -= o), S.filter_select = { row: [I, R], column: [q, D] }), null != S.filter_select && null != A) for (var F in A) { var E = A[F].rowhidden, M = {}; for (var N in E) N < t ? M[N] = 0 : N > a && (M[N - o] = 0); "{}" != JSON.stringify(M) && (null == S.filter && (S.filter = {}), S.filter[F] = $.extend(!0, {}, A[F]), S.filter[F].rowhidden = M, S.filter[F].str = I, S.filter[F].edr = R) } } else if ("column" == e && (q > a ? (q -= o, D -= o, S.filter_select = { row: [I, R], column: [q, D] }) : q < t ? (D < t || (D <= a ? D = t - 1 : D -= o), S.filter_select = { row: [I, R], column: [q, D] }) : D > a && (q = t, D -= o, S.filter_select = { row: [I, R], column: [q, D] }), null != S.filter_select && null != A)) for (var P in A) { var z = A[P].cindex; z < t ? (null == S.filter && (S.filter = {}), S.filter[z - q] = $.extend(!0, {}, A[P]), S.filter[z - q].edc = D) : z > a && (z -= o, null == S.filter && (S.filter = {}), S.filter[z - q] = $.extend(!0, {}, A[P]), S.filter[z - q].cindex = z, S.filter[z - q].stc = q, S.filter[z - q].edc = D) } } if (null != S && null != S.filter) for (var L in null == s.rowhidden && (s.rowhidden = {}), S.filter) { var O = S.filter[L].rowhidden; for (var B in O) s.rowhidden[B] = 0 } var V = l.luckysheet_conditionformat_save, H = []; if (null != V && V.length > 0) for (var U = 0; U < V.length; U++) { for (var j = V[U].cellrange, G = [], W = 0; W < j.length; W++) { var Y = j[W].row[0], X = j[W].row[1], K = j[W].column[0], Z = j[W].column[1]; "row" == e ? Y >= t && X <= a || (Y > a ? (Y -= o, X -= o) : Y < t ? X < t || (X <= a ? X = t - 1 : X -= o) : X > a && (Y = t, X -= o), G.push({ row: [Y, X], column: [K, Z] })) : "column" == e && (K >= t && Z <= a || (K > a ? (K -= o, Z -= o) : K < t ? Z < t || (Z <= a ? Z = t - 1 : Z -= o) : Z > a && (K = t, Z -= o), G.push({ row: [Y, X], column: [K, Z] }))) } if (G.length > 0) { var Q = $.extend(!0, {}, V[U]); Q.cellrange = G, H.push(Q) } } var J = l.luckysheet_alternateformat_save, ee = []; if (null != J && J.length > 0) for (var te = 0; te < J.length; te++) { var ae = J[te].cellrange.row[0], re = J[te].cellrange.row[1], ne = J[te].cellrange.column[0], le = J[te].cellrange.column[1]; if ("row" == e) { if (!(ae >= t && re <= a)) { var ie = $.extend(!0, {}, J[te]); ae > a ? (ae -= o, re -= o) : ae < t ? re < t || (re <= a ? re = t - 1 : re -= o) : re > a && (ae = t, re -= o), ie.cellrange = { row: [ae, re], column: [ne, le] }, ee.push(ie) } } else if ("column" == e && !(ne >= t && le <= a)) { var oe = $.extend(!0, {}, J[te]); ne > a ? (ne -= o, le -= o) : ne < t ? le < t || (le <= a ? le = t - 1 : le -= o) : le > a && (ne = t, le -= o), oe.cellrange = { row: [ae, re], column: [ne, le] }, ee.push(oe) } } var se = { freezenhorizontaldata: null, freezenverticaldata: null }; if (null != Bc.freezenhorizontaldata && "row" == e) { var ce = Bc.freezenhorizontaldata[2], ue = Ts(ga.visibledatarow, ce); -1 == ue && (ue = 0); var de = Bc.freezenhorizontaldata[1] - 1; de >= t && (de < a ? de = t - 1 : de -= o), de < ue && (de = ue); var he = ga.visibledatarow[de] - 2 - ce + ga.columnHeaderHeight; se.freezenhorizontaldata = [ga.visibledatarow[de], de + 1, ce, Bc.cutVolumn(ga.visibledatarow, de + 1), he] } else se.freezenhorizontaldata = Bc.freezenhorizontaldata; if (null != Bc.freezenverticaldata && "column" == e) { var me = Bc.freezenverticaldata[2], pe = Ts(ga.visibledatacolumn, me); -1 == pe && (pe = 0); var fe = Bc.freezenverticaldata[1] - 1; fe >= t && (fe < a ? fe = t - 1 : fe -= o), fe < pe && (fe = pe); var ge = ga.visibledatacolumn[fe] - 2 - me + ga.rowHeaderWidth; se.freezenverticaldata = [ga.visibledatacolumn[fe], fe + 1, me, Bc.cutVolumn(ga.visibledatacolumn, fe + 1), ge] } else se.freezenverticaldata = Bc.freezenverticaldata; var ve = l.dataVerification, ye = {}; if (null != ve) for (var be in ve) { var ke = Number(be.split("_")[0]), xe = Number(be.split("_")[1]), we = ve[be]; "row" == e ? ke < t ? ye[ke + "_" + xe] = we : ke > a && (ye[ke - o + "_" + xe] = we) : "column" == e && (xe < t ? ye[ke + "_" + xe] = we : xe > a && (ye[ke + "_" + (xe - o)] = we)) } var _e, Ce = l.hyperlink, Te = {}; if (null != Ce) for (var Ae in Ce) { var Se = Number(Ae.split("_")[0]), Ie = Number(Ae.split("_")[1]), Re = Ce[Ae]; "row" == e ? Se < t ? Te[Se + "_" + Ie] = Re : Se > a && (Te[Se - o + "_" + Ie] = Re) : "column" == e && (Ie < t ? Te[Se + "_" + Ie] = Re : Ie > a && (Te[Se + "_" + (Ie - o)] = Re)) } if ("row" == e) { _e = "r", null == s.rowlen && (s.rowlen = {}); var $e = {}; for (var qe in s.rowlen) qe < t ? $e[qe] = s.rowlen[qe] : qe > a && ($e[qe - o] = s.rowlen[qe]); s.rowlen = $e, null == s.rowhidden && (s.rowhidden = {}); var De = {}; for (var Fe in s.rowhidden) Fe < t ? De[Fe] = s.rowhidden[Fe] : Fe > a && (De[Fe - o] = s.rowhidden[Fe]); if (s.rowhidden = De, s.borderInfo && s.borderInfo.length > 0) { for (var Ee = [], Me = 0; Me < s.borderInfo.length; Me++) { var Ne = s.borderInfo[Me].rangeType; if ("range" == Ne) { for (var Pe = s.borderInfo[Me].range, ze = [], Le = 0; Le < Pe.length; Le++) { for (var Oe = Pe[Le].row[0], Be = Pe[Le].row[1], Ve = t; Ve <= a; Ve++)Ve < Pe[Le].row[0] ? (Oe -= 1, Be -= 1) : Ve <= Pe[Le].row[1] && (Be -= 1); Be >= Oe && ze.push({ row: [Oe, Be], column: Pe[Le].column }) } if (ze.length > 0) { var He = { rangeType: "range", borderType: s.borderInfo[Me].borderType, style: s.borderInfo[Me].style, color: s.borderInfo[Me].color, range: ze }; Ee.push(He) } } else if ("cell" == Ne) { var Ue = s.borderInfo[Me].value.row_index; Ue < t ? Ee.push(s.borderInfo[Me]) : Ue > a && (s.borderInfo[Me].value.row_index = Ue - (a - t + 1), Ee.push(s.borderInfo[Me])) } } s.borderInfo = Ee } i.splice(t, o); for (var je = 0; je < o; je++) { for (var Ge = [], We = 0; We < i[0].length; We++)Ge.push(null); i.push(Ge) } } else { _e = "c", null == s.columnlen && (s.columnlen = {}); var Ye = {}; for (var Xe in s.columnlen) Xe < t ? Ye[Xe] = s.columnlen[Xe] : Xe > a && (Ye[Xe - o] = s.columnlen[Xe]); s.columnlen = Ye, null == s.colhidden && (s.colhidden = {}); var Ke = {}; for (var Ze in s.colhidden) Ze < t ? Ke[Ze] = s.colhidden[Ze] : Ze > a && (Ke[Ze - o] = s.colhidden[Ze]); if (s.colhidden = Ke, s.borderInfo && s.borderInfo.length > 0) { for (var Qe = [], Je = 0; Je < s.borderInfo.length; Je++) { var et = s.borderInfo[Je].rangeType; if ("range" == et) { for (var tt = s.borderInfo[Je].range, at = [], rt = 0; rt < tt.length; rt++) { for (var nt = tt[rt].column[0], lt = tt[rt].column[1], it = t; it <= a; it++)it < tt[rt].column[0] ? (nt -= 1, lt -= 1) : it <= tt[rt].column[1] && (lt -= 1); lt >= nt && at.push({ row: tt[rt].row, column: [nt, lt] }) } if (at.length > 0) { var ot = { rangeType: "range", borderType: s.borderInfo[Je].borderType, style: s.borderInfo[Je].style, color: s.borderInfo[Je].color, range: at }; Qe.push(ot) } } else if ("cell" == et) { var st = s.borderInfo[Je].value.col_index; st < t ? Qe.push(s.borderInfo[Je]) : st > a && (s.borderInfo[Je].value.col_index = st - (a - t + 1), Qe.push(s.borderInfo[Je])) } } s.borderInfo = Qe } for (var ct = [], ut = 0; ut < o; ut++)ct.push(null); for (var dt = 0; dt < i.length; dt++) { var ht = [].concat(i[dt]); ht.splice(t, o), i[dt] = ht.concat(ct) } } l.index == ga.currentSheetIndex ? cd(i, s, "delRC", { index: t, len: a - t + 1, rc: _e }, v, S, H, ee, se, ye, Te) : (l.data = i, l.config = s, l.calcChain = v, l.filter = S.filter, l.filter_select = S.filter_select, l.luckysheet_conditionformat_save = H, l.luckysheet_alternateformat_save = ee, l.dataVerification = ye, l.hyperlink = Te) } } } function Fc(e, t, a, r, n, l) { if (hu(l = l || ga.currentSheetIndex)) { var i = _l(l), o = ga.luckysheetfile[i], s = $.extend(!0, [], o.data), c = a - t + 1, u = n - r + 1, d = $.extend(!0, {}, ga.config); null == d.merge && (d.merge = {}); var h = {}; for (var m in d.merge) { var p = d.merge[m], f = p.r, g = p.c, v = p.rs, y = p.cs; if ("moveLeft" == e) if (t > f + v - 1 || a < f || r > g + y - 1) h[f + "_" + g] = { r: f, c: g, rs: v, cs: y }; else if (t <= f && a >= f + v - 1 && n < g) h[f + "_" + (g - u)] = { r: f, c: g - u, rs: v, cs: y }; else for (var b = f; b <= f + v - 1; b++)for (var k = g; k <= g + y - 1; k++)delete s[b][k].mc; else if ("moveUp" == e) if (r > g + y - 1 || n < g || t > f + v - 1) h[f + "_" + g] = { r: f, c: g, rs: v, cs: y }; else if (r <= g && n >= g + y - 1 && a < f) h[f - c + "_" + g] = { r: f - c, c: g, rs: v, cs: y }; else for (var x = f; x <= f + v - 1; x++)for (var w = g; w <= g + y - 1; w++)delete s[x][w].mc } d.merge = h; var _ = o.calcChain, C = []; if (null != _ && _.length > 0) for (var T = 0; T < _.length; T++) { var A = $.extend(!0, {}, _[T]), S = A.r, I = A.c, R = Qo(S, I, A.index); if (S < t || S > a || I < r || I > n) { var q = void 0; "moveLeft" == e ? (q = "=" + Ih.functionStrChange(R, "del", "col", null, r, u), I > n && S >= t && S <= a && (A.c = I - u)) : "moveUp" == e && (q = "=" + Ih.functionStrChange(R, "del", "row", null, t, c), S > a && I >= r && I <= n && (A.r = S - c)), s[S][I] && s[S][I].f == R && (s[S][I].f = q), C.push(A) } } var D = o.filter_select, F = o.filter, E = null; if (null != D && "{}" != JSON.stringify(D)) { E = { filter_select: null, filter: null }; var M = D.row[0], N = D.row[1], P = D.column[0], z = D.column[1]; if ("moveUp" == e) if (P >= r && z <= n) { if (M > a ? E.filter_select = { row: [M - c, N - c], column: [P, z] } : N < t ? E.filter_select = { row: [M, N], column: [P, z] } : M < t && (E.filter_select = N > a ? { row: [M, N - c], column: [P, z] } : { row: [M, t - 1], column: [P, z] }), null != E.filter_select && null != F) for (var L in F) { var O = F[L].rowhidden, B = {}; for (var V in O) V < t ? B[V] = 0 : V > a && (B[V - slen] = 0); null == E.filter && (E.filter = {}), E.filter[L] = $.extend(!0, {}, F[L]), "{}" != JSON.stringify(B) && (E.filter[L].rowhidden = B), E.filter[L].str = E.filter_select.row[0], E.filter[L].edr = E.filter_select.row[1] } } else if (M >= t && N <= a) { if (P > n ? E.filter_select = { row: [M, N], column: [P, z] } : P >= r ? z > n && (E.filter_select = { row: [M, N], column: [r, z - u] }) : E.filter_select = z < r ? { row: [M, N], column: [P, z] } : z <= n ? { row: [M, N], column: [P, r - 1] } : { row: [M, N], column: [P, z - u] }, null != E.filter_select && null != F) for (var H in F) { var U = E.filter_select.column[0], j = E.filter_select.column[1], G = F[H].cindex; if (G < r || G > n) { null == E.filter && (E.filter = {}), G > n && (G -= u); var W = G - U; E.filter[W] = $.extend(!0, {}, F[H]), E.filter[W].cindex = G, E.filter[W].stc = U, E.filter[W].edc = j } } } else E.filter_select = { row: [M, N], column: [P, z] }, null != F && (E.filter = F); else if ("moveLeft" == e) if (M >= t && N <= a) { if (P > n ? E.filter_select = { row: [M, N], column: [P - u, z - u] } : z < r ? E.filter_select = { row: [M, N], column: [P, z] } : P < r && (E.filter_select = z > n ? { row: [M, N], column: [P, z - u] } : { row: [M, N], column: [P, r - 1] }), null != E.filter_select && null != F) for (var Y in F) { var X = E.filter_select.column[0], K = E.filter_select.column[1], Z = F[Y].cindex; if (Z < r || Z > n) { null == E.filter && (E.filter = {}), Z > n && (Z -= u); var Q = Z - X; E.filter[Q] = $.extend(!0, {}, F[Y]), E.filter[Q].cindex = Z, E.filter[Q].stc = X, E.filter[Q].edc = K } } } else P >= r && z <= n ? (M < t || M > a) && (E.filter_select = { row: [M, N], column: [P, z] }, null != F && (E.filter = F)) : (E.filter_select = { row: [M, N], column: [P, z] }, null != F && (E.filter = F)) } if (null != E && null != E.filter) for (var J in null == d.rowhidden && (d.rowhidden = {}), E.filter) { var ee = E.filter[J].rowhidden; for (var te in ee) d.rowhidden[te] = 0 } var ae = o.luckysheet_conditionformat_save, re = []; if (null != ae && ae.length > 0) for (var ne = 0; ne < ae.length; ne++) { for (var le = ae[ne].cellrange, ie = [], oe = 0; oe < le.length; oe++) { var se = le[oe].row[0], ce = le[oe].row[1], ue = le[oe].column[0], de = le[oe].column[1]; t <= se && a >= ce && r <= ue && n >= de || (ie = Ec(e, t, a, r, n, se, ce, ue, de, c, u)) } if (ie.length > 0) { var he = $.extend(!0, {}, ae[ne]); he.cellrange = ie, re.push(he) } } var me = o.dataVerification, pe = {}; if (null != me) for (var fe in me) { var ge = Number(fe.split("_")[0]), ve = Number(fe.split("_")[1]), ye = me[fe]; (ge < t || ge > a || ve < r || ve > n) && ("moveLeft" == e ? ve > n && ge >= t && ge <= a ? pe[ge + "_" + (ve - u)] = ye : pe[ge + "_" + ve] = ye : "moveUp" == e && (ge > a && ve >= r && ve <= n ? pe[ge - c + "_" + ve] = ye : pe[ge + "_" + ve] = ye)) } var be = o.hyperlink, ke = {}; if (null != be) for (var xe in be) { var we = Number(xe.split("_")[0]), _e = Number(xe.split("_")[1]), Ce = be[xe]; (we < t || we > a || _e < r || _e > n) && ("moveLeft" == e ? _e > n && we >= t && we <= a ? ke[we + "_" + (_e - u)] = Ce : ke[we + "_" + _e] = Ce : "moveUp" == e && (we > a && _e >= r && _e <= n ? ke[we - c + "_" + _e] = Ce : ke[we + "_" + _e] = Ce)) } if (d.borderInfo && d.borderInfo.length > 0) { for (var Te = [], Ae = 0; Ae < d.borderInfo.length; Ae++) { var Se = d.borderInfo[Ae].rangeType; if ("range" == Se) { for (var Ie = d.borderInfo[Ae].range, Re = [], $e = 0; $e < Ie.length; $e++) { var qe = Ie[$e].row[0], De = Ie[$e].row[1], Fe = Ie[$e].column[0], Ee = Ie[$e].column[1]; t <= qe && a >= De && r <= Fe && n >= Ee || (Re = Ec(e, t, a, r, n, qe, De, Fe, Ee, c, u)) } if (Re.length > 0) { var Me = { rangeType: "range", borderType: d.borderInfo[Ae].borderType, style: d.borderInfo[Ae].style, color: d.borderInfo[Ae].color, range: Re }; Te.push(Me) } } else if ("cell" == Se) { var Ne = d.borderInfo[Ae].value.row_index, Pe = d.borderInfo[Ae].value.col_index; (Ne < t || Ne > a || Pe < r || Pe > n) && ("moveLeft" == e ? Pe > n && Ne >= t && Ne <= a && (Pe -= u, d.borderInfo[Ae].value.col_index = Pe) : "moveUp" == e && Ne > a && Pe >= r && Pe <= n && (Ne -= c, d.borderInfo[Ae].value.row_index = Ne), Te.push(d.borderInfo[Ae])) } } d.borderInfo = Te } for (var ze = [], Le = r; Le <= n; Le++)ze.push(null); if ("moveUp" == e) { for (var Oe = [], Be = t; Be <= s.length - 1; Be++) { for (var Ve = [], He = r; He <= n; He++)Ve.push(s[Be][He]); Oe.push(Ve) } Oe.splice(0, c); for (var Ue = [], je = t; je <= a; je++)Ue.push(ze); Oe = Oe.concat(Ue); for (var Ge = t; Ge <= s.length - 1; Ge++)for (var We = r; We <= n; We++)s[Ge][We] = Oe[Ge - t][We - r] } else if ("moveLeft" == e) for (var Ye = t; Ye <= a; Ye++)s[Ye].splice(r, u), s[Ye] = s[Ye].concat(ze); o.index == ga.currentSheetIndex ? ud(s, d, { type: e, str: t, edr: a, stc: r, edc: n }, C, E, re, pe, ke) : (o.data = s, o.config = d, o.calcChain = C, o.filter = E.filter, o.filter_select = E.filter_select, o.luckysheet_conditionformat_save = re, o.dataVerification = pe, o.hyperlink = ke) } } function Ec(e, t, a, r, n, l, i, o, s, c, u) { var d = []; if ("moveLeft" == e) { if (t > i || a < l || r > s) d.push({ row: [l, i], column: [o, s] }); else if (n < o) { if (t <= l && a >= i) d.push({ row: [l, i], column: [o - u, s - u] }); else if (t > l && a < i) { var h = [{ row: [l, t - 1], column: [o, s] }, { row: [a + 1, i], column: [o, s] }, { row: [t, a], column: [o - u, s - u] }]; d = d.concat(h) } else if (t > l) { var m = [{ row: [l, t - 1], column: [o, s] }, { row: [t, i], column: [o - u, s - u] }]; d = d.concat(m) } else if (a < i) { var p = [{ row: [l, a], column: [o - u, s - u] }, { row: [a + 1, i], column: [o, s] }]; d = d.concat(p) } } else if (n >= o) if (r <= o && n >= s) { if (t > l && a < i) { var f = [{ row: [l, t - 1], column: [o, s] }, { row: [a + 1, i], column: [o, s] }]; d = d.concat(f) } else if (t > l) { var g = [{ row: [l, t - 1], column: [o, s] }]; d = d.concat(g) } else if (a < i) { var v = [{ row: [a + 1, i], column: [o, s] }]; d = d.concat(v) } } else if (r > o && n < s) { if (t <= l && a >= i) d.push({ row: [l, i], column: [o, s - u] }); else if (t > l && a < i) { var y = [{ row: [l, t - 1], column: [o, s] }, { row: [a + 1, i], column: [o, s] }, { row: [t, a], column: [o, s - u] }]; d = d.concat(y) } else if (t > l) { var b = [{ row: [l, t - 1], column: [o, s] }, { row: [t, i], column: [o, s - u] }]; d = d.concat(b) } else if (a < i) { var k = [{ row: [l, a], column: [o, s - u] }, { row: [a + 1, i], column: [o, s] }]; d = d.concat(k) } } else if (r > o) { if (t <= l && a >= i) d.push({ row: [l, i], column: [o, r - 1] }); else if (t > l && a < i) { var x = [{ row: [l, t - 1], column: [o, s] }, { row: [a + 1, i], column: [o, s] }, { row: [t, a], column: [o, r - 1] }]; d = d.concat(x) } else if (t > l) { var w = [{ row: [l, t - 1], column: [o, s] }, { row: [t, i], column: [o, r - 1] }]; d = d.concat(w) } else if (a < i) { var _ = [{ row: [l, a], column: [o, r - 1] }, { row: [a + 1, i], column: [o, s] }]; d = d.concat(_) } } else if (n < s) if (t <= l && a >= i) d.push({ row: [l, i], column: [o - u, s - u] }); else if (t > l && a < i) { var C = [{ row: [l, t - 1], column: [o, s] }, { row: [a + 1, i], column: [o, s] }, { row: [t, a], column: [o - u, s - u] }]; d = d.concat(C) } else if (t > l) { var T = [{ row: [l, t - 1], column: [o, s] }, { row: [t, i], column: [o - u, s - u] }]; d = d.concat(T) } else if (a < i) { var A = [{ row: [l, a], column: [o - u, s - u] }, { row: [a + 1, i], column: [o, s] }]; d = d.concat(A) } } else if ("moveUp" == e) if (r > s || n < o || t > i) d.push({ row: [l, i], column: [o, s] }); else if (a < l) { if (r <= o && n >= s) d.push({ row: [l - c, i - c], column: [o, s] }); else if (r > o && n < s) { var S = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i], column: [n + 1, s] }, { row: [l - c, i - c], column: [r, n] }]; d = d.concat(S) } else if (r > o) { var I = [{ row: [l, i], column: [o, r - 1] }, { row: [l - c, i - c], column: [r, s] }]; d = d.concat(I) } else if (n < s) { var R = [{ row: [l - c, i - c], column: [o, n] }, { row: [l, i], column: [n + 1, s] }]; d = d.concat(R) } } else if (a >= l) if (t <= l && a >= i) { if (r > o && n < s) { var $ = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i], column: [n + 1, s] }]; d = d.concat($) } else if (r > o) { var q = [{ row: [l, i], column: [o, r - 1] }]; d = d.concat(q) } else if (n < s) { var D = [{ row: [l, i], column: [n + 1, s] }]; d = d.concat(D) } } else if (t > l && a < i) { if (r <= o && n >= s) d.push({ row: [l, i - c], column: [o, s] }); else if (r > o && n < s) { var F = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i], column: [n + 1, s] }, { row: [l, i - c], column: [r, n] }]; d = d.concat(F) } else if (r > o) { var E = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i - c], column: [r, s] }]; d = d.concat(E) } else if (n < s) { var M = [{ row: [l, i - c], column: [o, n] }, { row: [l, i], column: [n + 1, s] }]; d = d.concat(M) } } else if (t > l) { if (r <= o && n >= s) d.push({ row: [l, t - 1], column: [o, s] }); else if (r > o && n < s) { var N = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i], column: [n + 1, s] }, { row: [l, t - 1], column: [r, n] }]; d = d.concat(N) } else if (r > o) { var P = [{ row: [l, i], column: [o, r - 1] }, { row: [l, t - 1], column: [r, s] }]; d = d.concat(P) } else if (n < s) { var z = [{ row: [l, t - 1], column: [o, n] }, { row: [l, i], column: [n + 1, s] }]; d = d.concat(z) } } else if (a < i) if (r <= o && n >= s) d.push({ row: [l - c, i - c], column: [o, s] }); else if (r > o && n < s) { var L = [{ row: [l, i], column: [o, r - 1] }, { row: [l, i], column: [n + 1, s] }, { row: [l - c, i - c], column: [r, n] }]; d = d.concat(L) } else if (r > o) { var O = [{ row: [l, i], column: [o, r - 1] }, { row: [l - c, i - c], column: [r, s] }]; d = d.concat(O) } else if (n < s) { var B = [{ row: [l - c, i - c], column: [o, n] }, { row: [l, i], column: [n + 1, s] }]; d = d.concat(B) } return d } var Mc = { defaultStore: { container: null, luckysheetfile: null, defaultcolumnNum: 60, defaultrowNum: 84, fullscreenmode: !0, devicePixelRatio: 1, currentSheetIndex: 0, calculateSheetIndex: 0, flowdata: [], config: {}, visibledatarow: [], visibledatacolumn: [], ch_width: 0, rh_height: 0, cellmainWidth: 0, cellmainHeight: 0, toolbarHeight: 0, infobarHeight: 0, calculatebarHeight: 0, rowHeaderWidth: 46, columnHeaderHeight: 20, cellMainSrollBarSize: 12, sheetBarHeight: 31, statisticBarHeight: 23, luckysheetTableContentHW: [0, 0], defaultcollen: 73, defaultrowlen: 19, jfcountfuncTimeout: null, jfautoscrollTimeout: null, luckysheet_select_status: !1, luckysheet_select_save: [{ row: [0, 0], column: [0, 0] }], luckysheet_selection_range: [], luckysheet_copy_save: {}, luckysheet_paste_iscut: !1, filterchage: !0, luckysheet_filter_save: { row: [], column: [] }, luckysheet_sheet_move_status: !1, luckysheet_sheet_move_data: [], luckysheet_scroll_status: !1, luckysheetisrefreshdetail: !0, luckysheetisrefreshtheme: !0, luckysheetcurrentisPivotTable: !1, luckysheet_rows_selected_status: !1, luckysheet_cols_selected_status: !1, luckysheet_rows_change_size: !1, luckysheet_rows_change_size_start: [], luckysheet_cols_change_size: !1, luckysheet_cols_change_size_start: [], luckysheet_cols_dbclick_timeout: null, luckysheet_cols_dbclick_times: 0, luckysheetCellUpdate: [], luckysheet_shiftpositon: null, iscopyself: !0, orderbyindex: 0, luckysheet_model_move_state: !1, luckysheet_model_xy: [0, 0], luckysheet_model_move_obj: null, luckysheet_cell_selected_move: !1, luckysheet_cell_selected_move_index: [], luckysheet_cell_selected_extend: !1, luckysheet_cell_selected_extend_index: [], luckysheet_cell_selected_extend_time: null, clearjfundo: !0, jfredo: [], jfundo: [], lang: "en", createChart: "", highlightChart: "", zIndex: 15, chartparam: { luckysheetCurrentChart: null, luckysheetCurrentChartActive: !1, luckysheetCurrentChartMove: null, luckysheetCurrentChartMoveTimeout: null, luckysheetCurrentChartMoveObj: null, luckysheetCurrentChartMoveXy: null, luckysheetCurrentChartMoveWinH: null, luckysheetCurrentChartMoveWinW: null, luckysheetCurrentChartResize: null, luckysheetCurrentChartResizeObj: null, luckysheetCurrentChartResizeXy: null, luckysheetCurrentChartResizeWinH: null, luckysheetCurrentChartResizeWinW: null, luckysheetInsertChartTosheetChange: !0, luckysheetCurrentChartZIndexRank: 100, luckysheet_chart_redo_click: !1, luckysheetCurrentChartMaxState: !1, jfrefreshchartall: "", changeChartCellData: "", renderChart: "", getChartJson: "" }, functionList: null, luckysheet_function: null, chart_selection: {}, currentChart: "", scrollRefreshSwitch: !0, measureTextCache: {}, measureTextCellInfoCache: {}, measureTextCacheTimeOut: null, cellOverflowMapCache: {}, zoomRatio: 1, visibledatacolumn_unique: null, visibledatarow_unique: null, showGridLines: !0, toobarObject: {}, inlineStringEditCache: null, inlineStringEditRange: null, fontList: [], currentSheetView: "viewNormal" }, defaultFormula: (Ic = { searchFunctionCell: null, functionlistPosition: {}, rangechangeindex: null, rangestart: !1, rangetosheet: null, rangeSetValueTo: null, func_selectedrange: {}, rangedrag_column_start: !1, rangedrag_row_start: !1, rangeResizeObj: null, rangeResize: null, rangeResizeIndex: null, rangeResizexy: null, rangeResizeWinH: null, rangeResizeWinW: null, rangeResizeTo: null, rangeMovexy: null, rangeMove: !1, rangeMoveObj: null, rangeMoveIndex: null, rangeMoveRangedata: null, functionHTMLIndex: 0, functionRangeIndex: null, execvertex: {}, execFunctionGroupData: null, execFunctionExist: null, formulaContainSheetList: {}, cellTextToIndexList: {}, isFunctionRangeSave: !1 }, Ia(Ic, "execvertex", {}), Ia(Ic, "execFunctionGroupData", null), Ia(Ic, "execFunctionExist", null), Ia(Ic, "formulaContainSheetList", {}), Ia(Ic, "formulaContainCellList", {}), Ia(Ic, "cellTextToIndexList", {}), Ia(Ic, "execFunctionGlobalData", {}), Ia(Ic, "groupValuesRefreshData", []), Ia(Ic, "functionResizeData", {}), Ia(Ic, "functionResizeStatus", !1), Ia(Ic, "functionResizeTimeout", null), Ia(Ic, "data_parm_index", 0), Ic), defaultSheet: { sheetMaxIndex: 0, nulldata: null, mergeCalculationSheet: {}, checkLoadSheetIndexToDataIndex: {}, CacheNotLoadControll: [] }, defaultPivotTable: { pivotDatas: null, pivotSheetIndex: 0, pivotDataSheetIndex: 0, celldata: null, origindata: null, pivot_data_type: {}, pivot_select_save: null, column: null, row: null, values: null, filter: null, showType: null, rowhidden: null, selected: null, caljs: null, initial: !0, filterparm: null, luckysheet_pivotTable_select_state: !1, jgridCurrentPivotInput: null, movestate: !1, moveitemposition: [], movesave: {}, drawPivotTable: !0, pivotTableBoundary: [12, 6] }, defaultImage: { imgItem: { type: "3", src: "", originWidth: null, originHeight: null, default: { width: null, height: null, left: null, top: null }, crop: { width: null, height: null, offsetLeft: 0, offsetTop: 0 }, isFixedPos: !1, fixedLeft: null, fixedTop: null, border: { width: 0, radius: 0, style: "solid", color: "#000" } }, images: null, currentImgId: null, currentWinW: null, currentWinH: null, resize: null, resizeXY: null, move: !1, moveXY: null, cropChange: null, cropChangeXY: null, cropChangeObj: null, copyImgItemObj: null }, defaultDataVerification: { defaultItem: { type: "dropdown", type2: null, value1: "", value2: "", checked: !1, remote: !1, prohibitInput: !1, hintShow: !1, hintText: "" }, curItem: null, dataVerification: null, selectRange: [], selectStatus: !1 } }, Nc = { addDataAjax: function (e, t, a, r) { null == a && (a = pd.loadSheetUrl), $("#luckysheet-grid-window-1").append(_n()), e.currentPage++; var n = sessionStorage.getItem("x-auth-token"); $.ajax({ method: "POST", url: a, headers: { "x-auth-token": n }, data: JSON.stringify(e), contentType: "application/json;charset=UTF-8", success: function (e) { "string" == typeof e && (e = JSON.parse(e)); var t = e.data, a = t.celldata; !function (e, t) { var a = rs.deepCopyFlowData(ga.flowdata), r = $.extend(!0, {}, ga.config); null == r.merge && (r.merge = {}); var n = Zo([], e, a[0].length); a = a.concat(n); for (var l = 0; l < t.length; l++) { var i = t[l].r, o = t[l].c, s = t[l].v; Cs(i, o, a, s), null != s && null != s.mc && null != s.mc.rs && (r.merge[s.mc.r + "_" + s.mc.c] = $.extend(!0, {}, s.mc)) } ga.flowdata = a, rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(ga.currentSheetIndex)].data = a, ga.config = r, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, hd(ga.flowdata.length, ga.flowdata[0].length) }(t.row, a), setTimeout((function () { $("#luckysheetloadingdata").fadeOut().remove() }), 500), r && "function" == typeof r && r(t) } }) }, reload: function (e, t, a, r) { null == t && (t = ga.currentSheetIndex), null == a && (a = pd.loadSheetUrl), $("#luckysheet-grid-window-1").append(_n()); var n = { gridKey: pd.gridKey, index: t }; e = $.extend(!0, e, n); var l = ga.luckysheetfile[_l(t)]; $.post(a, e, (function (e) { var a = new Function("return " + e)(); l.celldata = a[t.toString()]; var n = Sh.buildGridData(l); setTimeout((function () { $("#luckysheetloadingdata").fadeOut().remove() }), 500), l.data = n, ga.flowdata = n, rs.webWorkerFlowDataCache(n), function (e, t, a, r, n) { null == n && (n = !0), ga.visibledatarow = [], ga.visibledatacolumn = [], ga.ch_width = 0, ga.rh_height = 0, ga.zoomRatio = 1, ga.config = null != r ? r : {}, 0 == a.length ? ga.flowdata = Zo(a, t, e) : a.length < t && a[0].length < e ? ga.flowdata = Zo(a, t - a.length, e - a[0].length) : a.length < t ? ga.flowdata = Zo(a, t - a.length, 0) : a[0].length < e ? ga.flowdata = Zo(a, 0, e - a[0].length) : ga.flowdata = a, rs.webWorkerFlowDataCache(ga.flowdata), So(t, e), n && (Sh.showSheet(), setTimeout((function () { Sh.restoreCache(), Ih.execFunctionGroup(), Sh.restoreSheetAll(ga.currentSheetIndex), md() }), 1)) }(n[0].length, n.length, n, null, !1), l.load = "1", ga.luckysheet_select_save.length = 0, ga.luckysheet_selection_range = [], pd.saveParam("shs", null, ga.currentSheetIndex), Sh.changeSheet(t), r && "function" == typeof r && r() })) }, clearSheetByIndex: function (e) { var t = _l(e), a = ga.luckysheetfile[t]; a.isPivotTable ? delete ga.luckysheetfile[t] : (a.data = [], a.row = ga.defaultrowNum, a.column = ga.defaultcolumnNum, a.chart = [], a.config = null, a.filter = null, a.filter_select = null, a.celldata = [], a.pivotTable = {}, a.calcChain = [], a.status = 0, a.load = 0, ga.flowdata = [], rs.webWorkerFlowDataCache(ga.flowdata), $("#" + ga.container + " .luckysheet-data-visualization-chart").remove(), $("#" + ga.container + " .luckysheet-datavisual-selection-set").remove(), $("#luckysheet-row-count-show, #luckysheet-formula-functionrange-select, #luckysheet-row-count-show, #luckysheet-column-count-show, #luckysheet-change-size-line, #luckysheet-cell-selected-focus, #luckysheet-selection-copy, #luckysheet-cell-selected-extend, #luckysheet-cell-selected-move, #luckysheet-cell-selected").hide(), delete a.load) }, clear: function (e) { if ("all" == e) for (var t = 0; t < ga.luckysheetfile.length; t++) { var a = ga.luckysheetfile[t]; this.clearSheetByIndex(a.index) } else null == e && (e = ga.currentSheetIndex), this.clearSheetByIndex(e); Sh.changeSheet(ga.luckysheetfile[0].index) }, destroy: function () { $("#" + ga.container).empty(), $("body > .luckysheet-cols-menu").remove(), $("#luckysheet-modal-dialog-mask, #luckysheetTextSizeTest, #luckysheet-icon-morebtn-div").remove(), $("#luckysheet-input-box").parent().remove(), $("#luckysheet-formula-help-c").remove(), $(".chartSetting, .luckysheet-modal-dialog-slider").remove(), $(document).off(".luckysheetEvent"), $(document).off(".luckysheetProtection"), Bc.initialHorizontal = !0, Bc.initialVertical = !0; var e = $.extend(!0, {}, Mc.defaultStore); for (var t in e) t in ga && (ga[t] = e[t]); var a = $.extend(!0, {}, Mc.defaultFormula); for (var r in a) r in Ih && (Ih[r] = a[r]); var n = $.extend(!0, {}, Mc.defaultSheet); for (var l in n) l in Sh && (Sh[l] = n[l]); var i = $.extend(!0, {}, Mc.defaultPivotTable); for (var o in i) o in Ru && (Ru[o] = i[o]); var s = $.extend(!0, {}, Mc.defaultImage); for (var c in s) c in Rc && (Rc[c] = s[c]); var u = $.extend(!0, {}, Mc.defaultDataVerification); for (var d in u) d in $c && ($c[d] = u[d]); ga.asyncLoad = ["core"] }, editorChart: function (e) { var t = Cn[0], a = "luckysheetEditMode-datav-chart"; e.chart_id = a; var r = e.chartTheme; r = null == r ? "default0000" : r, luckysheet.insertChartTosheet(e.sheetIndex, e.dataSheetIndex, e.option, e.chartType, e.selfOption, e.defaultOption, e.row, e.column, t, a, "luckysheetEditMode-datav-chart_selection", e.chartStyle, e.rangeConfigCheck, e.rangeRowCheck, e.rangeColCheck, e.chartMarkConfig, e.chartTitleConfig, e.winWidth, e.winHeight, e.scrollLeft, e.scrollTop, r, e.myWidth, e.myHeight, null != e.myLeft ? parseFloat(e.myLeft) : null, null != e.myTop ? parseFloat(e.myTop) : null, e.myindexrank, !0), $("#" + a).find(".luckysheet-modal-controll-update").click() }, createHookFunction: function () { var e = arguments[0]; if (fa.hook && null != fa.hook[e] && "function" == typeof fa.hook[e]) { var t = Array.prototype.slice.apply(arguments); t.shift(); var a = fa.hook[e].apply(this, t); return !1 !== a } return !0 } }, Pc = { defaultWidth: 144, defaultHeight: 84, currentObj: null, currentWinW: null, currentWinH: null, resize: null, resizeXY: null, move: !1, moveXY: null, init: function () { var e = this; $("#luckysheet-postil-showBoxs").off("mousedown.showPs").on("mousedown.showPs", ".luckysheet-postil-show", (function (t) { bu(ga.currentSheetIndex, "editObjects", !1) && (e.currentObj = $(this).find(".luckysheet-postil-show-main"), $(this).hasClass("luckysheet-postil-show-active") || (e.removeActivePs(), $(this).addClass("luckysheet-postil-show-active"), $(this).find(".luckysheet-postil-dialog-resize").show(), $(this).find(".arrowCanvas").css("z-index", 200), $(this).find(".luckysheet-postil-show-main").css("z-index", 200)), t.stopPropagation()) })), $("#luckysheet-postil-showBoxs").off("mouseup.showPs").on("mouseup.showPs", ".luckysheet-postil-show", (function (e) { "3" == e.which && e.stopPropagation() })), $("#luckysheet-postil-showBoxs").off("mousedown.resize").on("mousedown.resize", ".luckysheet-postil-show .luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item", (function (t) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { e.currentObj = $(this).closest(".luckysheet-postil-show-main"), e.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth, e.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight, e.resize = $(this).data("type"); var a = $("#luckysheet-cell-main").scrollTop(), r = $("#luckysheet-cell-main").scrollLeft(), n = $s(t.pageX, t.pageY), l = n[0] + r, i = n[1] + a, o = e.currentObj.position(), s = e.currentObj.width(), c = e.currentObj.height(); e.resizeXY = [l, i, s, c, o.left + r, o.top + a, r, a], Il(!0), $(this).closest(".luckysheet-postil-show").hasClass("luckysheet-postil-show-active") || (e.removeActivePs(), $(this).closest(".luckysheet-postil-show").addClass("luckysheet-postil-show-active"), $(this).closest(".luckysheet-postil-show").find(".luckysheet-postil-dialog-resize").show(), $(this).closest(".luckysheet-postil-show").find(".arrowCanvas").css("z-index", 200), $(this).closest(".luckysheet-postil-show").find(".luckysheet-postil-show-main").css("z-index", 200)), t.stopPropagation() } })), $("#luckysheet-postil-showBoxs").off("mousedown.move").on("mousedown.move", ".luckysheet-postil-show .luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item", (function (t) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { e.currentObj = $(this).closest(".luckysheet-postil-show-main"), e.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth, e.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight, e.move = !0; var a = $("#luckysheet-cell-main").scrollTop(), r = $("#luckysheet-cell-main").scrollLeft(), n = e.currentObj.offset(), l = e.currentObj.position(); e.moveXY = [t.pageX - n.left, t.pageY - n.top, l.left, l.top, r, a], Il(!0), $(this).closest(".luckysheet-postil-show").hasClass("luckysheet-postil-show-active") || (e.removeActivePs(), $(this).closest(".luckysheet-postil-show").addClass("luckysheet-postil-show-active"), $(this).closest(".luckysheet-postil-show").find(".luckysheet-postil-dialog-resize").show(), $(this).closest(".luckysheet-postil-show").find(".arrowCanvas").css("z-index", 200), $(this).closest(".luckysheet-postil-show").find(".luckysheet-postil-show-main").css("z-index", 200)), t.stopPropagation() } })) }, overshow: function (e) { if ($("#luckysheet-postil-overshow").remove(), 0 != $(e.target).closest("#luckysheet-cell-main").length) { var t = $s(e.pageX, e.pageY), a = $("#luckysheet-cell-main").scrollLeft(), r = $("#luckysheet-cell-main").scrollTop(), n = t[0], l = t[1], i = 0, o = 0; null != Bc.freezenverticaldata && t[0] < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] ? i = a : n += a, null != Bc.freezenhorizontaldata && t[1] < Bc.freezenhorizontaldata[0] - Bc.freezenhorizontaldata[2] ? o = r : l += r; var s = Ss(l)[2], c = Rs(n)[2], u = xm.mergeborer(ga.flowdata, s, c); if (u && (s = u.row[2], c = u.column[2]), null != ga.flowdata[s] && null != ga.flowdata[s][c] && null != ga.flowdata[s][c].ps) { var d = ga.flowdata[s][c].ps; if (!(d.isshow || $("#luckysheet-postil-show_" + s + "_" + c).length > 0)) { var h = null == d.value ? "" : d.value, m = (ga.visibledatarow[s], s - 1 == -1 ? 0 : ga.visibledatarow[s - 1]), p = ga.visibledatacolumn[c]; c - 1 == -1 || ga.visibledatacolumn[c - 1]; u && (u.row[1], m = u.row[0], p = u.column[1], u.column[0]); var f = p + i, g = m + o, v = f + 18 * ga.zoomRatio, y = g - 18 * ga.zoomRatio; y < 0 && (y = 2); var b = this.defaultWidth * ga.zoomRatio, k = this.defaultHeight * ga.zoomRatio, x = this.getArrowCanvasSize(v, y, f, g), w = '<div id="luckysheet-postil-overshow"><canvas class="arrowCanvas" width="' + x[2] + '" height="' + x[3] + '" style="position:absolute;left:' + x[0] + "px;top:" + x[1] + 'px;z-index:100;pointer-events:none;"></canvas><div style="width:' + (b - 12) + "px;min-height:" + (k - 12) + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + v + "px;top:" + y + 'px;z-index:100;">' + this.htmlEscape(h) + "</div></div>"; $(w).appendTo($("#luckysheet-cell-main")); var _ = $("#luckysheet-postil-overshow .arrowCanvas").get(0).getContext("2d"); this.drawArrow(_, x[4], x[5], x[6], x[7]) } } } }, getArrowCanvasSize: function (e, t, a, r) { var n = a - 5; e < a && (n = e - 5); var l = r - 5; t < r && (l = t - 5); var i = Math.abs(e - a) + 10, o = Math.abs(t - r) + 10, s = i - 5, c = 5; e < a && (s = 5, c = i - 5); var u = o - 5, d = 5; return t < r && (u = 5, d = o - 5), [n, l, i, o, s, u, c, d] }, drawArrow: function (e, t, a, r, n, l, i, o, s) { l = "undefined" == Cm(l) ? 30 : l, i = "undefined" == Cm(i) ? 6 : i, o = "undefined" == Cm(o) ? 1 : o, s = "undefined" == Cm(s) ? "#000" : s; var c = 180 * Math.atan2(a - n, t - r) / Math.PI, u = (c + l) * Math.PI / 180, d = (c - l) * Math.PI / 180, h = i * Math.cos(u), m = i * Math.sin(u), p = i * Math.cos(d), f = i * Math.sin(d); e.save(), e.beginPath(); var g = t - h, v = a - m; e.moveTo(g, v), e.moveTo(t, a), e.lineTo(r, n), e.lineWidth = o, e.strokeStyle = s, e.stroke(), g = r + h, v = n + m, e.moveTo(g, v), e.lineTo(r, n), g = r + p, v = n + f, e.lineTo(g, v), e.fillStyle = s, e.fill(), e.restore() }, buildAllPs: function (e) { $("#luckysheet-cell-main #luckysheet-postil-showBoxs").empty(); for (var t = 0; t < e.length; t++)for (var a = 0; a < e[0].length; a++)if (null != e[t][a] && null != e[t][a].ps) { var r = e[t][a].ps; this.buildPs(t, a, r) } this.init() }, buildPs: function (e, t, a) { if ($("#luckysheet-postil-show_" + e + "_" + t).length > 0 && $("#luckysheet-postil-show_" + e + "_" + t).remove(), null != a) { if (null != a.isshow && a.isshow) { ga.visibledatarow[e]; var r = e - 1 == -1 ? 0 : ga.visibledatarow[e - 1], n = ga.visibledatacolumn[t], l = (t - 1 == -1 || ga.visibledatacolumn[t - 1], xm.mergeborer(ga.flowdata, e, t)); l && (l.row[1], r = l.row[0], n = l.column[1], l.column[0]); var i = n, o = r, s = null == a.left ? i + 18 * ga.zoomRatio : a.left * ga.zoomRatio, c = null == a.top ? o - 18 * ga.zoomRatio : a.top * ga.zoomRatio, u = null == a.width ? this.defaultWidth * ga.zoomRatio : a.width * ga.zoomRatio, d = null == a.height ? this.defaultHeight * ga.zoomRatio : a.height * ga.zoomRatio, h = null == a.value ? "" : a.value; c < 0 && (c = 2); var m = this.getArrowCanvasSize(s, c, i, o), p = '<div id="luckysheet-postil-show_' + e + "_" + t + '" class="luckysheet-postil-show"><canvas class="arrowCanvas" width="' + m[2] + '" height="' + m[3] + '" style="position:absolute;left:' + m[0] + "px;top:" + m[1] + 'px;z-index:100;pointer-events:none;"></canvas><div class="luckysheet-postil-show-main" style="width:' + u + "px;height:" + d + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + s + "px;top:" + c + 'px;box-sizing:border-box;z-index:100;"><div class="luckysheet-postil-dialog-move"><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t" data-type="t"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r" data-type="r"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b" data-type="b"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l" data-type="l"></div></div><div class="luckysheet-postil-dialog-resize" style="display:none;"><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt" data-type="lt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt" data-type="mt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm" data-type="lm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm" data-type="rm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt" data-type="rt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb" data-type="lb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb" data-type="mb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb" data-type="rb"></div></div><div style="width:100%;height:100%;overflow:hidden;"><div class="formulaInputFocus" style="width:' + (u - 12) + "px;height:" + (d - 12) + 'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;" spellcheck="false" contenteditable="true">' + this.htmlEscape(h) + "</div></div></div></div>"; $(p).appendTo($("#luckysheet-cell-main #luckysheet-postil-showBoxs")); var f = $("#luckysheet-postil-show_" + e + "_" + t + " .arrowCanvas").get(0).getContext("2d"); this.drawArrow(f, m[4], m[5], m[6], m[7]) } } }, newPs: function (e, t) { if (bu(ga.currentSheetIndex, "editObjects") && Nc.createHookFunction("commentInsertBefore", e, t)) { ga.visibledatarow[e]; var a = e - 1 == -1 ? 0 : ga.visibledatarow[e - 1], r = ga.visibledatacolumn[t], n = (t - 1 == -1 || ga.visibledatacolumn[t - 1], xm.mergeborer(ga.flowdata, e, t)); n && (n.row[1], a = n.row[0], r = n.column[1], n.column[0]); var l = r, i = a, o = l + 18 * ga.zoomRatio, s = i - 18 * ga.zoomRatio; s < 0 && (s = 2); var c = this.defaultWidth * ga.zoomRatio, u = this.defaultHeight * ga.zoomRatio, d = this.getArrowCanvasSize(o, s, l, i), h = '<div id="luckysheet-postil-show_' + e + "_" + t + '" class="luckysheet-postil-show luckysheet-postil-show-active"><canvas class="arrowCanvas" width="' + d[2] + '" height="' + d[3] + '" style="position:absolute;left:' + d[0] + "px;top:" + d[1] + 'px;z-index:100;pointer-events:none;"></canvas><div class="luckysheet-postil-show-main" style="width:' + c + "px;height:" + u + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + o + "px;top:" + s + 'px;box-sizing:border-box;z-index:100;"><div class="luckysheet-postil-dialog-move"><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t" data-type="t"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r" data-type="r"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b" data-type="b"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l" data-type="l"></div></div><div class="luckysheet-postil-dialog-resize"><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt" data-type="lt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt" data-type="mt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm" data-type="lm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm" data-type="rm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt" data-type="rt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb" data-type="lb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb" data-type="mb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb" data-type="rb"></div></div><div style="width:100%;height:100%;overflow:hidden;"><div class="formulaInputFocus" style="width:132px;height:72px;line-height:20px;box-sizing:border-box;text-align: center;word-break:break-all;" spellcheck="false" contenteditable="true"></div></div></div></div>'; $(h).appendTo($("#luckysheet-cell-main #luckysheet-postil-showBoxs")); var m = $("#luckysheet-postil-show_" + e + "_" + t + " .arrowCanvas").get(0).getContext("2d"); this.drawArrow(m, d[4], d[5], d[6], d[7]), $("#luckysheet-postil-show_" + e + "_" + t + " .formulaInputFocus").focus(), this.init(); var p = rs.deepCopyFlowData(ga.flowdata), f = []; null == p[e][t] && (p[e][t] = {}), p[e][t].ps = { left: null, top: null, width: null, height: null, value: "", isshow: !1 }, f.push(e + "_" + t), this.ref(p, f), setTimeout((function () { Nc.createHookFunction("commentInsertAfter", e, t, p[e][t]) }), 0) } }, editPs: function (e, t) { if (bu(ga.currentSheetIndex, "editObjects")) { if ($("#luckysheet-postil-show_" + e + "_" + t).length > 0) $("#luckysheet-postil-show_" + e + "_" + t).show(), $("#luckysheet-postil-show_" + e + "_" + t).addClass("luckysheet-postil-show-active"), $("#luckysheet-postil-show_" + e + "_" + t).find(".luckysheet-postil-dialog-resize").show(); else { var a = ga.flowdata[e][t].ps, r = (ga.visibledatarow[e], e - 1 == -1 ? 0 : ga.visibledatarow[e - 1]), n = ga.visibledatacolumn[t], l = (t - 1 == -1 || ga.visibledatacolumn[t - 1], xm.mergeborer(ga.flowdata, e, t)); l && (l.row[1], r = l.row[0], n = l.column[1], l.column[0]); var i = n, o = r, s = null == a.left ? i + 18 * ga.zoomRatio : a.left * ga.zoomRatio, c = null == a.top ? o - 18 * ga.zoomRatio : a.top * ga.zoomRatio, u = null == a.width ? this.defaultWidth * ga.zoomRatio : a.width * ga.zoomRatio, d = null == a.height ? this.defaultHeight * ga.zoomRatio : a.height * ga.zoomRatio, h = null == a.value ? "" : a.value; c < 0 && (c = 2); var m = this.getArrowCanvasSize(s, c, i, o), p = '<div id="luckysheet-postil-show_' + e + "_" + t + '" class="luckysheet-postil-show luckysheet-postil-show-active"><canvas class="arrowCanvas" width="' + m[2] + '" height="' + m[3] + '" style="position:absolute;left:' + m[0] + "px;top:" + m[1] + 'px;z-index:100;pointer-events:none;"></canvas><div class="luckysheet-postil-show-main" style="width:' + u + "px;height:" + d + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + s + "px;top:" + c + 'px;box-sizing:border-box;z-index:100;"><div class="luckysheet-postil-dialog-move"><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t" data-type="t"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r" data-type="r"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b" data-type="b"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l" data-type="l"></div></div><div class="luckysheet-postil-dialog-resize"><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt" data-type="lt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt" data-type="mt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm" data-type="lm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm" data-type="rm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt" data-type="rt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb" data-type="lb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb" data-type="mb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb" data-type="rb"></div></div><div style="width:100%;height:100%;overflow:hidden;"><div class="formulaInputFocus" style="width:' + (u - 12) + "px;height:" + (d - 12) + 'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;" spellcheck="false" contenteditable="true">' + this.htmlEscape(h) + "</div></div></div></div>"; $(p).appendTo($("#luckysheet-cell-main #luckysheet-postil-showBoxs")); var f = $("#luckysheet-postil-show_" + e + "_" + t + " .arrowCanvas").get(0).getContext("2d"); this.drawArrow(f, m[4], m[5], m[6], m[7]) } $("#luckysheet-postil-show_" + e + "_" + t + " .formulaInputFocus").focus(), qo($("#luckysheet-postil-show_" + e + "_" + t + " .formulaInputFocus").get(0)), this.init() } }, delPs: function (e, t) { if (bu(ga.currentSheetIndex, "editObjects") && Nc.createHookFunction("commentDeleteBefore", e, t, ga.flowdata[e][t])) { $("#luckysheet-postil-show_" + e + "_" + t).length > 0 && $("#luckysheet-postil-show_" + e + "_" + t).remove(); var a = rs.deepCopyFlowData(ga.flowdata), r = []; delete a[e][t].ps, r.push(e + "_" + t), this.ref(a, r), setTimeout((function () { Nc.createHookFunction("commentDeleteAfter", e, t, ga.flowdata[e][t]) }), 0) } }, showHidePs: function (e, t) { var a = ga.flowdata[e][t].ps, r = a.isshow, n = rs.deepCopyFlowData(ga.flowdata), l = []; if (r) n[e][t].ps.isshow = !1, $("#luckysheet-postil-show_" + e + "_" + t).remove(); else { n[e][t].ps.isshow = !0; ga.visibledatarow[e]; var i = e - 1 == -1 ? 0 : ga.visibledatarow[e - 1], o = ga.visibledatacolumn[t], s = (t - 1 == -1 || ga.visibledatacolumn[t - 1], xm.mergeborer(ga.flowdata, e, t)); s && (s.row[1], i = s.row[0], o = s.column[1], s.column[0]); var c = $("#luckysheet-cell-main").scrollLeft(), u = $("#luckysheet-cell-main").scrollTop(), d = o, h = i; null != Bc.freezenverticaldata && d < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] && (d += c), null != Bc.freezenhorizontaldata && h < Bc.freezenhorizontaldata[0] - Bc.freezenhorizontaldata[2] && (h += u); var m = null == a.left ? d + 18 * ga.zoomRatio : a.left * ga.zoomRatio, p = null == a.top ? h - 18 * ga.zoomRatio : a.top * ga.zoomRatio, f = null == a.width ? this.defaultWidth * ga.zoomRatio : a.width * ga.zoomRatio, g = null == a.height ? this.defaultHeight * ga.zoomRatio : a.height * ga.zoomRatio, v = null == a.value ? "" : a.value; p < 0 && (p = 2); var y = this.getArrowCanvasSize(m, p, d, h), b = '<div id="luckysheet-postil-show_' + e + "_" + t + '" class="luckysheet-postil-show"><canvas class="arrowCanvas" width="' + y[2] + '" height="' + y[3] + '" style="position:absolute;left:' + y[0] + "px;top:" + y[1] + 'px;z-index:100;pointer-events:none;"></canvas><div class="luckysheet-postil-show-main" style="width:' + f + "px;height:" + g + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + m + "px;top:" + p + 'px;box-sizing:border-box;z-index:100;"><div class="luckysheet-postil-dialog-move"><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t" data-type="t"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r" data-type="r"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b" data-type="b"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l" data-type="l"></div></div><div class="luckysheet-postil-dialog-resize" style="display:none;"><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt" data-type="lt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt" data-type="mt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm" data-type="lm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm" data-type="rm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt" data-type="rt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb" data-type="lb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb" data-type="mb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb" data-type="rb"></div></div><div style="width:100%;height:100%;overflow:hidden;"><div class="formulaInputFocus" style="width:' + (f - 12) + "px;height:" + (g - 12) + 'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;" spellcheck="false" contenteditable="true">' + this.htmlEscape(v) + "</div></div></div></div>"; $(b).appendTo($("#luckysheet-cell-main #luckysheet-postil-showBoxs")); var k = $("#luckysheet-postil-show_" + e + "_" + t + " .arrowCanvas").get(0).getContext("2d"); this.drawArrow(k, y[4], y[5], y[6], y[7]), this.init() } l.push(e + "_" + t), this.ref(n, l) }, showHideAllPs: function () { for (var e = rs.deepCopyFlowData(ga.flowdata), t = !0, a = [], r = 0; r < e.length; r++)for (var n = 0; n < e[0].length; n++)null != e[r] && null != e[r][n] && null != e[r][n].ps && (a.push(r + "_" + n), e[r][n].ps.isshow || (t = !1)); var l = []; if (a.length > 0) if (t) { $("#luckysheet-cell-main #luckysheet-postil-showBoxs").empty(); for (var i = 0; i < a.length; i++) { var o = a[i].split("_")[0], s = a[i].split("_")[1]; e[o][s].ps.isshow && (e[o][s].ps.isshow = !1, l.push(a[i])) } } else for (var c = 0; c < a.length; c++) { var u = a[c].split("_")[0], d = a[c].split("_")[1], h = e[u][d].ps; if (!h.isshow) { ga.visibledatarow[u]; var m = u - 1 == -1 ? 0 : ga.visibledatarow[u - 1], p = ga.visibledatacolumn[d], f = (d - 1 == -1 || ga.visibledatacolumn[d - 1], xm.mergeborer(ga.flowdata, u, d)); f && (f.row[1], m = f.row[0], p = f.column[1], f.column[0]); var g = $("#luckysheet-cell-main").scrollLeft(), v = $("#luckysheet-cell-main").scrollTop(), y = p, b = m; null != Bc.freezenverticaldata && y < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] && (y += g), null != Bc.freezenhorizontaldata && b < Bc.freezenhorizontaldata[0] - Bc.freezenhorizontaldata[2] && (b += v); var k = null == h.left ? y + 18 * ga.zoomRatio : h.left * ga.zoomRatio, x = null == h.top ? b - 18 * ga.zoomRatio : h.top * ga.zoomRatio, w = null == h.width ? this.defaultWidth * ga.zoomRatio : h.width * ga.zoomRatio, _ = null == h.height ? this.defaultHeight * ga.zoomRatio : h.height * ga.zoomRatio, C = null == h.value ? "" : h.value; x < 0 && (x = 2); var T = this.getArrowCanvasSize(k, x, y, b), A = '<div id="luckysheet-postil-show_' + u + "_" + d + '" class="luckysheet-postil-show"><canvas class="arrowCanvas" width="' + T[2] + '" height="' + T[3] + '" style="position:absolute;left:' + T[0] + "px;top:" + T[1] + 'px;z-index:100;pointer-events:none;"></canvas><div class="luckysheet-postil-show-main" style="width:' + w + "px;height:" + _ + "px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:" + k + "px;top:" + x + 'px;box-sizing:border-box;z-index:100;"><div class="luckysheet-postil-dialog-move"><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t" data-type="t"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r" data-type="r"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b" data-type="b"></div><div class="luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l" data-type="l"></div></div><div class="luckysheet-postil-dialog-resize" style="display:none;"><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt" data-type="lt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt" data-type="mt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm" data-type="lm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm" data-type="rm"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt" data-type="rt"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb" data-type="lb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb" data-type="mb"></div><div class="luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb" data-type="rb"></div></div><div style="width:100%;height:100%;overflow:hidden;"><div class="formulaInputFocus" style="width:' + (w - 12) + "px;height:" + (_ - 12) + 'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;" spellcheck="false" contenteditable="true">' + this.htmlEscape(C) + "</div></div></div></div>"; $(A).appendTo($("#luckysheet-cell-main #luckysheet-postil-showBoxs")); var S = $("#luckysheet-postil-show_" + u + "_" + d + " .arrowCanvas").get(0).getContext("2d"); this.drawArrow(S, T[4], T[5], T[6], T[7]), e[u][d].ps.isshow = !0, l.push(a[c]) } } this.ref(e, l), this.init() }, removeActivePs: function () { if ($("#luckysheet-postil-showBoxs .luckysheet-postil-show-active").length > 0) { var e = $("#luckysheet-postil-showBoxs .luckysheet-postil-show-active").attr("id"), t = e.split("luckysheet-postil-show_")[1].split("_")[0], a = e.split("luckysheet-postil-show_")[1].split("_")[1], r = $("#" + e).find(".formulaInputFocus").text(); if (!Nc.createHookFunction("commentUpdateBefore", t, a, r)) return; var n = $.extend(!0, {}, ga.flowdata[t][a]); $("#" + e).removeClass("luckysheet-postil-show-active"), $("#" + e).find(".luckysheet-postil-dialog-resize").hide(), $("#" + e).find(".arrowCanvas").css("z-index", 100), $("#" + e).find(".luckysheet-postil-show-main").css("z-index", 100); var l = rs.deepCopyFlowData(ga.flowdata), i = []; l[t][a].ps.value = r, i.push(t + "_" + a), this.ref(l, i), l[t][a].ps.isshow || $("#" + e).remove(), setTimeout((function () { Nc.createHookFunction("commentUpdateAfter", t, a, n, l[t][a]) }), 0) } }, ref: function (e, t) { if (ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "postil", data: ga.flowdata, curdata: e, sheetIndex: ga.currentSheetIndex, rc: t })), ga.flowdata = e, rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(ga.currentSheetIndex)].data = ga.flowdata, pd.allowUpdate) for (var a = 0; a < t.length; a++) { var r = t[a].split("_")[0], n = t[a].split("_")[1]; pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[r][n], { r: r, c: n }) } setTimeout((function () { md() }), 1) }, positionSync: function () { var e = this; $("#luckysheet-postil-showBoxs .luckysheet-postil-show").each((function (t, a) { var r = $(a).attr("id"), n = r.split("luckysheet-postil-show_")[1].split("_")[0], l = r.split("luckysheet-postil-show_")[1].split("_")[1], i = ga.flowdata[n][l]; null != i && null != i.ps ? e.buildPs(n, l, i.ps) : $("#" + r).hide() })) }, htmlEscape: function (e) { return e.replace(/[<>"&]/g, (function (e, t, a) { switch (console.log(e, t, a), e) { case "<": return "&lt"; case ">": return "&gt"; case "&": return "&amp"; case '"': return "&quot;" } })) } }; function zc(e, t, a, r, n) { var l, i, o = {}; null == n ? (l = ga.config, i = ga.flowdata) : (l = ga.luckysheetfile[_l(n)].config, i = ga.luckysheetfile[_l(n)].data); var s = l.borderInfo; if (null != s && s.length > 0) for (var c = 0; c < s.length; c++) { var u = s[c].rangeType; if ("range" == u) for (var d = s[c].borderType, h = s[c].color, m = s[c].style, p = s[c].range, f = 0; f < p.length; f++) { var g = p[f].row[0], v = p[f].row[1], y = p[f].column[0], b = p[f].column[1]; if (g < e && (g = e), v > t && (v = t), y < a && (y = a), b > r && (b = r), "border-left" == d) { for (var k = g; k <= v; k++)if (null == l.rowhidden || null == l.rowhidden[k]) { null == o[k + "_" + y] && (o[k + "_" + y] = {}), o[k + "_" + y].l = { color: h, style: m }; var x = y - 1; if (x >= 0 && o[k + "_" + x]) if (null != i[k] && "object" == Cm(i[k][x]) && null != i[k][x].mc) { var w = i[k][x], _ = l.merge[w.mc.r + "_" + w.mc.c]; _.c + _.cs - 1 == x && (o[k + "_" + x].r = { color: h, style: m }) } else o[k + "_" + x].r = { color: h, style: m } } } else if ("border-right" == d) { for (var C = g; C <= v; C++)if (null == l.rowhidden || null == l.rowhidden[C]) { null == o[C + "_" + b] && (o[C + "_" + b] = {}), o[C + "_" + b].r = { color: h, style: m }; var T = b + 1; if (T < i[0].length && o[C + "_" + T]) if (null != i[C] && "object" == Cm(i[C][T]) && null != i[C][T].mc) { var A = i[C][T]; l.merge[A.mc.r + "_" + A.mc.c].c == T && (o[C + "_" + T].l = { color: h, style: m }) } else o[C + "_" + T].l = { color: h, style: m } } } else if ("border-top" == d) { if (null != l.rowhidden && null != l.rowhidden[g]) continue; for (var S = y; S <= b; S++) { null == o[g + "_" + S] && (o[g + "_" + S] = {}), o[g + "_" + S].t = { color: h, style: m }; var I = g - 1; if (I >= 0 && o[I + "_" + S]) if (null != i[I] && "object" == Cm(i[I][S]) && null != i[I][S].mc) { var R = i[I][S], $ = l.merge[R.mc.r + "_" + R.mc.c]; $.r + $.rs - 1 == I && (o[I + "_" + S].b = { color: h, style: m }) } else o[I + "_" + S].b = { color: h, style: m } } } else if ("border-bottom" == d) { if (null != l.rowhidden && null != l.rowhidden[v]) continue; for (var q = y; q <= b; q++) { null == o[v + "_" + q] && (o[v + "_" + q] = {}), o[v + "_" + q].b = { color: h, style: m }; var D = v + 1; if (D < i.length && o[D + "_" + q]) if (null != i[D] && "object" == Cm(i[D][q]) && null != i[D][q].mc) { var F = i[D][q]; l.merge[F.mc.r + "_" + F.mc.c].r == D && (o[D + "_" + q].t = { color: h, style: m }) } else o[D + "_" + q].t = { color: h, style: m } } } else if ("border-all" == d) { for (var E = g; E <= v; E++)if (null == l.rowhidden || null == l.rowhidden[E]) for (var M = y; M <= b; M++) { if (null != i[E] && "object" == Cm(i[E][M]) && null != i[E][M].mc) { var N = i[E][M], P = l.merge[N.mc.r + "_" + N.mc.c]; P.r == E && (null == o[E + "_" + M] && (o[E + "_" + M] = {}), o[E + "_" + M].t = { color: h, style: m }), P.r + P.rs - 1 == E && (null == o[E + "_" + M] && (o[E + "_" + M] = {}), o[E + "_" + M].b = { color: h, style: m }), P.c == M && (null == o[E + "_" + M] && (o[E + "_" + M] = {}), o[E + "_" + M].l = { color: h, style: m }), P.c + P.cs - 1 == M && (null == o[E + "_" + M] && (o[E + "_" + M] = {}), o[E + "_" + M].r = { color: h, style: m }) } else null == o[E + "_" + M] && (o[E + "_" + M] = {}), o[E + "_" + M].l = { color: h, style: m }, o[E + "_" + M].r = { color: h, style: m }, o[E + "_" + M].t = { color: h, style: m }, o[E + "_" + M].b = { color: h, style: m }; if (E == g) { var z = g - 1; if (z >= 0 && o[z + "_" + M]) if (null != i[z] && "object" == Cm(i[z][M]) && null != i[z][M].mc) { var L = i[z][M], O = l.merge[L.mc.r + "_" + L.mc.c]; O.r + O.rs - 1 == z && (o[z + "_" + M].b = { color: h, style: m }) } else o[z + "_" + M].b = { color: h, style: m } } if (E == v) { var B = v + 1; if (B < i.length && o[B + "_" + M]) if (null != i[B] && "object" == Cm(i[B][M]) && null != i[B][M].mc) { var V = i[B][M]; l.merge[V.mc.r + "_" + V.mc.c].r == B && (o[B + "_" + M].t = { color: h, style: m }) } else o[B + "_" + M].t = { color: h, style: m } } if (M == y) { var H = y - 1; if (H >= 0 && o[E + "_" + H]) if (null != i[E] && "object" == Cm(i[E][H]) && null != i[E][H].mc) { var U = i[E][H], j = l.merge[U.mc.r + "_" + U.mc.c]; j.c + j.cs - 1 == H && (o[E + "_" + H].r = { color: h, style: m }) } else o[E + "_" + H].r = { color: h, style: m } } if (M == b) { var G = b + 1; if (G < i[0].length && o[E + "_" + G]) if (null != i[E] && "object" == Cm(i[E][G]) && null != i[E][G].mc) { var W = i[E][G]; l.merge[W.mc.r + "_" + W.mc.c].c == G && (o[E + "_" + G].l = { color: h, style: m }) } else o[E + "_" + G].l = { color: h, style: m } } } } else if ("border-outside" == d) { for (var Y = g; Y <= v; Y++)if (null == l.rowhidden || null == l.rowhidden[Y]) for (var X = y; X <= b; X++)if (Y == g || Y == v || X == y || X == b) { if (Y == g) { null == o[Y + "_" + X] && (o[Y + "_" + X] = {}), o[Y + "_" + X].t = { color: h, style: m }; var K = g - 1; if (K >= 0 && o[K + "_" + X]) if (null != i[K] && "object" == Cm(i[K][X]) && null != i[K][X].mc) { var Z = i[K][X], Q = l.merge[Z.mc.r + "_" + Z.mc.c]; Q.r + Q.rs - 1 == K && (o[K + "_" + X].b = { color: h, style: m }) } else o[K + "_" + X].b = { color: h, style: m } } if (Y == v) { null == o[Y + "_" + X] && (o[Y + "_" + X] = {}), o[Y + "_" + X].b = { color: h, style: m }; var J = v + 1; if (J < i.length && o[J + "_" + X]) if (null != i[J] && "object" == Cm(i[J][X]) && null != i[J][X].mc) { var ee = i[J][X]; l.merge[ee.mc.r + "_" + ee.mc.c].r == J && (o[J + "_" + X].t = { color: h, style: m }) } else o[J + "_" + X].t = { color: h, style: m } } if (X == y) { null == o[Y + "_" + X] && (o[Y + "_" + X] = {}), o[Y + "_" + X].l = { color: h, style: m }; var te = y - 1; if (te >= 0 && o[Y + "_" + te]) if (null != i[Y] && "object" == Cm(i[Y][te]) && null != i[Y][te].mc) { var ae = i[Y][te], re = l.merge[ae.mc.r + "_" + ae.mc.c]; re.c + re.cs - 1 == te && (o[Y + "_" + te].r = { color: h, style: m }) } else o[Y + "_" + te].r = { color: h, style: m } } if (X == b) { null == o[Y + "_" + X] && (o[Y + "_" + X] = {}), o[Y + "_" + X].r = { color: h, style: m }; var ne = b + 1; if (ne < i[0].length && o[Y + "_" + ne]) if (null != i[Y] && "object" == Cm(i[Y][ne]) && null != i[Y][ne].mc) { var le = i[Y][ne]; l.merge[le.mc.r + "_" + le.mc.c].c == ne && (o[Y + "_" + ne].l = { color: h, style: m }) } else o[Y + "_" + ne].l = { color: h, style: m } } } } else if ("border-inside" == d) { for (var ie = g; ie <= v; ie++)if (null == l.rowhidden || null == l.rowhidden[ie]) for (var oe = y; oe <= b; oe++)if (ie == g && oe == y) null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc || (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m }); else if (ie == v && oe == y) null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc || (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }); else if (ie == g && oe == b) null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc || (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m }); else if (ie == v && oe == b) null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc || (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }); else if (ie == g) if (null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc) { var se = i[ie][oe], ce = l.merge[se.mc.r + "_" + se.mc.c]; ce.c == oe ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }) : ce.c + ce.cs - 1 == oe && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }) } else null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m }; else if (ie == v) if (null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc) { var ue = i[ie][oe], de = l.merge[ue.mc.r + "_" + ue.mc.c]; de.c == oe ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }) : de.c + de.cs - 1 == oe && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }) } else null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }; else if (oe == y) if (null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc) { var he = i[ie][oe], me = l.merge[he.mc.r + "_" + he.mc.c]; me.r == ie ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].t = { color: h, style: m }) : me.r + me.rs - 1 == ie && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].b = { color: h, style: m }) } else null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m }; else if (oe == b) if (null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc) { var pe = i[ie][oe], fe = l.merge[pe.mc.r + "_" + pe.mc.c]; fe.r == ie ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].t = { color: h, style: m }) : fe.r + fe.rs - 1 == ie && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].b = { color: h, style: m }) } else null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m }; else if (null != i[ie] && "object" == Cm(i[ie][oe]) && null != i[ie][oe].mc) { var ge = i[ie][oe], ve = l.merge[ge.mc.r + "_" + ge.mc.c]; ve.r == ie ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].t = { color: h, style: m }) : ve.r + ve.rs - 1 == ie && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].b = { color: h, style: m }), ve.c == oe ? (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }) : ve.c + ve.cs - 1 == oe && (null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].r = { color: h, style: m }) } else null == o[ie + "_" + oe] && (o[ie + "_" + oe] = {}), o[ie + "_" + oe].l = { color: h, style: m }, o[ie + "_" + oe].r = { color: h, style: m }, o[ie + "_" + oe].t = { color: h, style: m }, o[ie + "_" + oe].b = { color: h, style: m } } else if ("border-horizontal" == d) { for (var ye = g; ye <= v; ye++)if (null == l.rowhidden || null == l.rowhidden[ye]) for (var be = y; be <= b; be++)if (ye == g) null != i[ye] && "object" == Cm(i[ye][be]) && null != i[ye][be].mc || (null == o[ye + "_" + be] && (o[ye + "_" + be] = {}), o[ye + "_" + be].b = { color: h, style: m }); else if (ye == v) null != i[ye] && "object" == Cm(i[ye][be]) && null != i[ye][be].mc || (null == o[ye + "_" + be] && (o[ye + "_" + be] = {}), o[ye + "_" + be].t = { color: h, style: m }); else if (null != i[ye] && "object" == Cm(i[ye][be]) && null != i[ye][be].mc) { var ke = i[ye][be], xe = l.merge[ke.mc.r + "_" + ke.mc.c]; xe.r == ye ? (null == o[ye + "_" + be] && (o[ye + "_" + be] = {}), o[ye + "_" + be].t = { color: h, style: m }) : xe.r + xe.rs - 1 == ye && (null == o[ye + "_" + be] && (o[ye + "_" + be] = {}), o[ye + "_" + be].b = { color: h, style: m }) } else null == o[ye + "_" + be] && (o[ye + "_" + be] = {}), o[ye + "_" + be].t = { color: h, style: m }, o[ye + "_" + be].b = { color: h, style: m } } else if ("border-vertical" == d) { for (var we = g; we <= v; we++)if (null == l.rowhidden || null == l.rowhidden[we]) for (var _e = y; _e <= b; _e++)if (_e == y) null != i[we] && "object" == Cm(i[we][_e]) && null != i[we][_e].mc || (null == o[we + "_" + _e] && (o[we + "_" + _e] = {}), o[we + "_" + _e].r = { color: h, style: m }); else if (_e == b) null != i[we] && "object" == Cm(i[we][_e]) && null != i[we][_e].mc || (null == o[we + "_" + _e] && (o[we + "_" + _e] = {}), o[we + "_" + _e].l = { color: h, style: m }); else if (null != i[we] && "object" == Cm(i[we][_e]) && null != i[we][_e].mc) { var Ce = i[we][_e], Te = l.merge[Ce.mc.r + "_" + Ce.mc.c] || {}; Te.c == _e ? (null == o[we + "_" + _e] && (o[we + "_" + _e] = {}), o[we + "_" + _e].l = { color: h, style: m }) : Te.c + Te.cs - 1 == _e && (null == o[we + "_" + _e] && (o[we + "_" + _e] = {}), o[we + "_" + _e].r = { color: h, style: m }) } else null == o[we + "_" + _e] && (o[we + "_" + _e] = {}), o[we + "_" + _e].l = { color: h, style: m }, o[we + "_" + _e].r = { color: h, style: m } } else if ("border-none" == d) for (var Ae = g; Ae <= v; Ae++)if (null == l.rowhidden || null == l.rowhidden[Ae]) for (var Se = y; Se <= b; Se++) { if (null != o[Ae + "_" + Se] && delete o[Ae + "_" + Se], Ae == g) { var Ie = g - 1; Ie >= 0 && o[Ie + "_" + Se] && delete o[Ie + "_" + Se].b } if (Ae == v) { var Re = v + 1; Re < i.length && o[Re + "_" + Se] && delete o[Re + "_" + Se].t } if (Se == y) { var $e = y - 1; $e >= 0 && o[Ae + "_" + $e] && delete o[Ae + "_" + $e].r } if (Se == b) { var qe = b + 1; qe < i[0].length && o[Ae + "_" + qe] && delete o[Ae + "_" + qe].l } } } else if ("cell" == u) { var De = s[c].value, Fe = De.row_index, Ee = De.col_index; if (Fe < e || Fe > t || Ee < a || Ee > r) continue; if (null != l.rowhidden && null != l.rowhidden[Fe]) continue; if (null != De.l || null != De.r || null != De.t || null != De.b) if (null == o[Fe + "_" + Ee] && (o[Fe + "_" + Ee] = {}), null != i[Fe] && "object" == Cm(i[Fe][Ee]) && null != i[Fe][Ee].mc) { var Me = i[Fe][Ee], Ne = l.merge[Me.mc.r + "_" + Me.mc.c] || {}; if (null != De.l && Ee == Ne.c) { o[Fe + "_" + Ee].l = { color: De.l.color, style: De.l.style }; var Pe = Ee - 1; if (Pe >= 0 && o[Fe + "_" + Pe]) if (null != i[Fe] && "object" == Cm(i[Fe][Pe]) && null != i[Fe][Pe].mc) { var ze = i[Fe][Pe], Le = l.merge[ze.mc.r + "_" + ze.mc.c]; Le.c + Le.cs - 1 == Pe && (o[Fe + "_" + Pe].r = { color: De.l.color, style: De.l.style }) } else o[Fe + "_" + Pe].r = { color: De.l.color, style: De.l.style } } else o[Fe + "_" + Ee].l = null; if (null != De.r && Ee == Ne.c + Ne.cs - 1) { o[Fe + "_" + Ee].r = { color: De.r.color, style: De.r.style }; var Oe = Ee + 1; if (Oe < i[0].length && o[Fe + "_" + Oe]) if (null != i[Fe] && "object" == Cm(i[Fe][Oe]) && null != i[Fe][Oe].mc) { var Be = i[Fe][Oe]; l.merge[Be.mc.r + "_" + Be.mc.c].c == Oe && (o[Fe + "_" + Oe].l = { color: De.r.color, style: De.r.style }) } else o[Fe + "_" + Oe].l = { color: De.r.color, style: De.r.style } } else o[Fe + "_" + Ee].r = null; if (null != De.t && Fe == Ne.r) { o[Fe + "_" + Ee].t = { color: De.t.color, style: De.t.style }; var Ve = Fe - 1; if (Ve >= 0 && o[Ve + "_" + Ee]) if (null != i[Ve] && "object" == Cm(i[Ve][Ee]) && null != i[Ve][Ee].mc) { var He = i[Ve][Ee], Ue = l.merge[He.mc.r + "_" + He.mc.c]; Ue.r + Ue.rs - 1 == Ve && (o[Ve + "_" + Ee].b = { color: De.t.color, style: De.t.style }) } else o[Ve + "_" + Ee].b = { color: De.t.color, style: De.t.style } } else o[Fe + "_" + Ee].t = null; if (null != De.b && Fe == Ne.r + Ne.rs - 1) { o[Fe + "_" + Ee].b = { color: De.b.color, style: De.b.style }; var je = Fe + 1; if (je < i.length && o[je + "_" + Ee]) if (null != i[je] && "object" == Cm(i[je][Ee]) && null != i[je][Ee].mc) { var Ge = i[je][Ee]; l.merge[Ge.mc.r + "_" + Ge.mc.c].r == je && (o[je + "_" + Ee].t = { color: De.b.color, style: De.b.style }) } else o[je + "_" + Ee].t = { color: De.b.color, style: De.b.style } } else o[Fe + "_" + Ee].b = null } else { if (null != De.l) { o[Fe + "_" + Ee].l = { color: De.l.color, style: De.l.style }; var We = Ee - 1; if (We >= 0 && o[Fe + "_" + We]) if (null != i[Fe] && "object" == Cm(i[Fe][We]) && null != i[Fe][We].mc) { var Ye = i[Fe][We], Xe = l.merge[Ye.mc.r + "_" + Ye.mc.c]; Xe.c + Xe.cs - 1 == We && (o[Fe + "_" + We].r = { color: De.l.color, style: De.l.style }) } else o[Fe + "_" + We].r = { color: De.l.color, style: De.l.style } } else o[Fe + "_" + Ee].l = null; if (null != De.r) { o[Fe + "_" + Ee].r = { color: De.r.color, style: De.r.style }; var Ke = Ee + 1; if (Ke < i[0].length && o[Fe + "_" + Ke]) if (null != i[Fe] && "object" == Cm(i[Fe][Ke]) && null != i[Fe][Ke].mc) { var Ze = i[Fe][Ke]; l.merge[Ze.mc.r + "_" + Ze.mc.c].c == Ke && (o[Fe + "_" + Ke].l = { color: De.r.color, style: De.r.style }) } else o[Fe + "_" + Ke].l = { color: De.r.color, style: De.r.style } } else o[Fe + "_" + Ee].r = null; if (null != De.t) { o[Fe + "_" + Ee].t = { color: De.t.color, style: De.t.style }; var Qe = Fe - 1; if (Qe >= 0 && o[Qe + "_" + Ee]) if (null != i[Qe] && "object" == Cm(i[Qe][Ee]) && null != i[Qe][Ee].mc) { var Je = i[Qe][Ee], et = l.merge[Je.mc.r + "_" + Je.mc.c]; et.r + et.rs - 1 == Qe && (o[Qe + "_" + Ee].b = { color: De.t.color, style: De.t.style }) } else o[Qe + "_" + Ee].b = { color: De.t.color, style: De.t.style } } else o[Fe + "_" + Ee].t = null; if (null != De.b) { o[Fe + "_" + Ee].b = { color: De.b.color, style: De.b.style }; var tt = Fe + 1; if (tt < i.length && o[tt + "_" + Ee]) if (null != i[tt] && "object" == Cm(i[tt][Ee]) && null != i[tt][Ee].mc) { var at = i[tt][Ee]; l.merge[at.mc.r + "_" + at.mc.c].r == tt && (o[tt + "_" + Ee].t = { color: De.b.color, style: De.b.style }) } else o[tt + "_" + Ee].t = { color: De.b.color, style: De.b.style } } else o[Fe + "_" + Ee].b = null } else delete o[Fe + "_" + Ee] } } return o } function Lc(e) { var t; return null == e ? (ga.config, t = ga.flowdata) : (ga.luckysheetfile[_l(e)].config, t = ga.luckysheetfile[_l(e)].data), zc(0, t.length, 0, t[0].length, e) } var Oc = { iconHtml: '<div id="luckysheet-dropCell-icon" style="position: absolute;padding: 2px;background-color: #f1f1f1;z-index: 990;cursor: pointer;"><div id="icon_dropCell"></div></div>', typeListHtml: '<div id="luckysheet-dropCell-typeList" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="0"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${copyCell}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="1"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${sequence}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="2"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${onlyFormat}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="3"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${noFormat}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="4"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${day}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="5"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${workDay}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="6"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${month}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="7"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${year}</div></div><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="8"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;"><span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${chineseNumber}</div></div></div>', copyRange: {}, applyRange: {}, applyType: null, direction: null, chnNumChar: { "零": 0, "一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9 }, chnNameValue: { "十": { value: 10, secUnit: !1 }, "百": { value: 100, secUnit: !1 }, "千": { value: 1e3, secUnit: !1 }, "万": { value: 1e4, secUnit: !0 }, "亿": { value: 1e8, secUnit: !0 } }, ChineseToNumber: function (e) { for (var t = 0, a = 0, r = 0, n = e.split(""), l = 0; l < n.length; l++) { var i = this.chnNumChar[n[l]]; if (void 0 !== i) r = i, l == n.length - 1 && (a += r); else { var o = this.chnNameValue[n[l]].value; this.chnNameValue[n[l]].secUnit ? (t += a = (a + r) * o, a = 0) : a += r * o, r = 0 } } return t + a }, chnNumChar2: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"], chnUnitSection: ["", "万", "亿", "万亿", "亿亿"], chnUnitChar: ["", "十", "百", "千"], SectionToChinese: function (e) { for (var t = "", a = "", r = 0, n = !0; e > 0;) { var l = e % 10; 0 == l ? n || (n = !0, a = this.chnNumChar2[l] + a) : (n = !1, t = this.chnNumChar2[l], a = (t += this.chnUnitChar[r]) + a), r++, e = Math.floor(e / 10) } return a }, NumberToChinese: function (e) { var t = 0, a = "", r = "", n = !1; if (0 == e) return this.chnNumChar2[0]; for (; e > 0;) { var l = e % 1e4; n && (r = this.chnNumChar2[0] + r), a = this.SectionToChinese(l), r = (a += 0 != l ? this.chnUnitSection[t] : this.chnUnitSection[0]) + r, n = l < 1e3 && l > 0, e = Math.floor(e / 1e4), t++ } return r }, isChnNumber: function (e) { var t = !0; if (1 == e.length) t = "日" == e || e in this.chnNumChar; else for (var a = e.split(""), r = 0; r < a.length; r++)if (!(a[r] in this.chnNumChar) && !(a[r] in this.chnNameValue)) { t = !1; break } return t }, isExtendNumber: function (e) { var t = /0|([1-9]+[0-9]*)/g, a = t.test(e); if (a) { var r = e.match(t), n = r[r.length - 1], l = e.lastIndexOf(n), i = e.substr(0, l), o = e.substr(l + n.length); return [a, Number(n), i, o] } return [a] }, isChnWeek1: function (e) { var t; return t = 1 == e.length && ("日" == e || this.ChineseToNumber(e) < 7), t }, isChnWeek2: function (e) { var t; return t = 2 == e.length && ("周一" == e || "周二" == e || "周三" == e || "周四" == e || "周五" == e || "周六" == e || "周日" == e), t }, isChnWeek3: function (e) { var t; return t = 3 == e.length && ("星期一" == e || "星期二" == e || "星期三" == e || "星期四" == e || "星期五" == e || "星期六" == e || "星期日" == e), t }, createIcon: function () { var e, t, a = this, r = a.copyRange.row[1], n = a.copyRange.column[1], l = a.applyRange.row[1], i = a.applyRange.column[1]; l >= r && i >= n ? (e = l, t = i) : (e = r, t = n); var o = As(e)[1], s = (As(e)[0], Is(t)[1]); Is(t)[0]; $("#luckysheet-dropCell-icon").remove(), $("#luckysheet-cell-main").append(a.iconHtml), $("#luckysheet-dropCell-icon").css({ left: s, top: o }), $("#luckysheet-dropCell-icon").mouseover((function () { $(this).css("background-color", "#ffe8e8") })).mouseleave((function () { $(this).css("background-color", "#f1f1f1") })).mousedown((function (e) { $("#luckysheet-dropCell-typeList").remove(); var t = gn().dropCell; $("body").append(_m(a.typeListHtml, { copyCell: t.copyCell, sequence: t.sequence, onlyFormat: t.onlyFormat, noFormat: t.noFormat, day: t.day, workDay: t.workDay, month: t.month, year: t.year, chineseNumber: t.chineseNumber })); var r = a.typeItemHide(); r[0] || r[1] || r[2] || r[3] || r[4] || r[5] || r[6] || ($("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=1]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]").hide()), r[2] || ($("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]").hide(), $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]").hide()), r[3] || $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]").hide(); var n = $(this).offset().left, l = $(this).offset().top + 25, i = $(window).height(), o = $(window).width(), s = $("#luckysheet-dropCell-typeList").width(), c = $("#luckysheet-dropCell-typeList").height(); n + s > o && (n -= s), l + c > i && (l = l - c - 38), l < 0 && (l = 0), $("#luckysheet-dropCell-typeList").css({ left: n, top: l }).show(), $("#luckysheet-dropCell-icon").mouseleave((function () { $(this).css("backgroundColor", "#ffe8e8") })); var u = a.applyType; $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=" + u + "]").find("span").append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>'), e.stopPropagation() })), $(document).off("click.dCtypeList").on("click.dCtypeList", "#luckysheet-dropCell-typeList .luckysheet-cols-menuitem", (function () { $("#luckysheet-dropCell-typeList .fa-check").remove(), $(this).find("span").append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>'); var e = $(this).attr("data-type"); a.applyType = e, a.update(), $("#luckysheet-dropCell-typeList").hide(), $("#luckysheet-dropCell-icon").css("backgroundColor", "#f1f1f1"), $("#luckysheet-dropCell-icon").mouseleave((function () { $(this).css("backgroundColor", "#f1f1f1") })), dc() })) }, typeItemHide: function () { for (var e = this.copyRange, t = e.row[0], a = e.row[1], r = e.column[0], n = e.column[1], l = !1, i = !1, o = !1, s = !1, c = !1, u = !1, d = !1, h = t; h <= a; h++)for (var m = r; m <= n; m++)if (ga.flowdata[h][m]) { var p = ga.flowdata[h][m]; "object" == Cm(p) && null != p.v && null == p.f && (null != p.ct && "n" == p.ct.t ? l = !0 : null != p.ct && "d" == p.ct.t ? o = !0 : this.isExtendNumber(p.m)[0] ? i = !0 : this.isChnNumber(p.m) && "日" != p.m ? s = !0 : "日" == p.m ? c = !0 : this.isChnWeek2(p.m) ? u = !0 : this.isChnWeek3(p.m) && (d = !0)) } return [l, i, o, s, c, u, d] }, update: function () { if (fu([this.applyRange], ga.currentSheetIndex) && !1 !== ga.allowEdit) { var e, t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheetfile[_l(ga.currentSheetIndex)], r = $.extend(!0, {}, ga.config), n = Lc(), l = $.extend(!0, {}, a.dataVerification), i = this.direction, o = (this.applyType, this.copyRange), s = o.row[0], c = o.row[1], u = o.column[0], d = o.column[1], h = this.getCopyData(t, s, c, u, d, i); "down" == i || "up" == i ? e = c - s + 1 : "right" != i && "left" != i || (e = d - u + 1); var m = this.applyRange, p = m.row[0], f = m.row[1], g = m.column[0], v = m.column[1]; if ("down" == i || "up" == i) for (var y = f - p + 1, b = g; b <= v; b++) { var k = h[b - g], x = this.getApplyData(k, e, y); if ("down" == i) for (var w = p; w <= f; w++) { var _ = x[w - p]; if (null != _.f) { var C = "=" + Ih.functionCopy(_.f, "down", w - p + 1), T = Ih.execfunction(C, w, b); if (Ih.execFunctionGroup(w, b, T[1], void 0, t), _.f = T[2], _.v = T[1], null != _.spl) _.spl = T[3].data; else if (ba(_.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(_.v)) { if (_.v == 1 / 0 || _.v == -1 / 0) _.m = _.v.toString(); else if (_.v.toString().indexOf("e") > -1) { var A = _.v.toString().split(".")[1].split("e")[0].length; A > 5 && (A = 5), _.m = _.v.toExponential(A).toString() } else { var S = xs(Math.round(1e9 * _.v) / 1e9); _.m = S[0].toString() } _.ct = { fa: "General", t: "n" } } else { var I = xs(_.v); _.m = I[0].toString(), _.ct = I[1] } } t[w][b] = _; var R = s + (w - p) % e, q = b; if (n[R + "_" + q]) { var D = { rangeType: "cell", value: { row_index: w, col_index: b, l: n[R + "_" + q].l, r: n[R + "_" + q].r, t: n[R + "_" + q].t, b: n[R + "_" + q].b } }; r.borderInfo.push(D) } else if (n[w + "_" + b]) { var F = { rangeType: "cell", value: { row_index: w, col_index: b, l: null, r: null, t: null, b: null } }; r.borderInfo.push(F) } l[R + "_" + q] && (l[w + "_" + b] = l[R + "_" + q]) } if ("up" == i) for (var E = f; E >= p; E--) { var M = x[f - E]; if (null != M.f) { var N = "=" + Ih.functionCopy(M.f, "up", f - E + 1), P = Ih.execfunction(N, E, b); if (Ih.execFunctionGroup(E, b, P[1], void 0, t), M.f = P[2], M.v = P[1], null != M.spl) M.spl = P[3].data; else if (ba(M.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(M.v)) { if (M.v == 1 / 0 || M.v == -1 / 0) M.m = M.v.toString(); else if (M.v.toString().indexOf("e") > -1) { var z = M.v.toString().split(".")[1].split("e")[0].length; z > 5 && (z = 5), M.m = M.v.toExponential(z).toString() } else { var L = xs(Math.round(1e9 * M.v) / 1e9); M.m = L[0].toString() } M.ct = { fa: "General", t: "n" } } else { var O = xs(M.v); M.m = O[0].toString(), M.ct = O[1] } } t[E][b] = M; var B = c - (f - E) % e, V = b; if (n[B + "_" + V]) { var H = { rangeType: "cell", value: { row_index: E, col_index: b, l: n[B + "_" + V].l, r: n[B + "_" + V].r, t: n[B + "_" + V].t, b: n[B + "_" + V].b } }; r.borderInfo.push(H) } else if (n[E + "_" + b]) { var U = { rangeType: "cell", value: { row_index: E, col_index: b, l: null, r: null, t: null, b: null } }; r.borderInfo.push(U) } l[B + "_" + V] && (l[E + "_" + b] = l[B + "_" + V]) } } else if ("right" == i || "left" == i) for (var j = v - g + 1, G = p; G <= f; G++) { var W = h[G - p], Y = this.getApplyData(W, e, j); if ("right" == i) for (var X = g; X <= v; X++) { var K = Y[X - g]; if (null != K.f) { var Z = "=" + Ih.functionCopy(K.f, "right", X - g + 1), Q = Ih.execfunction(Z, G, X); if (Ih.execFunctionGroup(X, G, Q[1], void 0, t), K.f = Q[2], K.v = Q[1], null != K.spl) K.spl = Q[3].data; else if (ba(K.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(K.v)) { if (K.v == 1 / 0 || K.v == -1 / 0) K.m = K.v.toString(); else if (K.v.toString().indexOf("e") > -1) { var J = K.v.toString().split(".")[1].split("e")[0].length; J > 5 && (J = 5), K.m = K.v.toExponential(J).toString() } else { var ee = xs(Math.round(1e9 * K.v) / 1e9); K.m = ee[0].toString() } K.ct = { fa: "General", t: "n" } } else { var te = xs(K.v); K.m = te[0].toString(), K.ct = te[1] } } t[G][X] = K; var ae = G, re = u + (X - g) % e; if (n[ae + "_" + re]) { var ne = { rangeType: "cell", value: { row_index: G, col_index: X, l: n[ae + "_" + re].l, r: n[ae + "_" + re].r, t: n[ae + "_" + re].t, b: n[ae + "_" + re].b } }; r.borderInfo.push(ne) } else if (n[G + "_" + X]) { var le = { rangeType: "cell", value: { row_index: G, col_index: X, l: null, r: null, t: null, b: null } }; r.borderInfo.push(le) } l[ae + "_" + re] && (l[G + "_" + X] = l[ae + "_" + re]) } if ("left" == i) for (var ie = v; ie >= g; ie--) { var oe = Y[v - ie]; if (null != oe.f) { var se = "=" + Ih.functionCopy(oe.f, "left", v - ie + 1), ce = Ih.execfunction(se, G, ie); if (Ih.execFunctionGroup(ie, G, ce[1], void 0, t), oe.f = ce[2], oe.v = ce[1], null != oe.spl) oe.spl = ce[3].data; else if (ba(oe.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(oe.v)) { if (oe.v == 1 / 0 || oe.v == -1 / 0) oe.m = oe.v.toString(); else if (oe.v.toString().indexOf("e") > -1) { var ue = oe.v.toString().split(".")[1].split("e")[0].length; ue > 5 && (ue = 5), oe.m = oe.v.toExponential(ue).toString() } else { var de = xs(Math.round(1e9 * oe.v) / 1e9); oe.m = de[0].toString() } oe.ct = { fa: "General", t: "n" } } else { var he = xs(oe.v); oe.m = he[0].toString(), oe.ct = he[1] } } t[G][ie] = oe; var me = G, pe = d - (v - ie) % e; if (n[me + "_" + pe]) { var fe = { rangeType: "cell", value: { row_index: G, col_index: ie, l: n[me + "_" + pe].l, r: n[me + "_" + pe].r, t: n[me + "_" + pe].t, b: n[me + "_" + pe].b } }; r.borderInfo.push(fe) } else if (n[G + "_" + ie]) { var ge = { rangeType: "cell", value: { row_index: G, col_index: ie, l: null, r: null, t: null, b: null } }; r.borderInfo.push(ge) } l[me + "_" + pe] && (l[G + "_" + ie] = l[me + "_" + pe]) } } var ve = $.extend(!0, [], a.luckysheet_conditionformat_save); if (null != ve && ve.length > 0) for (var ye = 0; ye < ve.length; ye++) { for (var be = ve[ye].cellrange, ke = [], xe = 0; xe < be.length; xe++) { var we = gd.CFSplitRange(be[xe], { row: o.row, column: o.column }, { row: m.row, column: m.column }, "operatePart"); we.length > 0 && (ke = ke.concat(we)) } ke.length > 0 && ve[ye].cellrange.push(m) } var _e = { cfg: r, cdformat: ve, dataVerification: l }; id(t, ga.luckysheet_select_save, _e), Rh() } }, getCopyData: function (e, t, a, r, n, l) { var i, o, s, c, u = []; "down" == l || "up" == l ? (i = r, o = n, s = t, c = a) : "right" != l && "left" != l || (i = t, o = a, s = r, c = n); for (var d = i; d <= o; d++) { for (var h = {}, m = [], p = [], f = "", g = null, v = null, y = !0, b = s; b <= c; b++) { var k = void 0; "down" == l || "up" == l ? k = e[b][d] : "right" != l && "left" != l || (k = e[d][b]); var x = void 0; if (k && k.v && null == k.f) if (k.ct && "n" == k.ct.t) x = "number", g = null, v = null; else if (k.ct && "d" == k.ct.t) x = "date", g = null, v = null; else if (this.isExtendNumber(k.m)[0]) { x = "extendNumber"; var w = this.isExtendNumber(k.m); null == g || null == v ? (y = !0, g = w[2], v = w[3]) : w[2] != g || w[3] != v ? (y = !1, g = w[2], v = w[3]) : y = !0 } else this.isChnNumber(k.m) ? (x = "chnNumber", g = null, v = null) : this.isChnWeek2(k.m) ? (x = "chnWeek2", g = null, v = null) : this.isChnWeek3(k.m) ? (x = "chnWeek3", g = null, v = null) : (x = "other", g = null, v = null); else x = "other", g = null, v = null; "extendNumber" == x ? b == s ? s == c ? (f = x, m.push(k), p.push(b - s + 1), h[f] = [], h[f].push({ data: m, index: p })) : (f = x, m.push(k), p.push(b - s + 1)) : b == c ? f == x && y ? (m.push(k), p.push(b - s + 1), f in h || (h[f] = []), h[f].push({ data: m, index: p })) : (f in h || (h[f] = []), h[f].push({ data: m, index: p }), f = x, (m = []).push(k), (p = []).push(b - s + 1), f in h || (h[f] = []), h[f].push({ data: m, index: p })) : f == x && y ? (m.push(k), p.push(b - s + 1)) : (f in h || (h[f] = []), h[f].push({ data: m, index: p }), f = x, (m = []).push(k), (p = []).push(b - s + 1)) : b == s ? s == c ? (f = x, m.push(k), p.push(b - s + 1), h[f] = [], h[f].push({ data: m, index: p })) : (f = x, m.push(k), p.push(b - s + 1)) : b == c ? f == x ? (m.push(k), p.push(b - s + 1), f in h || (h[f] = []), h[f].push({ data: m, index: p })) : (f in h || (h[f] = []), h[f].push({ data: m, index: p }), f = x, (m = []).push(k), (p = []).push(b - s + 1), f in h || (h[f] = []), h[f].push({ data: m, index: p })) : f == x ? (m.push(k), p.push(b - s + 1)) : (f in h || (h[f] = []), h[f].push({ data: m, index: p }), f = x, (m = []).push(k), (p = []).push(b - s + 1)) } u.push(h) } return u }, getApplyData: function (e, t, a) { var r = [], n = this.direction, l = this.applyType, i = Math.floor(a / t), o = a % t, s = e.number, c = []; if (s) for (var u = 0; u < s.length; u++) { var d = this.getLenS(s[u].index, o), h = s[u].index.length * i + d, m = void 0; m = "1" == l || "3" == l ? this.getDataByType(s[u].data, h, n, l, "number") : "2" == l ? this.getDataByType(s[u].data, h, n, l) : this.getDataByType(s[u].data, h, n, "0"); var p = this.getDataIndex(t, a, s[u].index); c.push({ data: m, index: p }) } var f = e.extendNumber, g = []; if (f) for (var v = 0; v < f.length; v++) { var y = this.getLenS(f[v].index, o), b = f[v].index.length * i + y, k = void 0; k = "1" == l || "3" == l ? this.getDataByType(f[v].data, b, n, l, "extendNumber") : "2" == l ? this.getDataByType(f[v].data, b, n, l) : this.getDataByType(f[v].data, b, n, "0"); var x = this.getDataIndex(t, a, f[v].index); g.push({ data: k, index: x }) } var w = e.date, _ = []; if (w) for (var C = 0; C < w.length; C++) { var T = this.getLenS(w[C].index, o), A = w[C].index.length * i + T, S = void 0; S = "1" == l || "3" == l ? this.getDataByType(w[C].data, A, n, l, "date") : "8" == l ? this.getDataByType(w[C].data, A, n, "0") : this.getDataByType(w[C].data, A, n, l); var I = this.getDataIndex(t, a, w[C].index); _.push({ data: S, index: I }) } var R = e.chnNumber, $ = []; if (R) for (var q = 0; q < R.length; q++) { var D = this.getLenS(R[q].index, o), F = R[q].index.length * i + D, E = void 0; E = "1" == l || "3" == l ? this.getDataByType(R[q].data, F, n, l, "chnNumber") : "2" == l || "8" == l ? this.getDataByType(R[q].data, F, n, l) : this.getDataByType(R[q].data, F, n, "0"); var M = this.getDataIndex(t, a, R[q].index); $.push({ data: E, index: M }) } var N = e.chnWeek2, P = []; if (N) for (var z = 0; z < N.length; z++) { var L = this.getLenS(N[z].index, o), O = N[z].index.length * i + L, B = void 0; B = "1" == l || "3" == l ? this.getDataByType(N[z].data, O, n, l, "chnWeek2") : "2" == l ? this.getDataByType(N[z].data, O, n, l) : this.getDataByType(N[z].data, O, n, "0"); var V = this.getDataIndex(t, a, N[z].index); P.push({ data: B, index: V }) } var H = e.chnWeek3, U = []; if (H) for (var j = 0; j < H.length; j++) { var G = this.getLenS(H[j].index, o), W = H[j].index.length * i + G, Y = void 0; Y = "1" == l || "3" == l ? this.getDataByType(H[j].data, W, n, l, "chnWeek3") : "2" == l ? this.getDataByType(H[j].data, W, n, l) : this.getDataByType(H[j].data, W, n, "0"); var X = this.getDataIndex(t, a, H[j].index); U.push({ data: Y, index: X }) } var K = e.other, Z = []; if (K) for (var Q = 0; Q < K.length; Q++) { var J = this.getLenS(K[Q].index, o), ee = K[Q].index.length * i + J, te = void 0; te = "2" == l || "3" == l ? this.getDataByType(K[Q].data, ee, n, l) : this.getDataByType(K[Q].data, ee, n, "0"); var ae = this.getDataIndex(t, a, K[Q].index); Z.push({ data: te, index: ae }) } for (var re = 1; re <= a; re++) { if (c.length > 0) for (var ne = 0; ne < c.length; ne++)re in c[ne].index && r.push(c[ne].data[c[ne].index[re]]); if (g.length > 0) for (var le = 0; le < g.length; le++)re in g[le].index && r.push(g[le].data[g[le].index[re]]); if (_.length > 0) for (var ie = 0; ie < _.length; ie++)re in _[ie].index && r.push(_[ie].data[_[ie].index[re]]); if ($.length > 0) for (var oe = 0; oe < $.length; oe++)re in $[oe].index && r.push($[oe].data[$[oe].index[re]]); if (P.length > 0) for (var se = 0; se < P.length; se++)re in P[se].index && r.push(P[se].data[P[se].index[re]]); if (U.length > 0) for (var ce = 0; ce < U.length; ce++)re in U[ce].index && r.push(U[ce].data[U[ce].index[re]]); if (Z.length > 0) for (var ue = 0; ue < Z.length; ue++)re in Z[ue].index && r.push(Z[ue].data[Z[ue].index[re]]) } return r }, getLenS: function (e, t) { for (var a = 0, r = 0; r < e.length && e[r] <= t; r++)a++; return a }, getDataIndex: function (e, t, a) { var r = {}, n = Math.floor(t / e), l = t % e, i = 0; if (n > 0) { for (var o = 1; o <= n; o++)for (var s = 0; s < a.length; s++)r[a[s] + (o - 1) * e] = i, i++; for (var c = 0; c < a.length && a[c] <= l; c++)r[a[c] + e * n] = i, i++ } else for (var u = 0; u < a.length && a[u] <= l; u++)r[a[u]] = i, i++; return r }, getDataByType: function (e, t, a, r, n) { var l = []; if ("0" == r) "up" != a && "left" != a || e.reverse(), l = this.FillCopy(e, t); else if ("1" == r) if ("number" == n) l = this.FillSeries(e, t, a); else if ("extendNumber" == n) if (1 == e.length) { var i; "down" == a || "right" == a ? i = 1 : "up" != a && "left" != a || (i = -1), l = this.FillExtendNumber(e, t, i) } else { for (var o = [], s = 0; s < e.length; s++) { var c = e[s].m; o.push(Number(this.isExtendNumber(c)[1])) } if ("up" != a && "left" != a || (e.reverse(), o.reverse()), this.isEqualDiff(o)) { var u = o[1] - o[0]; l = this.FillExtendNumber(e, t, u) } else l = this.FillCopy(e, t) } else if ("date" == n) if (1 == e.length) { var d; "down" == a || "right" == a ? d = 1 : "up" != a && "left" != a || (d = -1), l = this.FillDays(e, t, d) } else { "up" != a && "left" != a || e.reverse(); var h = this.judgeDate(e); if (h[0] && h[3]) { var m = us(e[1].m).diff(us(e[0].m), "months"); l = this.FillMonths(e, t, m) } else if (!h[0] && h[2]) { var p = us(e[1].m).diff(us(e[0].m), "days"); l = this.FillDays(e, t, p) } else l = this.FillCopy(e, t) } else if ("chnNumber" == n) if (1 == e.length) { var f, g; if ("日" == e[0].m || this.ChineseToNumber(e[0].m) < 7) "down" == a || "right" == a ? f = 1 : "up" != a && "left" != a || (f = -1), l = this.FillChnWeek(e, t, f); else "down" == a || "right" == a ? g = 1 : "up" != a && "left" != a || (g = -1), l = this.FillChnNumber(e, t, g) } else { for (var v = !1, y = 0; y < e.length; y++)if ("日" == e[y].m) { v = !0; break } for (var b = [], k = 0, x = 0; x < e.length; x++)"日" == e[x].m ? 0 == x ? b.push(0) : (k++, b.push(7 * k)) : v && this.ChineseToNumber(e[x].m) > 0 && this.ChineseToNumber(e[x].m) < 7 ? b.push(this.ChineseToNumber(e[x].m) + 7 * k) : b.push(this.ChineseToNumber(e[x].m)); if ("up" != a && "left" != a || (e.reverse(), b.reverse()), this.isEqualDiff(b)) if (v || b[b.length - 1] < 6 && b[0] > 0 || b[0] < 6 && b[b.length - 1] > 0) { var w = b[1] - b[0]; l = this.FillChnWeek(e, t, w) } else { var _ = b[1] - b[0]; l = this.FillChnNumber(e, t, _) } else l = this.FillCopy(e, t) } else if ("chnWeek2" == n) if (1 == e.length) { var C; "down" == a || "right" == a ? C = 1 : "up" != a && "left" != a || (C = -1), l = this.FillChnWeek2(e, t, C) } else { for (var T = [], A = 0, S = 0; S < e.length; S++) { var I = e[S].m.substr(e[S].m.length - 1, 1); "周日" == e[S].m ? 0 == S ? T.push(0) : (A++, T.push(7 * A)) : T.push(this.ChineseToNumber(I) + 7 * A) } if ("up" != a && "left" != a || (e.reverse(), T.reverse()), this.isEqualDiff(T)) { var R = T[1] - T[0]; l = this.FillChnWeek2(e, t, R) } else l = this.FillCopy(e, t) } else if ("chnWeek3" == n) if (1 == e.length) { var q; "down" == a || "right" == a ? q = 1 : "up" != a && "left" != a || (q = -1), l = this.FillChnWeek3(e, t, q) } else { for (var D = [], F = 0, E = 0; E < e.length; E++) { var M = e[E].m.substr(e[E].m.length - 1, 1); "星期日" == e[E].m ? 0 == E ? D.push(0) : (F++, D.push(7 * F)) : D.push(this.ChineseToNumber(M) + 7 * F) } if ("up" != a && "left" != a || (e.reverse(), D.reverse()), this.isEqualDiff(D)) { var N = D[1] - D[0]; l = this.FillChnWeek3(e, t, N) } else l = this.FillCopy(e, t) } else "up" != a && "left" != a || e.reverse(), l = this.FillCopy(e, t); else if ("2" == r) "up" != a && "left" != a || e.reverse(), l = this.FillOnlyFormat(e, t); else if ("3" == r) { var P = this.getDataByType(e, t, a, "1", n); l = this.FillWithoutFormat(P) } else if ("4" == r) { var z; if (1 == e.length) "down" == a || "right" == a ? z = 1 : "up" != a && "left" != a || (z = -1), l = this.FillDays(e, t, z); else if (2 == e.length) { "up" != a && "left" != a || e.reverse(); var L = us(e[1].m).diff(us(e[0].m), "days"); l = this.FillDays(e, t, L) } else { "up" != a && "left" != a || e.reverse(); var O = this.judgeDate(e); if (O[0] && O[3]) { var B = us(e[1].m).diff(us(e[0].m), "months"); l = this.FillMonths(e, t, B) } else if (!O[0] && O[2]) { var V = us(e[1].m).diff(us(e[0].m), "days"); l = this.FillDays(e, t, V) } else l = this.FillCopy(e, t) } } else if ("5" == r) if (1 == e.length) { var H; "down" == a || "right" == a ? H = 1 : "up" != a && "left" != a || (H = -1); for (var U = Math.round(1.5 * t), j = 1; j <= U; j++) { var G = $.extend(!0, {}, e[0]), W = us(G.m).add(j, "days").day(); if (0 != W && 6 != W) { var Y = us(G.m).add(H * j, "days").format("YYYY-MM-DD"); if (G.m = Y, G.v = xs(Y)[2], l.push(G), l.length == t) break } } } else if (2 == e.length) if (us(e[1].m).date() == us(e[0].m).date() && 0 != us(e[1].m).diff(us(e[0].m), "months")) { "up" != a && "left" != a || e.reverse(); for (var X = us(e[1].m).diff(us(e[0].m), "months"), K = 1; K <= t; K++) { var Z = (K - 1) % e.length, Q = $.extend(!0, {}, e[Z]), J = us(e[e.length - 1]).add(X * K, "months").day(), ee = void 0; ee = 0 == J ? us(e[e.length - 1]).add(X * K, "months").subtract(2, "days").format("YYYY-MM-DD") : 6 == J ? us(e[e.length - 1]).add(X * K, "months").subtract(1, "days").format("YYYY-MM-DD") : us(e[e.length - 1]).add(X * K, "months").format("YYYY-MM-DD"), Q.m = ee, Q.v = xs(ee)[2], l.push(Q) } } else if (Math.abs(us(e[1].m).diff(us(e[0].m))) > 7) { var te, ae; "down" == a || "right" == a ? te = 1 : "up" != a && "left" != a || (te = -1, e.reverse()); for (var re = 1; re <= t; re++) { var ne = (re - 1) % e.length, le = $.extend(!0, {}, e[ne]), ie = Math.ceil(re / e.length); 0 == ne && (ae = us(le.m).add(te * ie, "months").diff(us(le.m), "days")); var oe = us(le.m).add(ae, "days").day(), se = void 0; se = 0 == oe ? us(le.m).add(ae, "days").subtract(2, "days").format("YYYY-MM-DD") : 6 == oe ? us(le.m).add(ae, "days").subtract(1, "days").format("YYYY-MM-DD") : us(le.m).add(ae, "days").format("YYYY-MM-DD"), le.m = se, le.v = xs(se)[2], l.push(le) } } else { var ce, ue; "down" == a || "right" == a ? ce = 7 : "up" != a && "left" != a || (ce = -7, e.reverse()); for (var de = 1; de <= t; de++) { var he = (de - 1) % e.length, me = $.extend(!0, {}, e[he]), pe = Math.ceil(de / e.length); 0 == he && (ue = us(me.m).add(ce * pe, "days").diff(us(me.m), "days")); var fe = us(me.m).add(ue, "days").day(), ge = void 0; ge = 0 == fe ? us(me.m).add(ue, "days").subtract(2, "days").format("YYYY-MM-DD") : 6 == fe ? us(me.m).add(ue, "days").subtract(1, "days").format("YYYY-MM-DD") : us(me.m).add(ue, "days").format("YYYY-MM-DD"), me.m = ge, me.v = xs(ge)[2], l.push(me) } } else { var ve = this.judgeDate(e); if (ve[0] && ve[3]) { "up" != a && "left" != a || e.reverse(); for (var ye = us(e[1].m).diff(us(e[0].m), "months"), be = 1; be <= t; be++) { var ke = (be - 1) % e.length, xe = $.extend(!0, {}, e[ke]), we = us(e[e.length - 1].m).add(ye * be, "months").day(), _e = void 0; _e = 0 == we ? us(e[e.length - 1].m).add(ye * be, "months").subtract(2, "days").format("YYYY-MM-DD") : 6 == we ? us(e[e.length - 1].m).add(ye * be, "months").subtract(1, "days").format("YYYY-MM-DD") : us(e[e.length - 1].m).add(ye * be, "months").format("YYYY-MM-DD"), xe.m = _e, xe.v = xs(_e)[2], l.push(xe) } } else if (!ve[0] && ve[2]) if (Math.abs(us(e[1].m).diff(us(e[0].m))) > 7) { var Ce, Te; "down" == a || "right" == a ? Ce = 1 : "up" != a && "left" != a || (Ce = -1, e.reverse()); for (var Ae = 1; Ae <= t; Ae++) { var Se = (Ae - 1) % e.length, Ie = $.extend(!0, {}, e[Se]), Re = Math.ceil(Ae / e.length); 0 == Se && (Te = us(Ie.m).add(Ce * Re, "months").diff(us(Ie.m), "days")); var $e = us(Ie.m).add(Te, "days").day(), qe = void 0; qe = 0 == $e ? us(Ie.m).add(Te, "days").subtract(2, "days").format("YYYY-MM-DD") : 6 == $e ? us(Ie.m).add(Te, "days").subtract(1, "days").format("YYYY-MM-DD") : us(Ie.m).add(Te, "days").format("YYYY-MM-DD"), Ie.m = qe, Ie.v = xs(qe)[2], l.push(Ie) } } else { var De, Fe; "down" == a || "right" == a ? De = 7 : "up" != a && "left" != a || (De = -7, e.reverse()); for (var Ee = 1; Ee <= t; Ee++) { var Me = (Ee - 1) % e.length, Ne = $.extend(!0, {}, e[Me]), Pe = Math.ceil(Ee / e.length); 0 == Me && (Fe = us(Ne.m).add(De * Pe, "days").diff(us(Ne.m), "days")); var ze = us(Ne.m).add(Fe, "days").day(), Le = void 0; Le = 0 == ze ? us(Ne.m).add(Fe, "days").subtract(2, "days").format("YYYY-MM-DD") : 6 == ze ? us(Ne.m).add(Fe, "days").subtract(1, "days").format("YYYY-MM-DD") : us(Ne.m).add(Fe, "days").format("YYYY-MM-DD"), Ne.m = Le, Ne.v = xs(Le)[2], l.push(Ne) } } else "up" != a && "left" != a || e.reverse(), l = this.FillCopy(e, t) } else if ("6" == r) { var Oe; if (1 == e.length) "down" == a || "right" == a ? Oe = 1 : "up" != a && "left" != a || (Oe = -1), l = this.FillMonths(e, t, Oe); else if (2 == e.length) if (us(e[1].m).date() == us(e[0].m).date() && 0 != us(e[1].m).diff(us(e[0].m), "months")) { "up" != a && "left" != a || e.reverse(); var Be = us(e[1].m).diff(us(e[0].m), "months"); l = this.FillMonths(e, t, Be) } else { var Ve, He; "down" == a || "right" == a ? Ve = 1 : "up" != a && "left" != a || (Ve = -1, e.reverse()); for (var Ue = 1; Ue <= t; Ue++) { var je = (Ue - 1) % e.length, Ge = $.extend(!0, {}, e[je]), We = Math.ceil(Ue / e.length); 0 == je && (He = us(Ge.m).add(Ve * We, "months").diff(us(Ge.m), "days")); var Ye = us(Ge.m).add(He, "days").format("YYYY-MM-DD"); Ge.m = Ye, Ge.v = xs(Ye)[2], l.push(Ge) } } else { var Xe = this.judgeDate(e); if (Xe[0] && Xe[3]) { "up" != a && "left" != a || e.reverse(); var Ke = us(e[1].m).diff(us(e[0].m), "months"); l = this.FillMonths(e, t, Ke) } else if (!Xe[0] && Xe[2]) { var Ze, Qe; "down" == a || "right" == a ? Ze = 1 : "up" != a && "left" != a || (Ze = -1, e.reverse()); for (var Je = 1; Je <= t; Je++) { var et = (Je - 1) % e.length, tt = $.extend(!0, {}, e[et]), at = Math.ceil(Je / e.length); 0 == et && (Qe = us(tt.m).add(Ze * at, "months").diff(us(tt.m), "days")); var rt = us(tt.m).add(Qe, "days").format("YYYY-MM-DD"); tt.m = rt, tt.v = xs(rt)[2], l.push(tt) } } else "up" != a && "left" != a || e.reverse(), l = this.FillCopy(e, t) } } else if ("7" == r) { var nt; if (1 == e.length) "down" == a || "right" == a ? nt = 1 : "up" != a && "left" != a || (nt = -1), l = this.FillYears(e, t, nt); else if (2 == e.length) if (us(e[1].m).date() == us(e[0].m).date() && us(e[1].m).month() == us(e[0].m).month() && 0 != us(e[1].m).diff(us(e[0].m), "years")) { "up" != a && "left" != a || e.reverse(); var lt = us(e[1].m).diff(us(e[0].m), "years"); l = this.FillYears(e, t, lt) } else { var it, ot; "down" == a || "right" == a ? it = 1 : "up" != a && "left" != a || (it = -1, e.reverse()); for (var st = 1; st <= t; st++) { var ct = (st - 1) % e.length, ut = $.extend(!0, {}, e[ct]), dt = Math.ceil(st / e.length); 0 == ct && (ot = us(ut.m).add(it * dt, "years").diff(us(ut.m), "days")); var ht = us(ut.m).add(ot, "days").format("YYYY-MM-DD"); ut.m = ht, ut.v = xs(ht)[2], l.push(ut) } } else { var mt = this.judgeDate(e); if (mt[0] && mt[1] && mt[4]) { "up" != a && "left" != a || e.reverse(); var pt = us(e[1].m).diff(us(e[0].m), "years"); l = this.FillYears(e, t, pt) } else if (mt[0] && mt[3] || mt[2]) { var ft, gt; "down" == a || "right" == a ? ft = 1 : "up" != a && "left" != a || (ft = -1, e.reverse()); for (var vt = 1; vt <= t; vt++) { var yt = (vt - 1) % e.length, bt = $.extend(!0, {}, e[yt]), kt = Math.ceil(vt / e.length); 0 == yt && (gt = us(bt.m).add(ft * kt, "years").diff(us(bt.m), "days")); var xt = us(bt.m).add(gt, "days").format("YYYY-MM-DD"); bt.m = xt, bt.v = xs(xt)[2], l.push(bt) } } else "up" != a && "left" != a || e.reverse(), l = this.FillCopy(e, t) } } else if ("8" == r) if (1 == e.length) { var wt; "down" == a || "right" == a ? wt = 1 : "up" != a && "left" != a || (wt = -1), l = this.FillChnNumber(e, t, wt) } else { for (var _t = [], Ct = 0; Ct < e.length; Ct++)_t.push(this.ChineseToNumber(e[Ct].m)); if ("up" != a && "left" != a || (e.reverse(), _t.reverse()), this.isEqualDiff(_t)) { var Tt = _t[1] - _t[0]; l = this.FillChnNumber(e, t, Tt) } else l = this.FillCopy(e, t) } return l }, FillCopy: function (e, t) { for (var a = [], r = 1; r <= t; r++) { var n = (r - 1) % e.length, l = $.extend(!0, {}, e[n]); a.push(l) } return a }, FillSeries: function (e, t, a) { for (var r = [], n = [], l = 0; l < e.length; l++)n.push(Number(e[l].v)); if (e.length > 2 && this.isEqualRatio(n)) for (var i = 1; i <= t; i++) { var o = (i - 1) % e.length, s = $.extend(!0, {}, e[o]), c = void 0; "down" == a || "right" == a ? c = Number(e[e.length - 1].v) * Math.pow(Number(e[1].v) / Number(e[0].v), i) : "up" != a && "left" != a || (c = Number(e[0].v) / Math.pow(Number(e[1].v) / Number(e[0].v), i)), s.v = c, s.m = ws(s.ct.fa, c), r.push(s) } else for (var u = this.getXArr(e.length), d = 1; d <= t; d++) { var h = (d - 1) % e.length, m = $.extend(!0, {}, e[h]), p = void 0; "down" == a || "right" == a ? p = this.forecast(e.length + d, n, u) : "up" != a && "left" != a || (p = this.forecast(1 - d, n, u)), m.v = p, m.m = ws(m.ct.fa, p), r.push(m) } return r }, FillExtendNumber: function (e, t, a) { for (var r = [], n = /0|([1-9]+[0-9]*)/g, l = 1; l <= t; l++) { var i = (l - 1) % e.length, o = $.extend(!0, {}, e[i]), s = e[e.length - 1].m, c = s.match(n), u = c[c.length - 1], d = Math.abs(Number(u) + a * l), h = s.lastIndexOf(u), m = s.substr(0, h) + d.toString() + s.substr(h + u.length); o.v = m, o.m = m, r.push(o) } return r }, FillOnlyFormat: function (e, t) { for (var a = [], r = 1; r <= t; r++) { var n = (r - 1) % e.length, l = $.extend(!0, {}, e[n]); delete l.f, delete l.m, delete l.v, a.push(l) } return a }, FillWithoutFormat: function (e) { for (var t = [], a = 0; a < e.length; a++) { var r = $.extend(!0, {}, e[a]), n = void 0; n = null == r.f ? { m: r.v.toString(), v: r.v } : { f: r.f, m: r.v.toString(), v: r.v }, t.push(n) } return t }, FillDays: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = ws("yyyy-MM-dd", i.v); o = us(o).add(a * n, "days").format("YYYY-MM-DD"), i.v = xs(o)[2], i.m = ws(i.ct.fa, i.v), r.push(i) } return r }, FillMonths: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = ws("yyyy-MM-dd", i.v); o = us(o).add(a * n, "months").format("YYYY-MM-DD"), i.v = xs(o)[2], i.m = ws(i.ct.fa, i.v), r.push(i) } return r }, FillYears: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = ws("yyyy-MM-dd", i.v); o = us(o).add(a * n, "years").format("YYYY-MM-DD"), i.v = xs(o)[2], i.m = ws(i.ct.fa, i.v), r.push(i) } return r }, FillChnWeek: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = void 0; (o = "日" == e[e.length - 1].m ? 7 + a * n : this.ChineseToNumber(e[e.length - 1].m) + a * n) < 0 && (o = 7 * Math.ceil(Math.abs(o) / 7) + o); var s = o % 7; 0 == s ? (i.m = "日", i.v = "日") : 1 == s ? (i.m = "一", i.v = "一") : 2 == s ? (i.m = "二", i.v = "二") : 3 == s ? (i.m = "三", i.v = "三") : 4 == s ? (i.m = "四", i.v = "四") : 5 == s ? (i.m = "五", i.v = "五") : 6 == s && (i.m = "六", i.v = "六"), r.push(i) } return r }, FillChnWeek2: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = void 0; if ("周日" == e[e.length - 1].m) o = 7 + a * n; else { var s = e[e.length - 1].m, c = s.substr(s.length - 1, 1); o = this.ChineseToNumber(c) + a * n } o < 0 && (o = 7 * Math.ceil(Math.abs(o) / 7) + o); var u = o % 7; 0 == u ? (i.m = "周日", i.v = "周日") : 1 == u ? (i.m = "周一", i.v = "周一") : 2 == u ? (i.m = "周二", i.v = "周二") : 3 == u ? (i.m = "周三", i.v = "周三") : 4 == u ? (i.m = "周四", i.v = "周四") : 5 == u ? (i.m = "周五", i.v = "周五") : 6 == u && (i.m = "周六", i.v = "周六"), r.push(i) } return r }, FillChnWeek3: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = void 0; if ("星期日" == e[e.length - 1].m) o = 7 + a * n; else { var s = e[e.length - 1].m, c = s.substr(s.length - 1, 1); o = this.ChineseToNumber(c) + a * n } o < 0 && (o = 7 * Math.ceil(Math.abs(o) / 7) + o); var u = o % 7; 0 == u ? (i.m = "星期日", i.v = "星期日") : 1 == u ? (i.m = "星期一", i.v = "星期一") : 2 == u ? (i.m = "星期二", i.v = "星期二") : 3 == u ? (i.m = "星期三", i.v = "星期三") : 4 == u ? (i.m = "星期四", i.v = "星期四") : 5 == u ? (i.m = "星期五", i.v = "星期五") : 6 == u && (i.m = "星期六", i.v = "星期六"), r.push(i) } return r }, FillChnNumber: function (e, t, a) { for (var r = [], n = 1; n <= t; n++) { var l = (n - 1) % e.length, i = $.extend(!0, {}, e[l]), o = this.ChineseToNumber(e[e.length - 1].m) + a * n, s = void 0; s = o <= 0 ? "零" : this.NumberToChinese(o), i.v = s, i.m = s.toString(), r.push(i) } return r }, isEqualDiff: function (e) { for (var t = !0, a = e[1] - e[0], r = 1; r < e.length; r++)if (e[r] - e[r - 1] != a) { t = !1; break } return t }, isEqualRatio: function (e) { for (var t = !0, a = e[1] / e[0], r = 1; r < e.length; r++)if (e[r] / e[r - 1] != a) { t = !1; break } return t }, getXArr: function (e) { for (var t = [], a = 1; a <= e; a++)t.push(a); return t }, forecast: function (e, t, a) { function r(e) { for (var t = 0, a = 0; a < e.length; a++)t += e[a]; return t / e.length } for (var n, l = r(a), i = r(t), o = 0, s = 0, c = 0; c < a.length; c++)o += (a[c] - l) * (t[c] - i), s += (a[c] - l) * (a[c] - l); var u = i - (n = 0 == s ? 1 : o / s) * l; return Math.round(1e5 * (u + n * e)) / 1e5 }, judgeDate: function (e) { for (var t = !0, a = !0, r = !0, n = !0, l = !0, i = us(e[0].m).date(), o = us(e[0].m).month(), s = us(e[1].m).diff(us(e[0].m), "days"), c = us(e[1].m).diff(us(e[0].m), "months"), u = us(e[1].m).diff(us(e[0].m), "years"), d = 1; d < e.length; d++)us(e[d].m).date() != i && (t = !1), us(e[d].m).month() != o && (a = !1), us(e[d].m).diff(us(e[d - 1].m), "days") != s && (r = !1), us(e[d].m).diff(us(e[d - 1].m), "months") != c && (n = !1), us(e[d].m).diff(us(e[d - 1].m), "years") != u && (l = !1); return 0 == s && (r = !1), 0 == c && (n = !1), 0 == u && (l = !1), [t, a, r, n, l] } }, Bc = { freezenHorizontalHTML: '<div id="luckysheet-freezebar-horizontal" class="luckysheet-freezebar" tabindex="0"><div class="luckysheet-freezebar-handle luckysheet-freezebar-horizontal-handle" ><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-title" ></div><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-bar" ></div></div><div class="luckysheet-freezebar-drop luckysheet-freezebar-horizontal-drop" ><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-title" ></div><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-bar" >&nbsp;</div></div></div>', freezenVerticalHTML: '<div id="luckysheet-freezebar-vertical" class="luckysheet-freezebar" tabindex="0"><div class="luckysheet-freezebar-handle luckysheet-freezebar-vertical-handle" ><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-title" ></div><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-bar" ></div></div><div class="luckysheet-freezebar-drop luckysheet-freezebar-vertical-drop" ><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-title" ></div><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-bar" >&nbsp;</div></div></div>', initialHorizontal: !0, initialVertical: !0, horizontalmovestate: !1, horizontalmoveposition: null, verticalmovestate: !1, verticalmoveposition: null, windowHeight: null, windowWidth: null, freezenhorizontaldata: null, freezenverticaldata: null, cutVolumn: function (e, t) { if (t <= 0) return e; var a = e.slice(0, t); a[a.length - 1]; return e.slice(t) }, cancelFreezenVertical: function (e) { var t = gn().freezen; $("#luckysheet-freezen-btn-vertical").html('<i class="fa fa-indent"></i> ' + t.freezenColumn), this.freezenverticaldata = null; var a = $("#luckysheet-freezebar-vertical").is(":visible"); $("#luckysheet-freezebar-vertical").hide(), null == e && (e = ga.currentSheetIndex); var r = ga.luckysheetfile[_l(e)]; null != r.freezen && (r.freezen.vertical = null), null != r.frozen && a && pd.saveParam("all", e, r.frozen, { k: "frozen" }) }, createFreezenVertical: function (e, t) { var a = this; if (a.initialVertical) { a.initialVertical = !1, $("#luckysheet-grid-window-1").append(a.freezenVerticalHTML), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-drop").hover((function () { $(this).parent().addClass("luckysheet-freezebar-hover") }), (function () { $(this).parent().removeClass("luckysheet-freezebar-hover") })), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-drop").mousedown((function () { a.verticalmovestate = !0, a.verticalmoveposition = $(this).position().left, a.windowWidth = $("#luckysheet-grid-window-1").width(), $(this).parent().addClass("luckysheet-freezebar-active"), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-handle").css("cursor", "-webkit-grabbing") })); var r = $("#luckysheet-grid-window-1").height(); $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-handle").css({ height: r - 10, width: "4px", cursor: "-webkit-grab", top: "0px" }).end().find(".luckysheet-freezebar-vertical-drop").css({ height: r - 10, width: "4px", top: "0px", cursor: "-webkit-grab" }) } if (null == e) { var n = $("#luckysheet-cell-main").scrollLeft(), l = Ts(ga.visibledatacolumn, n); -1 == l && (l = 0), t = ga.visibledatacolumn[l] - 2 - n + ga.rowHeaderWidth, e = [ga.visibledatacolumn[l], l + 1, n, a.cutVolumn(ga.visibledatacolumn, l + 1), t], a.saveFreezen(null, null, e, t) } a.freezenverticaldata = e; var i = '\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n '.concat(gn().freezen.freezenCancel, "\n </div>\n </div>\n </div>\n "); $("#luckysheet-freezen-btn-horizontal").html(i), $("#luckysheet-freezebar-vertical").show().find(".luckysheet-freezebar-vertical-handle").css({ left: t }).end().find(".luckysheet-freezebar-vertical-drop").css({ left: t }) }, saveFreezen: function (e, t, a, r) { var n = ga.luckysheetfile[_l(ga.currentSheetIndex)]; null == n.freezen && (n.freezen = {}), null != e && (null == n.freezen.horizontal && (n.freezen.horizontal = {}), n.freezen.horizontal.freezenhorizontaldata = e, n.freezen.horizontal.top = t), null != a && (null == n.freezen.vertical && (n.freezen.vertical = {}), n.freezen.vertical.freezenverticaldata = a, n.freezen.vertical.left = r), null != n.frozen && pd.saveParam("all", ga.currentSheetIndex, n.frozen, { k: "frozen" }) }, initialFreezen: function (e) { this.frozenTofreezen(); var t = ga.luckysheetfile[_l(e)]; null != t.freezen && null != t.freezen.horizontal && null != t.freezen.horizontal.freezenhorizontaldata ? this.createFreezenHorizontal(t.freezen.horizontal.freezenhorizontaldata, t.freezen.horizontal.top) : this.cancelFreezenHorizontal(e), null != t.freezen && null != t.freezen.vertical && null != t.freezen.vertical.freezenverticaldata ? this.createFreezenVertical(t.freezen.vertical.freezenverticaldata, t.freezen.vertical.left) : this.cancelFreezenVertical(e), this.createAssistCanvas() }, changeFreezenIndex: function (e, t) { if ("v" == t && null != this.freezenverticaldata) { var a = this.freezenverticaldata[1], r = Ts(ga.visibledatacolumn, $("#luckysheet-cell-main").scrollLeft()); e - r < a && (e -= r) } else if ("h" == t && null != this.freezenhorizontaldata) { var n = this.freezenhorizontaldata[1], l = Ts(ga.visibledatarow, $("#luckysheet-cell-main").scrollTop()); e - l < n && (e -= l) } return e }, scrollFreezen: function () { var e, t, a = ga.luckysheet_select_save[0].row_focus; a == ga.luckysheet_select_save[0].row[0] ? e = ga.luckysheet_select_save[0].row[1] : a == ga.luckysheet_select_save[0].row[1] && (e = ga.luckysheet_select_save[0].row[0]); var r = ga.luckysheet_select_save[0].column_focus; if (r == ga.luckysheet_select_save[0].column[0] ? t = ga.luckysheet_select_save[0].column[1] : r == ga.luckysheet_select_save[0].column[1] && (t = ga.luckysheet_select_save[0].column[0]), null != this.freezenverticaldata) { var n = this.freezenverticaldata[1], l = Ts(this.freezenverticaldata[3], $("#luckysheet-cell-main").scrollLeft()), i = this.freezenverticaldata[4]; n += l, t >= ga.visibledatacolumn.length && (t = ga.visibledatacolumn.length - 1), n >= ga.visibledatacolumn.length && (n = ga.visibledatacolumn.length - 1), ga.visibledatacolumn[t] <= ga.visibledatacolumn[n] + i && (console.log(1111), setTimeout((function () { $("#luckysheet-scrollbar-x").scrollLeft(0) }), 100)) } if (null != this.freezenhorizontaldata) { var o = this.freezenhorizontaldata[1], s = Ts(this.freezenhorizontaldata[3], $("#luckysheet-cell-main").scrollTop()), c = this.freezenhorizontaldata[4]; o += s, e >= ga.visibledatarow.length && (e = ga.visibledatarow.length - 1), o >= ga.visibledatarow.length && (o = ga.visibledatarow.length - 1), ga.visibledatarow[e] <= ga.visibledatarow[o] + c && setTimeout((function () { $("#luckysheet-scrollbar-y").scrollTop(0) }), 100) } }, cancelFreezenHorizontal: function (e) { var t = '\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n '.concat(gn().freezen.default, "\n </div>\n </div>\n </div>\n "); $("#luckysheet-freezen-btn-horizontal").html(t), this.freezenhorizontaldata = null; var a = $("#luckysheet-freezebar-horizontal").is(":visible"); $("#luckysheet-freezebar-horizontal").hide(), null == e && (e = ga.currentSheetIndex); var r = ga.luckysheetfile[_l(e)]; null != r.freezen && (r.freezen.horizontal = null), null != r.frozen && a && pd.saveParam("all", e, r.frozen, { k: "frozen" }) }, createFreezenHorizontal: function (e, t) { var a = this; if (a.initialHorizontal) { a.initialHorizontal = !1, $("#luckysheet-grid-window-1").append(a.freezenHorizontalHTML), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-drop").hover((function () { $(this).parent().addClass("luckysheet-freezebar-hover") }), (function () { $(this).parent().removeClass("luckysheet-freezebar-hover") })), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-drop").mousedown((function () { a.horizontalmovestate = !0, a.horizontalmoveposition = $(this).position().top, a.windowHeight = $("#luckysheet-grid-window-1").height(), $(this).parent().addClass("luckysheet-freezebar-active"), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle").css("cursor", "-webkit-grabbing") })); var r = $("#luckysheet-grid-window-1").width(); $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle").css({ width: r - 10, height: "4px", cursor: "-webkit-grab", left: "0px" }).end().find(".luckysheet-freezebar-horizontal-drop").css({ width: r - 10, height: "4px", left: "0px", cursor: "-webkit-grab" }) } if (null == e) { var n = $("#luckysheet-cell-main").scrollTop(), l = Ts(ga.visibledatarow, n); -1 == l && (l = 0), t = ga.visibledatarow[l] - 2 - n + ga.columnHeaderHeight, e = [ga.visibledatarow[l], l + 1, n, a.cutVolumn(ga.visibledatarow, l + 1), t], a.saveFreezen(e, t, null, null) } a.freezenhorizontaldata = e; var i = '\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-dongjie1"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n '.concat(gn().freezen.freezenCancel, "\n </div>\n </div>\n </div>\n "); $("#luckysheet-freezen-btn-horizontal").html(i), $("#luckysheet-freezebar-horizontal").show().find(".luckysheet-freezebar-horizontal-handle").css({ top: t }).end().find(".luckysheet-freezebar-horizontal-drop").css({ top: t }) }, createAssistCanvas: function () { if (this.removeAssistCanvas(), null != this.freezenverticaldata || null != this.freezenhorizontaldata) { var e, t, a, r, n = ga.luckysheetTableContentHW[0], l = ga.luckysheetTableContentHW[1]; null != this.freezenverticaldata && null != this.freezenhorizontaldata ? (e = this.freezenhorizontaldata[0], this.freezenhorizontaldata[1], t = this.freezenhorizontaldata[2], a = this.freezenverticaldata[0], this.freezenverticaldata[1], r = this.freezenverticaldata[2], this.createCanvas("freezen_3", a - r, e - t + 1, ga.rowHeaderWidth - 1, ga.columnHeaderHeight - 1), this.createCanvas("freezen_4", n - a + r, e - t + 1, a - r + ga.rowHeaderWidth - 1, ga.columnHeaderHeight - 1), this.createCanvas("freezen_7", a - r, l - e + t - ga.columnHeaderHeight, ga.rowHeaderWidth - 1, e - t + ga.columnHeaderHeight - 1)) : null != this.freezenhorizontaldata ? (e = this.freezenhorizontaldata[0], this.freezenhorizontaldata[1], t = this.freezenhorizontaldata[2], this.createCanvas("freezen_h", n, e - t + 1, ga.rowHeaderWidth - 1, ga.columnHeaderHeight - 1)) : null != this.freezenverticaldata && (a = this.freezenverticaldata[0], this.freezenverticaldata[1], r = this.freezenverticaldata[2], this.createCanvas("freezen_v", a - r, l, ga.rowHeaderWidth - 1, ga.columnHeaderHeight - 1)), this.scrollAdapt() } }, createCanvas: function (e, t, a, r, n) { $("<canvas/>").appendTo("#luckysheet-grid-window-1").attr({ id: e, width: Math.ceil(t * ga.devicePixelRatio), height: Math.ceil(a * ga.devicePixelRatio) }).css({ "user-select": "none", postion: "absolute", left: r, top: n, width: t, height: a, "z-index": 10, "pointer-events": "none" }) }, removeAssistCanvas: function () { $("#luckysheet-grid-window-1 > canvas").not($("#luckysheetTableContent")).remove(), $("#luckysheet-cell-selected").css("z-index", 15) }, scrollAdapt: function () { if (null != ga.luckysheet_select_save && ga.luckysheet_select_save.length > 0 && this.scrollAdaptOfselect(), $("#luckysheet-cell-main .luckysheet-data-visualization-chart").length > 0) { var e = ga.luckysheetfile[_l(ga.currentSheetIndex)].chart; null != e && e.length > 0 && this.scrollAdaptOfchart() } $("#luckysheet-postil-showBoxs .luckysheet-postil-show").length > 0 && this.scrollAdaptOfpostil(), $("#luckysheet-dropCell-icon").length > 0 && this.scrollAdaptOfdpicon(), $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").length > 0 && this.scrollAdaptOffilteroptions() }, scrollAdaptOfselect: function () { $("#luckysheet-row-count-show").is(":visible") && $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").is(":visible") && $("#luckysheet-column-count-show").hide(), $("#luckysheet-rows-h-selected").empty(), $("#luckysheet-cols-h-selected").empty(); var e = $("#luckysheet-cell-main").scrollTop(), t = $("#luckysheet-cell-main").scrollLeft(); if (null != this.freezenhorizontaldata && null != this.freezenverticaldata) for (var a = this.freezenhorizontaldata[0], r = this.freezenhorizontaldata[1], n = e - this.freezenhorizontaldata[2], l = this.freezenverticaldata[0], i = this.freezenverticaldata[1], o = t - this.freezenverticaldata[2], s = 0; s < ga.luckysheet_select_save.length; s++) { var c = $.extend(!0, {}, ga.luckysheet_select_save[s]), u = c.row[0], d = c.row[1], h = ga.visibledatarow[d], m = u - 1 == -1 ? 0 : ga.visibledatarow[u - 1], p = m, f = h - m - 1, g = !0; u >= r ? p + f < a + n ? g = !1 : p < a + n ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ top: a + n, height: f - (a + n - p) }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ top: p, height: f }) : d >= r ? p + f < a + n ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ top: p + n, height: a - p }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ top: p + n, height: f - n }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css("top", p + n); var v = c.column[0], y = c.column[1], b = ga.visibledatacolumn[y], k = v - 1 == -1 ? 0 : ga.visibledatacolumn[v - 1], x = k, w = b - k - 1; if (v >= i ? x + w < l + o ? g = !1 : x < l + o ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ left: l + o, width: w - (l + o - x) }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ left: x, width: w }) : y >= i ? x + w < l + o ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ left: x + o, width: l - x }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css({ left: x + o, width: w - o }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).show().css("left", x + o), g || $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(s).hide(), s == ga.luckysheet_select_save.length - 1) { var _ = null == c.row_focus ? u : c.row_focus, C = null == c.column_focus ? v : c.column_focus, T = ga.visibledatarow[_], A = _ - 1 == -1 ? 0 : ga.visibledatarow[_ - 1], S = ga.visibledatacolumn[C], I = C - 1 == -1 ? 0 : ga.visibledatacolumn[C - 1], R = xm.mergeborer(ga.flowdata, _, C); R && (T = R.row[1], A = R.row[0], S = R.column[1], I = R.column[0]); var q = A, D = T - A - 1, F = I, E = S - I - 1, M = !0; q >= a ? q + D < a + n ? M = !1 : q < a + n ? $("#luckysheet-cell-selected-focus").show().css({ top: a + n, height: D - (a + n - q) }) : $("#luckysheet-cell-selected-focus").show().css({ top: q, height: D }) : q + D >= a ? q + D < a + n ? $("#luckysheet-cell-selected-focus").show().css({ top: q + n, height: a - q }) : $("#luckysheet-cell-selected-focus").show().css({ top: q + n, height: D - n }) : $("#luckysheet-cell-selected-focus").show().css("top", q + n), F >= l ? F + E < l + o ? M = !1 : F < l + o ? $("#luckysheet-cell-selected-focus").show().css({ left: l + o, width: E - (l + o - F) }) : $("#luckysheet-cell-selected-focus").show().css({ left: F, width: E }) : F + E >= l ? F + E < l + o ? $("#luckysheet-cell-selected-focus").show().css({ left: F + o, width: l - F }) : $("#luckysheet-cell-selected-focus").show().css({ left: F + o, width: E - o }) : $("#luckysheet-cell-selected-focus").show().css("left", F + o), M || $("#luckysheet-cell-selected-focus").hide() } } else if (null != this.freezenhorizontaldata) for (var N = this.freezenhorizontaldata[0], P = this.freezenhorizontaldata[1], z = e - this.freezenhorizontaldata[2], L = 0; L < ga.luckysheet_select_save.length; L++) { var O = $.extend(!0, {}, ga.luckysheet_select_save[L]), B = O.row[0], V = O.row[1], H = ga.visibledatarow[V], U = B - 1 == -1 ? 0 : ga.visibledatarow[B - 1], j = U, G = H - U - 1; if (B >= P ? j + G < N + z ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).hide() : j < N + z ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).show().css({ top: N + z, height: G - (N + z - j) }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).show().css({ top: j, height: G }) : V >= P ? j + G < N + z ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).show().css({ top: j + z, height: N - j }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).show().css({ top: j + z, height: G - z }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(L).show().css("top", j + z), L == ga.luckysheet_select_save.length - 1) { var W = null == O.row_focus ? B : O.row_focus, Y = null == O.column_focus ? O.column[0] : O.column_focus, X = ga.visibledatarow[W], K = W - 1 == -1 ? 0 : ga.visibledatarow[W - 1], Z = xm.mergeborer(ga.flowdata, W, Y); Z && (X = Z.row[1], K = Z.row[0]); var Q = K, J = X - K - 1; Q >= N ? Q + J < N + z ? $("#luckysheet-cell-selected-focus").hide() : Q < N + z ? $("#luckysheet-cell-selected-focus").show().css({ top: N + z, height: J - (N + z - Q) }) : $("#luckysheet-cell-selected-focus").show().css({ top: Q, height: J }) : Q + J >= N ? Q + J < N + z ? $("#luckysheet-cell-selected-focus").show().css({ top: Q + z, height: N - Q }) : $("#luckysheet-cell-selected-focus").show().css({ top: Q + z, height: J - z }) : $("#luckysheet-cell-selected-focus").show().css("top", Q + z) } } else if (null != this.freezenverticaldata) for (var ee = this.freezenverticaldata[0], te = this.freezenverticaldata[1], ae = t - this.freezenverticaldata[2], re = 0; re < ga.luckysheet_select_save.length; re++) { var ne = $.extend(!0, {}, ga.luckysheet_select_save[re]), le = ne.column[0], ie = ne.column[1], oe = ga.visibledatacolumn[ie], se = le - 1 == -1 ? 0 : ga.visibledatacolumn[le - 1], ce = se, ue = oe - se - 1; if (le >= te ? ce + ue < ee + ae ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).hide() : ce < ee + ae ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).show().css({ left: ee + ae, width: ue - (ee + ae - ce) }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).show().css({ left: ce, width: ue }) : ie >= te ? ce + ue < ee + ae ? $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).show().css({ left: ce + ae, width: ee - ce }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).show().css({ left: ce + ae, width: ue - ae }) : $("#luckysheet-cell-selected-boxs").find(".luckysheet-cell-selected").eq(re).show().css("left", ce + ae), re == ga.luckysheet_select_save.length - 1) { var de = null == ne.row_focus ? ne.row[0] : ne.row_focus, he = null == ne.column_focus ? le : ne.column_focus, me = ga.visibledatacolumn[he], pe = he - 1 == -1 ? 0 : ga.visibledatacolumn[he - 1], fe = xm.mergeborer(ga.flowdata, de, he); fe && (me = fe.column[1], pe = fe.column[0]); var ge = pe, ve = me - pe - 1; ge >= ee ? ge + ve < ee + ae ? $("#luckysheet-cell-selected-focus").hide() : ge < ee + ae ? $("#luckysheet-cell-selected-focus").show().css({ left: ee + ae, width: ve - (ee + ae - ge) }) : $("#luckysheet-cell-selected-focus").show().css({ left: ge, width: ve }) : ge + ve >= ee ? ge + ve < ee + ae ? $("#luckysheet-cell-selected-focus").show().css({ left: ge + ae, width: ee - ge }) : $("#luckysheet-cell-selected-focus").show().css({ left: ge + ae, width: ve - ae }) : $("#luckysheet-cell-selected-focus").show().css("left", ge + ae) } } else Rh() }, scrollAdaptOfchart: function () { var e = $("#luckysheet-cell-main").scrollTop(), t = $("#luckysheet-cell-main").scrollLeft(); if (null != this.freezenhorizontaldata && null != this.freezenverticaldata) { var a = this.freezenhorizontaldata[0] - this.freezenhorizontaldata[2], r = this.freezenverticaldata[0] - this.freezenverticaldata[2]; $("#luckysheet-cell-main .luckysheet-data-visualization-chart").each((function (n, l) { var i = $(l).position(), o = $(l).width(), s = $(l).height(), c = $(l).find("canvas").width(), u = $(l).find("canvas").height(), d = u - s, h = c - o; if (i.top - d < a) { var m = a - (i.top - d); m > u + 40 + 2 ? $(l).css("visibility", "hidden") : ($(l).css({ top: a + e, height: u - m, visibility: "visible" }), $(l).find("canvas").css("top", -m)) } else $(l).css({ top: i.top - d + e, height: u, visibility: "visible" }), $(l).find("canvas").css("top", 0); if (i.left - h < r) { var p = r - (i.left - h); p > c + 20 + 2 ? $(l).css("visibility", "hidden") : ($(l).css({ left: r + t, width: c - p, visibility: "visible" }), $(l).find("canvas").css("left", -p)) } else $(l).css({ left: i.left - h + t, width: c, visibility: "visible" }), $(l).find("canvas").css("left", 0) })) } else if (null != this.freezenhorizontaldata) { var n = this.freezenhorizontaldata[0] - this.freezenhorizontaldata[2]; $("#luckysheet-cell-main .luckysheet-data-visualization-chart").each((function (t, a) { var r = $(a).position(), l = $(a).height(), i = $(a).find("canvas").height(), o = i - l; if (r.top - o < n) { var s = n - (r.top - o); s > i + 40 + 2 ? $(a).css("visibility", "hidden") : ($(a).css({ top: n + e, height: i - s, visibility: "visible" }), $(a).find("canvas").css("top", -s)) } else $(a).css({ top: r.top - o + e, height: i, visibility: "visible" }), $(a).find("canvas").css("top", 0) })) } else if (null != this.freezenverticaldata) { var l = this.freezenverticaldata[0] - this.freezenverticaldata[2]; $("#luckysheet-cell-main .luckysheet-data-visualization-chart").each((function (e, a) { var r = $(a).position(), n = $(a).width(), i = $(a).find("canvas").width(), o = i - n; if (r.left - o < l) { var s = l - (r.left - o); s > i + 20 + 2 ? $(a).css("visibility", "hidden") : ($(a).css({ left: l + t, width: i - s, visibility: "visible" }), $(a).find("canvas").css("left", -s)) } else $(a).css({ left: r.left - o + t, width: i, visibility: "visible" }), $(a).find("canvas").css("left", 0) })) } else $("#luckysheet-cell-main .luckysheet-data-visualization-chart").each((function (a, r) { var n = $(r).position(), l = $(r).width(), i = $(r).height(), o = $(r).find("canvas").width(), s = $(r).find("canvas").height(), c = s - i, u = o - l; $(r).css({ top: n.top - c + e, height: s, left: n.left - u + t, width: o, visibility: "visible" }), $(r).find("canvas").css({ top: 0, left: 0 }) })) }, scrollAdaptOfpostil: function () { var e = this, t = $("#luckysheet-cell-main").scrollTop(), a = $("#luckysheet-cell-main").scrollLeft(); if (null != e.freezenhorizontaldata && null != e.freezenverticaldata) { var r = e.freezenhorizontaldata[0], n = e.freezenverticaldata[0], l = t - e.freezenhorizontaldata[2], i = a - e.freezenverticaldata[2]; $("#luckysheet-postil-showBoxs .luckysheet-postil-show").each((function (t, a) { var o = $(a).attr("id"), s = o.split("luckysheet-postil-show_")[1].split("_")[0], c = o.split("luckysheet-postil-show_")[1].split("_")[1], u = ga.flowdata[s][c].ps, d = (ga.visibledatarow[s], s - 1 == -1 ? 0 : ga.visibledatarow[s - 1]), h = ga.visibledatacolumn[c], m = (c - 1 == -1 || ga.visibledatacolumn[c - 1], xm.mergeborer(ga.flowdata, s, c)); m && (m.row[1], d = m.row[0], h = m.column[1], m.column[0]); var p = h, f = d, g = null == u.left ? p + 18 : u.left, v = null == u.top ? f - 18 : u.top, y = null == u.width ? Pc.defaultWidth : u.width, b = null == u.height ? Pc.defaultHeight : u.height; v < 0 && (v = 2); var k = Pc.getArrowCanvasSize(g, v, p, f), x = !0, w = !0; s >= e.freezenhorizontaldata[1] ? v + b < r ? ($(a).show().find(".luckysheet-postil-show-main").css("top", v + l), $(a).show().find(".arrowCanvas").css("top", k[1] + l)) : v < r + l ? v + b <= r + l ? x = !1 : ($(a).show().find(".luckysheet-postil-show-main").css({ top: r + l, height: b - (r + l - v) }), $(a).show().find(".formulaInputFocus").css("margin-top", -(r + l - v)), $(a).show().find(".arrowCanvas").hide(), w = !1) : ($(a).show().find(".luckysheet-postil-show-main").css({ top: v, height: b }), $(a).show().find(".formulaInputFocus").css("margin-top", 0), $(a).show().find(".arrowCanvas").css("top", k[1])) : ($(a).show().find(".luckysheet-postil-show-main").css("top", v + l), $(a).show().find(".arrowCanvas").css("top", k[1] + l)), c >= e.freezenverticaldata[1] ? g + y < n ? ($(a).show().find(".luckysheet-postil-show-main").css("left", g + i), $(a).show().find(".arrowCanvas").css("left", k[0] + i)) : g < n + i ? g + y <= n + i ? x = !1 : ($(a).show().find(".luckysheet-postil-show-main").css({ left: n + i, width: y - (n + i - g) }), $(a).show().find(".formulaInputFocus").css("margin-left", -(n + i - g)), $(a).show().find(".arrowCanvas").hide(), w = !1) : ($(a).show().find(".luckysheet-postil-show-main").css({ left: g, width: y }), $(a).show().find(".formulaInputFocus").css("margin-left", 0), $(a).show().find(".arrowCanvas").css("left", k[0])) : ($(a).show().find(".luckysheet-postil-show-main").css("left", g + i), $(a).show().find(".arrowCanvas").css("left", k[0] + i)), x || $(a).hide(), x && w && $(a).show().find(".arrowCanvas").show() })) } else if (null != e.freezenhorizontaldata) { var o = e.freezenhorizontaldata[0], s = t - e.freezenhorizontaldata[2]; $("#luckysheet-postil-showBoxs .luckysheet-postil-show").each((function (t, a) { var r = $(a).attr("id"), n = r.split("luckysheet-postil-show_")[1].split("_")[0], l = r.split("luckysheet-postil-show_")[1].split("_")[1], i = ga.flowdata[n][l].ps, c = (ga.visibledatarow[n], n - 1 == -1 ? 0 : ga.visibledatarow[n - 1]), u = ga.visibledatacolumn[l], d = (l - 1 == -1 || ga.visibledatacolumn[l - 1], xm.mergeborer(ga.flowdata, n, l)); d && (d.row[1], c = d.row[0], u = d.column[1], d.column[0]); var h = u, m = c, p = null == i.left ? h + 18 : i.left, f = null == i.top ? m - 18 : i.top, g = (null == i.width ? Pc.defaultWidth : i.width, null == i.height ? Pc.defaultHeight : i.height); f < 0 && (f = 2); var v = Pc.getArrowCanvasSize(p, f, h, m); n >= e.freezenhorizontaldata[1] ? f + g < o ? ($(a).show().find(".luckysheet-postil-show-main").css("top", f + s), $(a).show().find(".arrowCanvas").css("top", v[1] + s)) : f < o + s ? f + g <= o + s ? $(a).hide() : ($(a).show().find(".luckysheet-postil-show-main").css({ top: o + s, height: g - (o + s - f) }), $(a).show().find(".formulaInputFocus").css("margin-top", -(o + s - f)), $(a).show().find(".arrowCanvas").hide()) : Pc.buildPs(n, l, i) : ($(a).show().find(".luckysheet-postil-show-main").css("top", f + s), $(a).show().find(".arrowCanvas").css("top", v[1] + s)) })) } else if (null != e.freezenverticaldata) { var c = e.freezenverticaldata[0], u = a - e.freezenverticaldata[2]; $("#luckysheet-postil-showBoxs .luckysheet-postil-show").each((function (t, a) { var r = $(a).attr("id"), n = r.split("luckysheet-postil-show_")[1].split("_")[0], l = r.split("luckysheet-postil-show_")[1].split("_")[1], i = ga.flowdata[n][l].ps, o = (ga.visibledatarow[n], n - 1 == -1 ? 0 : ga.visibledatarow[n - 1]), s = ga.visibledatacolumn[l], d = (l - 1 == -1 || ga.visibledatacolumn[l - 1], xm.mergeborer(ga.flowdata, n, l)); d && (d.row[1], o = d.row[0], s = d.column[1], d.column[0]); var h = s, m = o, p = null == i.left ? h + 18 : i.left, f = null == i.top ? m - 18 : i.top, g = null == i.width ? Pc.defaultWidth : i.width; null == i.height ? Pc.defaultHeight : i.height; f < 0 && (f = 2); var v = Pc.getArrowCanvasSize(p, f, h, m); l >= e.freezenverticaldata[1] ? p + g < c ? ($(a).show().find(".luckysheet-postil-show-main").css("left", p + u), $(a).show().find(".arrowCanvas").css("left", v[0] + u)) : p < c + u ? p + g <= c + u ? $(a).hide() : ($(a).show().find(".luckysheet-postil-show-main").css({ left: c + u, width: g - (c + u - p) }), $(a).show().find(".formulaInputFocus").css("margin-left", -(c + u - p)), $(a).show().find(".arrowCanvas").hide()) : Pc.buildPs(n, l, i) : ($(a).show().find(".luckysheet-postil-show-main").css("left", p + u), $(a).show().find(".arrowCanvas").css("left", v[0] + u)) })) } else $("#luckysheet-postil-showBoxs .luckysheet-postil-show").each((function (e, t) { var a = $(t).attr("id"), r = a.split("luckysheet-postil-show_")[1].split("_")[0], n = a.split("luckysheet-postil-show_")[1].split("_")[1], l = ga.flowdata[r][n].ps; Pc.buildPs(r, n, l) })) }, scrollAdaptOfdpicon: function () { var e, t, a = Oc.copyRange.row[1], r = Oc.copyRange.column[1], n = Oc.applyRange.row[1], l = Oc.applyRange.column[1]; if (n >= a && l >= r ? (e = n, t = l) : (e = a, t = r), null != this.freezenhorizontaldata && null != this.freezenverticaldata) { var i = this.freezenhorizontaldata[1], o = Ts(this.freezenhorizontaldata[3], $("#luckysheet-cell-main").scrollTop() - this.freezenhorizontaldata[2]), s = this.freezenverticaldata[1], c = Ts(this.freezenverticaldata[3], $("#luckysheet-cell-main").scrollLeft() - this.freezenverticaldata[2]); if (e >= i && t >= s) e < i + o - 1 || t < s + c - 1 ? $("#luckysheet-dropCell-icon").hide() : $("#luckysheet-dropCell-icon").show(); else if (e >= i) if (e < i + o - 1) $("#luckysheet-dropCell-icon").hide(); else { var u = Is(t + c)[1]; $("#luckysheet-dropCell-icon").show().css("left", u) } else if (t >= s) if (t < s + c - 1) $("#luckysheet-dropCell-icon").hide(); else { var d = As(e + o)[1]; $("#luckysheet-dropCell-icon").show().css("top", d) } else { var h = As(e + o)[1], m = Is(t + c)[1]; $("#luckysheet-dropCell-icon").show().css({ left: m, top: h }) } } else if (null != this.freezenhorizontaldata) { var p = this.freezenhorizontaldata[1], f = Ts(this.freezenhorizontaldata[3], $("#luckysheet-cell-main").scrollTop() - this.freezenhorizontaldata[2]); if (e >= p) e < p + f - 1 ? $("#luckysheet-dropCell-icon").hide() : $("#luckysheet-dropCell-icon").show(); else { var g = As(e + f)[1]; $("#luckysheet-dropCell-icon").show().css("top", g) } } else if (null != this.freezenverticaldata) { var v = this.freezenverticaldata[1], y = Ts(this.freezenverticaldata[3], $("#luckysheet-cell-main").scrollLeft() - this.freezenverticaldata[2]); if (t >= v) t < v + y - 1 ? $("#luckysheet-dropCell-icon").hide() : $("#luckysheet-dropCell-icon").show(); else { var b = Is(t + y)[1]; $("#luckysheet-dropCell-icon").show().css("left", b) } } else { var k = As(e)[1], x = Is(t)[1]; $("#luckysheet-dropCell-icon").show().css({ left: x, top: k }) } }, scrollAdaptOffilteroptions: function () { if (null != this.freezenhorizontaldata && null != this.freezenverticaldata) { var e = this.freezenhorizontaldata[1], t = this.freezenhorizontaldata[0] + $("#luckysheet-cell-main").scrollTop(), a = this.freezenverticaldata[1], r = Ts(this.freezenverticaldata[3], $("#luckysheet-cell-main").scrollLeft() - this.freezenverticaldata[2]); $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function (n, l) { var i = $(l).data("str"), o = i - 1 == -1 ? 0 : ga.visibledatarow[i - 1], s = $(l).data("cindex"); if (i >= e && s >= a) o < t || s < a + r ? $(l).hide() : $(l).show(); else if (i >= e) if (o < t) $(l).hide(); else { var c = ga.visibledatacolumn[s + r] - 20; $(l).show().css("left", c) } else if (s >= a) s < a + r ? $(l).hide() : $(l).show().css("top", o + $("#luckysheet-cell-main").scrollTop()); else { var u = ga.visibledatacolumn[s + r] - 20; $(l).show().css({ left: u, top: o + $("#luckysheet-cell-main").scrollTop() }) } })) } else if (null != this.freezenhorizontaldata) { var n = this.freezenhorizontaldata[1], l = this.freezenhorizontaldata[0] + $("#luckysheet-cell-main").scrollTop(); $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function (e, t) { var a = $(t).data("str"), r = a - 1 == -1 ? 0 : ga.visibledatarow[a - 1]; a >= n ? r < l ? $(t).hide() : $(t).show() : $(t).show().css("top", r + $("#luckysheet-cell-main").scrollTop()) })) } else if (null != this.freezenverticaldata) { var i = this.freezenverticaldata[1], o = Ts(this.freezenverticaldata[3], $("#luckysheet-cell-main").scrollLeft() - this.freezenverticaldata[2]); $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function (e, t) { var a = $(t).data("cindex"); if (a >= i) a < i + o ? $(t).hide() : $(t).show(); else { var r = ga.visibledatacolumn[a + o] - 20; $(t).show().css("left", r) } })) } else $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex).empty(), Sc(ga.luckysheetfile[_l(ga.currentSheetIndex)].filter_select) }, saveFrozen: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; null == t && (t = _l(ga.currentSheetIndex)); var r = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], n = null == r.row_focus ? r.row[0] : r.row_focus, l = null == r.column_focus ? r.column[0] : r.column_focus, i = { row_focus: a.row_focus || n, column_focus: a.column_focus || l }, o = { freezenRow: { type: "row" }, freezenColumn: { type: "column" }, freezenRC: { type: "both" }, freezenRowRange: { type: "rangeRow", range: i }, freezenColumnRange: { type: "rangeColumn", range: i }, freezenRCRange: { type: "rangeBoth", range: i }, freezenCancel: { type: "cancel" } }; ga.luckysheetfile[t].frozen = o[e] }, frozenTofreezen: function () { var e = ga.luckysheetfile[_l(ga.currentSheetIndex)], t = e.frozen; if (null != t) { var a = null; if ("row" === t.type) { var r = Ts(ga.visibledatarow, 0); -1 == r && (r = 0); var n = ga.visibledatarow[r] - 2 - 0 + ga.columnHeaderHeight; a = { horizontal: { freezenhorizontaldata: [ga.visibledatarow[r], r + 1, 0, Bc.cutVolumn(ga.visibledatarow, r + 1), n], top: n } } } else if ("column" === t.type) { var l = Ts(ga.visibledatacolumn, 0); -1 == l && (l = 0); var i = ga.visibledatacolumn[l] - 2 - 0 + ga.rowHeaderWidth; a = { vertical: { freezenverticaldata: [ga.visibledatacolumn[l], l + 1, 0, Bc.cutVolumn(ga.visibledatacolumn, l + 1), i], left: i } } } else if ("both" === t.type) { var o = Ts(ga.visibledatarow, 0); -1 == o && (o = 0); var s = ga.visibledatarow[o] - 2 - 0 + ga.columnHeaderHeight, c = [ga.visibledatarow[o], o + 1, 0, Bc.cutVolumn(ga.visibledatarow, o + 1), s], u = Ts(ga.visibledatacolumn, 0); -1 == u && (u = 0); var d = ga.visibledatacolumn[u] - 2 - 0 + ga.rowHeaderWidth; a = { horizontal: { freezenhorizontaldata: c, top: s }, vertical: { freezenverticaldata: [ga.visibledatacolumn[u], u + 1, 0, Bc.cutVolumn(ga.visibledatacolumn, u + 1), d], left: d } } } else if ("rangeRow" === t.type) { var h = Ts(ga.visibledatarow, 0), m = t.range.row_focus; m > h && (h = m), -1 == h && (h = 0); var p = ga.visibledatarow[h] - 2 - 0 + ga.columnHeaderHeight; a = { horizontal: { freezenhorizontaldata: [ga.visibledatarow[h], h + 1, 0, Bc.cutVolumn(ga.visibledatarow, h + 1), p], top: p } } } else if ("rangeColumn" === t.type) { var f = Ts(ga.visibledatacolumn, 0), g = t.range.column_focus; g > f && (f = g), -1 == f && (f = 0); var v = ga.visibledatacolumn[f] - 2 - 0 + ga.rowHeaderWidth; a = { vertical: { freezenverticaldata: [ga.visibledatacolumn[f], f + 1, 0, Bc.cutVolumn(ga.visibledatacolumn, f + 1), v], left: v } } } else if ("rangeBoth" === t.type) { var y = Ts(ga.visibledatarow, 0), b = t.range.row_focus; b > y && (y = b), -1 == y && (y = 0); var k = ga.visibledatarow[y] - 2 - 0 + ga.columnHeaderHeight, x = [ga.visibledatarow[y], y + 1, 0, Bc.cutVolumn(ga.visibledatarow, y + 1), k], w = Ts(ga.visibledatacolumn, 0), _ = t.range.column_focus; _ > w && (w = _), -1 == w && (w = 0); var C = ga.visibledatacolumn[w] - 2 - 0 + ga.rowHeaderWidth; a = { horizontal: { freezenhorizontaldata: x, top: k }, vertical: { freezenverticaldata: [ga.visibledatacolumn[w], w + 1, 0, Bc.cutVolumn(ga.visibledatacolumn, w + 1), C], left: C } } } else "cancel" === t.type && (a = { horizontal: null, vertical: null }); e.freezen = a } } }, Vc = 0, Hc = 0; function Uc() { var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; fa.showinfobar ? ($("#luckysheet_info_detail").show(), ga.infobarHeight = document.querySelector("#luckysheet_info_detail").offsetHeight) : (ga.infobarHeight = 0, $("#luckysheet_info_detail").hide()), ga.toobarObject && ga.toobarObject.toobarElements && 0 === ga.toobarObject.toobarElements.length ? ($("#" + ga.container).find(".luckysheet-wa-editor").hide(), ga.toolbarHeight = 0) : ($("#" + ga.container).find(".luckysheet-wa-editor").show(), ga.toolbarHeight = document.querySelector("#" + ga.container + " .luckysheet-wa-editor").offsetHeight), Gc(), Wc(); var t = document.querySelector("#" + ga.container + " .luckysheet-wa-calculate"); fa.sheetFormulaBar ? (t.style.display = "block", ga.calculatebarHeight = t.offsetHeight) : (t.style.display = "none", ga.calculatebarHeight = 0), $("#" + ga.container).find(".luckysheet-grid-container").css("top", ga.toolbarHeight + ga.infobarHeight + ga.calculatebarHeight), Vc = $("#" + ga.container).width(), fa.showConfigWindowResize && ($("#luckysheet-modal-dialog-slider-pivot").is(":visible") ? Vc -= $("#luckysheet-modal-dialog-slider-pivot").outerWidth() : $(".chartSetting").is(":visible") ? Vc -= $(".chartSetting").outerWidth() : $("#luckysheet-modal-dialog-slider-alternateformat").is(":visible") && (Vc -= $("#luckysheet-modal-dialog-slider-alternateformat").outerWidth()), $("#luckysheet-modal-dialog-slider-protection").is(":visible") && (Vc -= $("#luckysheet-modal-dialog-slider-protection").outerWidth())); var a = gn(), r = a.toolbar, n = !1, l = '<div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="'.concat(r.toolMoreTip, '" id="luckysheet-icon-morebtn" role="button" style="user-select: none;"> \n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block" style="user-select: none;"> \n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block" style="user-select: none;">\n\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">\n ').concat(r.toolMore, '\n </div> \n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige" style="user-select: none;font-size:12px;">\n </div>\n\n </div> \n </div>\n </div>'), i = '<div id="luckysheet-icon-morebtn-div" class="luckysheet-wa-editor" style="position:absolute;top:' + (ga.infobarHeight + ga.toolbarHeight + $("#" + ga.container).offset().top + $("body").scrollTop()) + 'px; right:0px;z-index:1003;padding:5.5px;display:none;height:auto;white-space:initial;"></div>'; 0 == $("#luckysheet-icon-morebtn-div").length && $("body").append(i), $("#luckysheet-icon-morebtn-div").hide(), $("#luckysheet-icon-morebtn-div > div").each((function () { var e = $(this)[0], t = $("#luckysheet-wa-editor")[0]; t.appendChild(document.createTextNode(" ")), t.appendChild(e) })), $("#luckysheet-icon-morebtn").remove(); var o = ga.toobarObject.toobarWidths, s = ga.toobarObject.toobarElements, c = 0; if (null != o) { for (var u = o.length - 1; u >= 0; u--)if (o[u] < Vc - 90) { (c = u) < o.length - 1 && (n = !0); break } for (var d = c; d < s.length; d++) { var h = s[d]; if (h instanceof Array) { var m, p = Ma(h); try { for (p.s(); !(m = p.n()).done;) { var f = m.value; $("#luckysheet-icon-morebtn-div").append($("".concat(f))) } } catch (e) { p.e(e) } finally { p.f() } } else $("#luckysheet-icon-morebtn-div").append($("".concat(h))) } n && ($("#luckysheet-wa-editor").append(l), $("#luckysheet-icon-morebtn").click((function () { var e = $(window).width() - $("#luckysheet-icon-morebtn").offset().left - $("#luckysheet-icon-morebtn").width() + $("body").scrollLeft(); if ($("#luckysheet-icon-morebtn-div").toggle().css("right", e < 0 ? 0 : e), $(this).find(".luckysheet-toolbar-menu-button-caption").text().indexOf(r.toolMore) > -1) { var t = '\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">\n '.concat(r.toolClose, '\n </div> \n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-shangyige" style="user-select: none;font-size:12px;">\n </div>\n '); $(this).find(".luckysheet-toolbar-button-inner-box").html(t) } else { var a = '\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block" style="user-select: none;">\n '.concat(r.toolMore, '\n </div> \n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige" style="user-select: none;font-size:12px;">\n </div>\n '); $(this).find(".luckysheet-toolbar-button-inner-box").html(a) } })), $("#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left").off("hover").hover((function () { $(this).next(".luckysheet-toolbar-button-split-right").addClass("luckysheet-toolbar-button-split-right-hover") }), (function () { $(this).next(".luckysheet-toolbar-button-split-right").removeClass("luckysheet-toolbar-button-split-right-hover") })), $("#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-right").off("hover").hover((function () { $(this).prev(".luckysheet-toolbar-button-split-left").addClass("luckysheet-toolbar-button-hover") }), (function () { $(this).prev(".luckysheet-toolbar-button-split-left").removeClass("luckysheet-toolbar-button-hover") })), fd.createHoverTip("#luckysheet-icon-morebtn-div", ".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button")), $("#" + ga.container + " .luckysheet-wa-editor .luckysheet-toolbar-button-split-left").off("hover").hover((function () { $(this).next(".luckysheet-toolbar-button-split-right").addClass("luckysheet-toolbar-button-split-right-hover") }), (function () { $(this).next(".luckysheet-toolbar-button-split-right").removeClass("luckysheet-toolbar-button-split-right-hover") })), $("#" + ga.container + " .luckysheet-wa-editor .luckysheet-toolbar-button-split-right").off("hover").hover((function () { $(this).prev(".luckysheet-toolbar-button-split-left").addClass("luckysheet-toolbar-button-hover") }), (function () { $(this).prev(".luckysheet-toolbar-button-split-left").removeClass("luckysheet-toolbar-button-hover") })), Hc = $("#" + ga.container).height(), $("#" + ga.container).find(".luckysheet").height(Hc - 2).width(Vc - 2), jc(Vc, Hc), e && md($("#luckysheet-cell-main").scrollLeft(), $("#luckysheet-cell-main").scrollTop()), Sh.sheetArrowShowAndHide(), Sh.sheetBarShowAndHide() } } function jc(e, t) { null == e && (e = $("#" + ga.container).width()), null == t && (t = $("#" + ga.container).height()), ga.cellmainHeight = t - (ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight + ga.sheetBarHeight + ga.statisticBarHeight), ga.cellmainWidth = e - ga.rowHeaderWidth, $("#luckysheet-cols-h-c, #luckysheet-cell-main").width(ga.cellmainWidth), $("#luckysheet-cell-main").height(ga.cellmainHeight), $("#luckysheet-rows-h").height(ga.cellmainHeight - ga.cellMainSrollBarSize), $("#luckysheet-scrollbar-y").height(ga.cellmainHeight + ga.columnHeaderHeight - ga.cellMainSrollBarSize - 3), $("#luckysheet-scrollbar-x").height(ga.cellMainSrollBarSize), $("#luckysheet-scrollbar-y").width(ga.cellMainSrollBarSize), $("#luckysheet-scrollbar-x").width(ga.cellmainWidth).css("left", ga.rowHeaderWidth - 2), ga.luckysheetTableContentHW = [ga.cellmainWidth + ga.rowHeaderWidth - ga.cellMainSrollBarSize, ga.cellmainHeight + 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] }), $("#" + ga.container).find("#luckysheet-grid-window-1").css("bottom", ga.sheetBarHeight), $("#" + ga.container).find(".luckysheet-grid-window").css("bottom", ga.statisticBarHeight); var a = $("#luckysheet-grid-window-1").width(); $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle").css({ width: a - 10 }).end().find(".luckysheet-freezebar-horizontal-drop").css({ width: a - 10 }); var r = $("#luckysheet-grid-window-1").height(); $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-handle").css({ height: r - 10 }).end().find(".luckysheet-freezebar-vertical-drop").css({ height: r - 10 }), Bc.createAssistCanvas() } function Gc() { if (!fa.initShowsheetbarConfig) { fa.initShowsheetbarConfig = !0; var e = { add: !0, menu: !0, sheet: !0 }; if (!fa.showsheetbar) for (var t in e) e[t] = !1; "{}" !== JSON.stringify(fa.showsheetbarConfig) && Object.assign(e, fa.showsheetbarConfig), fa.showsheetbarConfig = e } var a = fa.showsheetbarConfig, r = 0; for (var n in a) if (!a[n]) switch (n) { case "add": $("#luckysheet-sheets-add").hide(), r++; break; case "menu": $("#luckysheet-sheets-m").hide(), r++; break; case "sheet": $("#luckysheet-sheet-container").hide(), $("#luckysheet-sheets-leftscroll").hide(), $("#luckysheet-sheets-rightscroll").hide(), r++ }3 === r ? ($("#" + ga.container).find("#luckysheet-sheet-area").hide(), ga.sheetBarHeight = 0) : ($("#" + ga.container).find("#luckysheet-sheet-area").show(), ga.sheetBarHeight = 31) } function Wc() { if (!fa.initStatisticBarConfig) { fa.initStatisticBarConfig = !0; var e = { count: !0, view: !0, zoom: !0 }; if (!fa.showstatisticBar) for (var t in e) e[t] = !1; "{}" !== JSON.stringify(fa.showstatisticBarConfig) && Object.assign(e, fa.showstatisticBarConfig), fa.showstatisticBarConfig = e } var a = fa.showstatisticBarConfig, r = 0; for (var n in a) if (!a[n]) switch (n) { case "count": $("#luckysheet-sta-content").hide(), r++; break; case "view": $(".luckysheet-print-viewList").hide(), r++; break; case "zoom": $("#luckysheet-zoom-content").hide(), r++ }3 === r ? ($("#" + ga.container).find(".luckysheet-stat-area").hide(), ga.statisticBarHeight = 0) : ($("#" + ga.container).find(".luckysheet-stat-area").show(), ga.statisticBarHeight = 23) } var Yc = !1, Xc = !1, Kc = [], Zc = !0, Qc = null, Jc = null, eu = null, tu = !0, au = {}, ru = !1, nu = ["selectLockedCells", "selectunLockedCells", "formatCells", "formatColumns", "formatRows", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "sort", "filter", "usePivotTablereports", "editObjects", "editScenarios"]; function lu(e) { var t = gn(), a = t.protection, r = t.button, n = e.name, l = e.sqref, i = e.password, o = ""; null != i && i.length > 0 && (o = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="' + a.rangeItemHasPassword + '"></i>'); var s = '\n <div class="luckysheet-protection-rangeItem" title="'.concat(a.rangeItemDblclick, '">\n <div class="luckysheet-protection-rangeItem-del" title="').concat(r.delete, '">\n <i class="icon iconfont luckysheet-iconfont-shanchu"></i>\n </div>\n <div class="luckysheet-protection-rangeItem-name" title="').concat(n, '">\n ').concat(n).concat(o, '\n </div>\n <div class="luckysheet-protection-rangeItem-range" title="').concat(l, '">\n ').concat(l, '\n </div>\n <div class="luckysheet-protection-rangeItem-update" title="').concat(r.update, '">\n <i class="icon iconfont luckysheet-iconfont-bianji"></i>\n </div>\n </div>\n '); $("#luckysheet-protection-rangeItem-container").append(s) } function iu(e) { if (!Xc) { Xc = !0; var t = gn(), a = t.protection, r = t.button; $("body").append(_m(bn, { id: "luckysheet-protection-rangeItem-dialog", addclass: "luckysheet-protection-rangeItem-dialog", title: a.allowRangeTitle, content: '\n <div class="luckysheet-protection-rangeItem-content">\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">\n '.concat(a.allowRangeAddTitle, '\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">\n <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-title" placeHolder="').concat(a.allowRangeAddtitleDefault, '">\n </div>\n </div>\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">\n ').concat(a.allowRangeAddSqrf, '\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">\n <div id="protection-allowRangeAdd-range" class="range">\n <input class="formulaInputFocus" spellcheck="false" placeHolder="').concat(a.selectCellRangeHolder, '">\n <i class="fa fa-table" aria-hidden="true" title="').concat(a.selectCellRange, '"></i>\n </div>\n </div>\n </div>\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">\n ').concat(a.allowRangeAddTitlePassword, '\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">\n <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-password" placeHolder="').concat(a.enterPassword, '">\n </div>\n </div>\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">\n ').concat(a.allowRangeAddTitleHint, '\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">\n <textarea class="luckysheet-protection-rangeItemTextarea" id="protection-allowRangeAdd-hint" placeHolder="').concat(a.allowRangeAddTitleHintTitle, '"></textarea>\n </div>\n </div>\n </div>\n '), botton: '<button id="luckysheet-protection-rangeItem-confirm" class="btn btn-primary">'.concat(r.insert, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(r.cancel, "</button>"), style: "z-index:100003" })) } } function ou(e) { null == e && (e = {}); for (var t = 0; t < nu.length; t++) { var a = nu[t], r = "luckysheet-protection-check-" + a, n = e[a]; null == n && (n = 0), null == n && a in { selectLockedCells: 1, selectunLockedCells: 1 } && (n = 1), $("#" + r).prop("checked", 1 == n) } null != e.password && e.password.length > 0 ? "None" == e.algorithmName || null == e.algorithmName ? $("#protection-password").val(e.password) : $("#protection-password").val("••••••••") : $("#protection-password").val(""); var l = e.sheet; null == e.sheet && (l = 0), $("#protection-swichProtectionState").prop("checked", 1 == l); var i = e.hintText; null == i && (i = ""), $("#protection-hint").val(i), Kc = [], $("#luckysheet-protection-rangeItem-container").empty(); var o = e.allowRangeList; if (null != o && o.length > 0) for (var s = 0; s < o.length; s++) { var c = o[s]; lu(c), Kc.push(c) } } function su(e) { var t, a, r; if (Yc || (!function (e) { for (var t = gn(), a = t.protection, r = t.button, n = "", l = 0; l < nu.length; l++) { var i = nu[l]; n += '\n <div class="luckysheet-slider-protection-row" style="height:18px;">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n <label for="luckysheet-protection-check-'.concat(i, '"><input id="luckysheet-protection-check-').concat(i, '" name="luckysheet-protection-check-').concat(i, '" type="checkbox">').concat(a[i], "</label>\n </div>\n </div>\n ") } var o = '\n <div id="luckysheet-modal-dialog-slider-protection" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot" style="display:none;">\n <div class="luckysheet-modal-dialog-slider-title"> <span>'.concat(a.protectiontTitle, '</span> <span id="luckysheet-modal-dialog-protection-close" title="').concat(r.close, '"><i class="fa fa-times" aria-hidden="true"></i></span> </div>\n <div class="luckysheet-modal-dialog-slider-content">\n <div class="luckysheet-slider-protection-config" style="top:10px;height:115px">\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n <label for="protection-swichProtectionState"><input id="protection-swichProtectionState" name="protection-swichProtectionState" type="checkbox">').concat(a.swichProtectionTip, '</label>\n </div>\n </div>\n <div class="luckysheet-slider-protection-row" style="height:23px;">\n <div class="luckysheet-slider-protection-column" style="width:98%;">\n <input class="luckysheet-protection-input" id="protection-password" placeHolder="').concat(a.enterPassword, '">\n </div>\n </div>\n <div class="luckysheet-slider-protection-row" style="height:47px;margin-top:4px;">\n <div class="luckysheet-slider-protection-column" style="width:98%;">\n <textarea class="luckysheet-protection-textarea" id="protection-hint" placeHolder="').concat(a.enterHintTitle, '"></textarea>\n </div>\n </div>\n </div>\n <div class="luckysheet-slider-protection-config" style="top:130px;height:290px;border-top:1px solid #c5c5c5">\n <div class="luckysheet-slider-protection-row" style="height:20px;">\n ').concat(a.authorityTitle, "\n </div>\n ").concat(n, '\n </div>\n <div class="luckysheet-slider-protection-config" style="top:440px;bottom:45px;border-top:1px solid #c5c5c5">\n <div class="luckysheet-slider-protection-row" style="height:25px;">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:0px;line-height: 25px;">\n ').concat(a.allowRangeTitle, '\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x" style="left:70%;">\n <div class="luckysheet-slider-protection-ok luckysheet-slider-protection-addRange" id="luckysheet-slider-protection-addRange">\n ').concat(a.allowRangeAdd, '\n </div>\n </div>\n </div>\n\n <div id="luckysheet-protection-rangeItem-container" class="luckysheet-slider-protection-row" style="top:25px;bottom:0px;position:absolute">\n \n </div>\n </div>\n <div class="luckysheet-slider-protection-config" style="bottom:0px;height:45px">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:0px;">\n <div class="luckysheet-slider-protection-ok" id="luckysheet-slider-protection-ok">\n ').concat(r.confirm, '\n </div>\n </div>\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:50%;">\n <div class="luckysheet-slider-protection-cancel" id="luckysheet-slider-protection-cancel">\n ').concat(r.cancel, "\n </div>\n </div>\n </div>\n </div>\n </div>\n "); $("body").append(o), $("body").append(_m(bn, { id: "luckysheet-protection-sheet-validation", addclass: "luckysheet-protection-sheet-validation", title: a.validationTitle, content: '\n <div class="luckysheet-slider-protection-row">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n '.concat(a.validationTips, '\n </div>\n </div>\n <div class="luckysheet-slider-protection-row" style="margin-top:20px">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="').concat(a.validationInputHint, '">\n </div>\n </div>\n '), botton: '<button id="luckysheet-protection-sheet-validation-confirm" class="btn btn-primary">'.concat(r.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(r.cancel, "</button>"), style: "z-index:100003" })) }(), t = gn(), a = t.protection, r = t.button, $("#luckysheet-slider-protection-ok").click((function () { var e = $("#protection-password").val(), t = $("#protection-swichProtectionState").is(":checked"), a = $("#protection-hint").val(), r = eu, n = {}; null != r && null != r.config && null != r.config.authority && (n = r.config.authority); var l = {}; "••••••••" != e ? (l.password = e, l.algorithmName = "None", l.saltValue = null) : null != n ? (l.algorithmName = n.algorithmName, l.saltValue = n.saltValue, l.password = n.password) : (l.algorithmName = "None", l.saltValue = null, l.password = ""), l.hintText = a, l.sheet = 1 == t ? 1 : 0; for (var i = 0; i < nu.length; i++) { var o = nu[i], s = $("#luckysheet-protection-check-" + o).is(":checked"); l[o] = 1 == s ? 1 : 0 } l.allowRangeList = Kc, Kc = [], tu = !0, null == r.config && (r.config = {}), r.config.authority = l, au = {}, cu() })), $("#luckysheet-slider-protection-cancel, #luckysheet-modal-dialog-protection-close").click((function () { cu() })), $("#luckysheet-slider-protection-addRange").click((function () { iu(), Zc = !0, $("#luckysheet-protection-rangeItem-confirm").html(r.insert), Bm("luckysheet-protection-rangeItem-dialog"), $("#protection-allowRangeAdd-title").val("Default" + Kc.length), $("#protection-allowRangeAdd-range input").val(""), $("#protection-allowRangeAdd-password").val(""), $("#protection-allowRangeAdd-hint").val("") })), $(document).off("click.luckysheetProtection.rangeItemUpdate").on("click.luckysheetProtection.rangeItemUpdate", "#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-update", (function (e) { iu(), Zc = !1, $("#luckysheet-protection-rangeItem-confirm").html(r.update), Bm("luckysheet-protection-rangeItem-dialog"); var t = $(e.target).closest(".luckysheet-protection-rangeItem"), a = $("#luckysheet-protection-rangeItem-container").find("> div.luckysheet-protection-rangeItem").index(t), n = Kc[a]; Qc = a, $("#protection-allowRangeAdd-title").val(n.name), $("#protection-allowRangeAdd-range input").val(n.sqref), "None" == n.algorithmName ? $("#protection-allowRangeAdd-password").val(n.password) : $("#protection-allowRangeAdd-password").val("••••••••"), $("#protection-allowRangeAdd-hint").val(n.hintText) })), $(document).off("click.luckysheetProtection.rangeItemDelete").on("click.luckysheetProtection.rangeItemDelete", "#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-del", (function (e) { var t = $(e.target).closest(".luckysheet-protection-rangeItem"), a = $("#luckysheet-protection-rangeItem-container").find("> div.luckysheet-protection-rangeItem").index(t); Kc[a], Kc.splice(a, 1), t.remove() })), $(document).off("click.luckysheetProtection.rangeItemConfirm").on("click.luckysheetProtection.rangeItemConfirm", "#luckysheet-protection-rangeItem-confirm", (function () { var e = $("#protection-allowRangeAdd-title").val(), t = $("#protection-allowRangeAdd-range input").val(), r = $("#protection-allowRangeAdd-password").val(), n = $("#protection-allowRangeAdd-hint").val(); if (0 != e.length) { var l = $c.getRangeByTxt(t); if (0 != t.length) if (0 != l.length) { if (t = function (e) { if (null == e || 0 == e.length) return null; for (var t = e.split(","), a = "", r = 0; r < t.length; r++) { var n = t[r].split("!"), l = "", i = ""; n.length > 1 ? (l = n[0], i = n[1]) : i = n[0]; for (var o = i.split(":"), s = "", c = 0; c < o.length; c++) { var u = o[c], d = u.replace(/[^0-9]/g, ""), h = u.replace(/[^A-Za-z]/g, ""), m = ""; "" != h && (m += "$" + h), "" != d && (m += "$" + d), s += m + ":" } s = s.substr(0, s.length - 1), a += l + s + "," } return a.substr(0, a.length - 1) }(t), Zc) { var i = { name: e, password: r, hintText: n, algorithmName: "None", saltValue: null, checkRangePasswordUrl: null, sqref: t }; lu(i), Kc.push(i) } else { var o = Qc, s = Kc[o]; s.name = e, s.sqref = t, s.hintText = n, "••••••••" != r && (s.password = r, s.algorithmName = "None"); var c = $("#luckysheet-protection-rangeItem-container").find("> div.luckysheet-protection-rangeItem").eq(o), u = c.find(".luckysheet-protection-rangeItem-name"), d = ""; null != r && r.length > 0 && (d = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="' + a.rangeItemHasPassword + '"></i>'), u.html(e + d).attr("title", e), c.find(".luckysheet-protection-rangeItem-range").html(t).attr("title", t) } $("#luckysheet-protection-rangeItem-dialog").hide(), $("#luckysheet-modal-dialog-mask").hide() } else alert(a.rangeItemErrorRange); else alert(a.rangeItemErrorRangeNull) } else alert(a.rangeItemErrorTitleNull) })), $(document).off("click.luckysheetProtection.validationConfirm").on("click.luckysheetProtection.validationConfirm", "#luckysheet-protection-sheet-validation-confirm", (function (e) { var t = $("#luckysheet-protection-sheet-validation"), r = Jc; if (null == r) return ou(Jc), t.hide(), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-modal-dialog-slider-protection").show(), void Uc(); var n = t.find("input").val(); if (null != n && 0 != n.length) { if (null != r.algorithmName && "None" != r.algorithmName) if (null != r.saltValue && r.saltValue.length > 0) { var l = CryptoApi.getHasher(r.algorithmName); n = CryptoApi.hmac(r.saltValue, n, l) } else n = CryptoApi.hash(r.algorithmName, n); n == r.password ? (ou(Jc), t.hide(), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-modal-dialog-slider-protection").show(), Uc(), tu = !1) : alert(a.checkPasswordWrongalert) } else alert(a.checkPasswordNullalert) })), $("#luckysheet-protection-check-selectLockedCells").change((function () { var e = $("#luckysheet-protection-check-selectLockedCells"), t = $("#luckysheet-protection-check-selectunLockedCells"), a = e.is(":checked"); t.is(":checked"), a && t.prop("checked", !0) })), $("#luckysheet-protection-check-selectunLockedCells").change((function () { var e = $("#luckysheet-protection-check-selectLockedCells"), t = $("#luckysheet-protection-check-selectunLockedCells"); e.is(":checked"), t.is(":checked") || e.prop("checked", !1) })), $(document).off("click.luckysheetProtection.dvRange").on("click.luckysheetProtection.dvRange", "#protection-allowRangeAdd-range .fa-table", (function (e) { $("#luckysheet-protection-rangeItem-dialog").hide(); var t = $(this).siblings("input").val().trim(); $c.rangeDialog("0", t), $c.selectRange = []; var a = $c.getRangeByTxt(t); if (a.length > 0) for (var r = 0; r < a.length; r++) { var n = a[r].row[0], l = a[r].row[1], i = a[r].column[0], o = a[r].column[1], s = ga.visibledatarow[l], c = n - 1 == -1 ? 0 : ga.visibledatarow[n - 1], u = ga.visibledatacolumn[o], d = i - 1 == -1 ? 0 : ga.visibledatacolumn[i - 1]; $c.selectRange.push({ left: d, width: u - d - 1, top: c, height: s - c - 1, left_move: d, width_move: u - d - 1, top_move: c, height_move: s - c - 1, row: [n, l], column: [i, o], row_focus: n, column_focus: i }) } Eh($c.selectRange) })), $(document).off("click.luckysheetProtection.dvRange2").on("click.luckysheetProtection.dvRange2", "#luckysheet-protection-rangeItem-dialog .show-box-item-dropdown .range .fa-table", (function (e) { $("#luckysheet-protection-rangeItem-dialog").hide(); var t = $(this).siblings("input").val().trim(); $c.rangeDialog("1", t), $c.selectRange = []; var a = $c.getRangeByTxt(t); if (a.length > 0) for (var r = 0; r < a.length; r++) { var n = a[r].row[0], l = a[r].row[1], i = a[r].column[0], o = a[r].column[1], s = ga.visibledatarow[l], c = n - 1 == -1 ? 0 : ga.visibledatarow[n - 1], u = ga.visibledatacolumn[o], d = i - 1 == -1 ? 0 : ga.visibledatacolumn[i - 1]; $c.selectRange.push({ left: d, width: u - d - 1, top: c, height: s - c - 1, left_move: d, width_move: u - d - 1, top_move: c, height_move: s - c - 1, row: [n, l], column: [i, o], row_focus: n, column_focus: i }) } Eh($c.selectRange) })), $(document).off("click.luckysheetProtection.dvRangeConfirm").on("click.luckysheetProtection.dvRangeConfirm", "#luckysheet-dataVerificationRange-dialog-confirm", (function (e) { var t = $(this).parents("#luckysheet-dataVerificationRange-dialog").find("input").val(), a = $("#protection-allowRangeAdd-range input"), r = a.val(); "," == r.substr(r.length - 1, 1) ? a.val(r + t) : a.val(t), $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-protection-rangeItem-dialog").show(), Eh([]) })), $(document).off("click.luckysheetProtection.dvRangeClose").on("click.dvRangeClose", "#luckysheet-dataVerificationRange-dialog-close", (function (e) { $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-protection-rangeItem-dialog").show(), Eh([]) })), $(document).on("click.luckysheetProtection.luckysheetProtection", "#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close", (function (e) { $("#luckysheet-dataVerificationRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-protection-rangeItem-dialog").show(), Eh([]) })), Yc = !0), eu = e, null != e && null != e.config && null != e.config.authority) { var n = e.config.authority; if (tu && 1 == n.sheet && null != n.password && n.password.length > 0) return Jc = n, $("#luckysheet-protection-sheet-validation input").val(""), void Bm("luckysheet-protection-sheet-validation"); ou(n) } else $("#luckysheet-protection-check-selectLockedCells").prop("checked", !0), $("#luckysheet-protection-check-selectunLockedCells").prop("checked", !0); $("#luckysheet-modal-dialog-slider-protection").show(), Uc() } function cu() { $("#luckysheet-protection-rangeItem-dialog").hide(), $("#luckysheet-modal-dialog-slider-protection").hide(), Uc() } function uu(e, t, a, r) { var n, l = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], i = !1, o = a.allowRangeList; if (null != o && o.length > 0) for (var s = !1, c = 0; c < o.length; c++) { var u = o[c], d = u.sqref, h = $c.getRangeByTxt(d); if (h.length > 0) for (var m = 0; m < h.length; m++) { var p = h[m].row[0], f = h[m].row[1], g = h[m].column[0], v = h[m].column[1]; if (e >= p && e <= f && t >= g && t <= v) { s = !0; break } } if (s) { var y = u.password; if (null != y && y.length > 0 && !(d in au)) return l && (du(u), $("#luckysheet-selection-copy .luckysheet-selection-copy").hide()), !1; i = !0; break } } !i && l && (n = null != a.hintText && a.hintText.length > 0 ? a.hintText : r.defaultSheetHintText, fd.info("", n), $("#luckysheet-selection-copy .luckysheet-selection-copy").hide()); return i } function du(e) { var t = gn(), a = t.protection, r = t.button; ru || $("body").append(_m(bn, { id: "luckysheet-protection-range-validation", addclass: "luckysheet-protection-sheet-validation", title: a.validationTitle, content: '\n <div class="luckysheet-slider-protection-row">\n <div id="luckysheet-protection-range-validation-hint" class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n \n </div>\n </div>\n <div class="luckysheet-slider-protection-row" style="margin-top:20px">\n <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">\n <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="'.concat(a.validationInputHint, '">\n </div>\n </div>\n '), botton: '<button id="luckysheet-protection-range-validation-confirm" class="btn btn-primary">'.concat(r.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(r.cancel, "</button>"), style: "z-index:100003" })), ru = !0, Bm("luckysheet-protection-range-validation"); var n = $("#luckysheet-protection-range-validation-hint"); null != e.hintText && e.hintText.length > 0 ? n.html(e.hintText) : n.html(a.defaultRangeHintText); var l = $("#luckysheet-protection-range-validation"), i = l.find("input"); i.val(""), $("#luckysheet-protection-range-validation-confirm").off("click").on("click", (function () { var t = i.val(); if (null != t && 0 != t.length) { if (null != e.algorithmName && "None" != e.algorithmName) if (null != e.saltValue && e.saltValue.length > 0) { var r = CryptoApi.getHasher(e.algorithmName); t = CryptoApi.hmac(e.saltValue, t, r) } else t = CryptoApi.hash(e.algorithmName, t); t == e.password ? (au[e.sqref] = 1, l.hide(), $("#luckysheet-modal-dialog-mask").hide(), alert(a.checkPasswordSucceedalert)) : alert(a.checkPasswordWrongalert) } else alert(a.checkPasswordNullalert) })) } function hu(e) { var t = Sh.getSheetByIndex(e); if (null == t) return !0; if (null == t.config || null == t.config.authority) return !0; var a = t.config.authority; if (null == a || null == a.sheet || 0 == a.sheet) return !0; var r, n = gn().protection; return r = null != a.hintText && a.hintText.length > 0 ? a.hintText : n.defaultSheetHintText, fd.info("", r), !1 } function mu(e, t, a) { var r = Sh.getSheetByIndex(a); if (null == r) return !0; if (null == r.config || null == r.config.authority) return !0; var n = r.data[e][t], l = r.config.authority; return null == l || null == l.sheet || 0 == l.sheet || (!(!n || n.lo) || uu(e, t, l, gn().protection)) } function pu(e, t, a) { var r = Sh.getSheetByIndex(a); if (!r || !r.data[e] || !r.data[e][t]) return !0; if (null == r.config || null == r.config.authority) return !0; var n = r.data[e][t], l = r.config.authority; return null == l || null == l.sheet || 0 == l.sheet || (null == n || null == n.hi || 0 == n.hi) } function fu(e, t) { if (e[0].column[0] !== e[0].column[1]) return !0; var a = Sh.getSheetByIndex(t); if (null == a) return !0; if (null == a.config || null == a.config.authority) return !0; var r = a.config.authority; if (null == r || null == r.sheet || 0 == r.sheet) return !0; if (null == e || 0 == e.length) return !0; var n = a.data[e[0].row[0]][e[0].column[0]]; if (n && !n.lo) return !0; for (var l = gn().protection, i = 0; i < e.length; i++)for (var o = e[i].row[0], s = e[i].row[1], c = e[i].column[0], u = e[i].column[1], d = o; d <= s; d++)for (var h = c; h <= u; h++) { if (0 == uu(d, h, r, l)) return !1 } return !0 } function gu(e, t, a) { var r = gn().protection, n = Sh.getSheetByIndex(a); if (null == n) return !0; if (null == n.config || null == n.config.authority) return !0; var l = n.data[e][t], i = n.config.authority; return null == i || null == i.sheet || 0 == i.sheet || (l && !l.lo || uu(e, t, i, r, !1) ? 1 == i.selectunLockedCells || null == i.selectunLockedCells : 1 == i.selectLockedCells || null == i.selectLockedCells) } function vu(e) { gn().protection; var t = Sh.getSheetByIndex(e); if (null == t) return !0; if (null == t.config || null == t.config.authority) return !0; var a = t.config.authority; if (null == a || null == a.sheet || 0 == a.sheet) return !0; var r = !1; 1 != a.selectunLockedCells && null != a.selectunLockedCells || (r = !0); var n = !1; return 1 != a.selectLockedCells && null != a.selectLockedCells || (n = !0), !(!r || !n) } function yu(e) { var t = Sh.getSheetByIndex(e); if (null == t) return !0; if (null == t.config || null == t.config.authority) return !0; var a = t.config.authority; if (null == a || null == a.sheet || 0 == a.sheet) return !0; if (1 == a.formatCells || null == a.formatCells) return !0; var r, n = gn().protection; return r = null != a.hintText && a.hintText.length > 0 ? a.hintText : n.defaultSheetHintText, fd.info("", r), !1 } function bu(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "formatColumns", a = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], r = Sh.getSheetByIndex(e); if (null == r) return !0; if (null == r.config || null == r.config.authority) return !0; var n = r.config.authority; if (null == n || null == n.sheet || 0 == n.sheet) return !0; if (1 == n[t] || null == n[t]) return !0; if (a) { var l, i = gn(), o = i.protection; l = null != n.hintText && n.hintText.length > 0 ? n.hintText : o.defaultSheetHintText, fd.info("", l) } return !1 } function ku(e, t, a) { null == a && (a = !0); return a ? e.sort((function (e, a) { var r = e[t], n = a[t]; return "object" == Cm(e[t]) && (r = e[t].v), "object" == Cm(a[t]) && (n = a[t].v), ya(r) ? 1 : ya(n) ? -1 : ds(r) && ds(n) ? hs(r, n) : ba(r) && ba(n) ? fs(r).value() - fs(n).value() : ba(r) || ba(n) ? ba(r) ? ba(n) ? void 0 : -1 : 1 : r.localeCompare(n, "zh") })) : e.sort((function (e, a) { var r = e[t], n = a[t]; return "object" == Cm(e[t]) && (r = e[t].v), "object" == Cm(a[t]) && (n = a[t].v), ya(r) ? 1 : ya(n) ? -1 : ds(r) && ds(n) ? hs(n, r) : ba(r) && ba(n) ? fs(n).value() - fs(r).value() : ba(r) || ba(n) ? ba(r) ? ba(n) ? void 0 : 1 : -1 : n.localeCompare(r, "zh") })) } function xu(e, t) { null == t && (t = !0); return t ? e.sort((function (e, t) { var a = e, r = t; return "object" == Cm(e) && (a = e.v), "object" == Cm(t) && (r = t.v), null == a && (a = ""), null == r && (r = ""), ds(a) && ds(r) ? hs(a, r) : ba(a) && ba(r) ? fs(a).value() - fs(r).value() : ba(a) || ba(r) ? ba(a) ? ba(r) ? void 0 : -1 : 1 : a.localeCompare(r, "zh") })) : e.sort((function (e, t) { var a = e, r = t; return "object" == Cm(e) && (a = e.v), "object" == Cm(t) && (r = t.v), null == a && (a = ""), null == r && (r = ""), ds(a) && ds(r) ? hs(r, a) : ba(a) && ba(r) ? fs(r).value() - fs(a).value() : ba(a) || ba(r) ? ba(a) ? ba(r) ? void 0 : 1 : -1 : r.localeCompare(a, "zh") })) } function wu(e) { if (bu(ga.currentSheetIndex, "sort")) if (ga.luckysheet_select_save.length > 1) wa() ? alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试") : fd.info("不能对多重选择区域执行此操作,请选择单个区域,然后再试", ""); else { null == e && (e = !0); for (var t, a, r = rs.deepCopyFlowData(ga.flowdata), n = ga.luckysheet_select_save[0].row[0], l = ga.luckysheet_select_save[0].row[1], i = ga.luckysheet_select_save[0].column[0], o = ga.luckysheet_select_save[0].column[1], s = n; s <= l; s++)if (null != r[s] && null != r[s][i]) { var c = r[s][i]; if (null != c.mc || ya(c.v)) continue; if (null == t && /[\u4e00-\u9fa5]+/g.test(c.v)) { t = s + 1, a = s + 1; continue } null == t && (t = s), a = s } if (!(null == t || t > l)) { for (var u = !1, d = [], h = t; h <= a; h++) { for (var m = [], p = i; p <= o; p++) { if (null != r[h][p] && null != r[h][p].mc) { u = !0; break } m.push(r[h][p]) } d.push(m) } if (u) wa() ? alert("选区有合并单元格,无法执行此操作!") : fd.info("选区有合并单元格,无法执行此操作!", ""); else { d = ku(d, 0, e); for (var f = t; f <= a; f++)for (var g = i; g <= o; g++)r[f][g] = d[f - t][g - i]; var v = {}; if (null != ga.config.rowlen) { var y = $.extend(!0, {}, ga.config); v = { cfg: y = qs(r, t, a, y), RowlChange: !0 } } id(r, [{ row: [t, a], column: [i, o] }], v) } } } } function _u(e, t) { if (bu(ga.currentSheetIndex, "sort")) { null == t && (t = !0); for (var a, r, n = rs.deepCopyFlowData(ga.flowdata), l = n.length - 1, i = n[0].length - 1, o = 0; o <= l; o++)null != n[o][e] && null != n[o][e].mc || (null == n[o][e] || ya(n[o][e].v) || !/[\u4e00-\u9fa5]+/g.test(n[o][e].v) || null != a ? (null == a && (a = o), null == n[o][e] || ya(n[o][e].v) || (r = o)) : (a = o + 1, r = o + 1)); if (!(null == a || a > l)) { for (var s = !1, c = [], u = a; u <= r; u++) { for (var d = [], h = 0; h <= i; h++) { if (null != n[u][h] && null != n[u][h].mc) { s = !0; break } d.push(n[u][h]) } c.push(d) } if (s) wa() ? alert("列排序会扩展至整个表格选区,选区有合并单元格,无法执行此操作,请选择功能栏排序功能!") : fd.info("列排序会扩展至整个表格选区,选区有合并单元格,无法执行此操作,请选择功能栏排序功能!", ""); else { c = ku(c, e, t); for (var m = a; m <= r; m++)for (var p = 0; p <= i; p++)n[m][p] = c[m - a][p - 0]; var f = {}; if (null != ga.config.rowlen) { var g = $.extend(!0, {}, ga.config); f = { cfg: g = qs(n, a, r, g), RowlChange: !0 } } id(n, [{ row: [a, r], column: [0, i] }], f) } } } } var Cu = function (e) { var t = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], a = []; if (0 == e.length) return []; if (0 == e[0].length) return []; for (var r = 0; r < e[0].length; r++) { for (var n = [], l = 0; l < e.length; l++) { var i = ""; null != e[l] && null != e[l][r] && (i = t ? Ko(l, r, e) : e[l][r]), n.push(i) } a.push(n) } return a }, Tu = function (e, t) { for (var a = 0, r = 0; r < t.length; r++) { var n = t[r]; a += Math.pow(n - e, 2) } return Mm(Math.sqrt(a / t.length)) }, Au = function (e, t) { for (var a = 0, r = 0; r < t.length; r++) { var n = t[r]; a += Math.pow(n - e, 2) } return Mm(Math.sqrt(a / (t.length - 1))) }, Su = function (e, t) { for (var a = 0, r = 0; r < t.length; r++) { var n = t[r]; a += Math.pow(n - e, 2) } return Mm(a / t.length) }, Iu = function (e, t) { for (var a = 0, r = 0; r < t.length; r++) { var n = t[r]; a += Math.pow(n - e, 2) } return Mm(a / (t.length - 1)) }, Ru = { pivotDatas: null, pivotSheetIndex: 0, pivotDataSheetIndex: 0, celldata: null, origindata: null, getCellData: function (e, t, a) { var r, n = _l(r = null != e ? e : ga.currentSheetIndex); "object" != Cm(ga.luckysheetfile[n].pivotTable) && (ga.luckysheetfile[n].pivotTable = new Function("return " + ga.luckysheetfile[n].pivotTable)()), null != ga.luckysheetfile[n].pivotTable ? (this.column = ga.luckysheetfile[n].pivotTable.column, this.row = ga.luckysheetfile[n].pivotTable.row, this.values = ga.luckysheetfile[n].pivotTable.values, this.filter = ga.luckysheetfile[n].pivotTable.filter, this.showType = ga.luckysheetfile[n].pivotTable.showType, this.filterparm = ga.luckysheetfile[n].pivotTable.filterparm, null != ga.luckysheetfile[n].pivotTable.drawPivotTable ? this.drawPivotTable = ga.luckysheetfile[n].pivotTable.drawPivotTable : this.drawPivotTable = !0, null != ga.luckysheetfile[n].pivotTable.pivotTableBoundary ? this.pivotTableBoundary = ga.luckysheetfile[n].pivotTable.pivotTableBoundary : this.pivotTableBoundary = [12, 6], this.pivot_select_save = null != a ? a : ga.luckysheetfile[n].pivotTable.pivot_select_save, this.pivotDataSheetIndex = null != t ? t : ga.luckysheetfile[n].pivotTable.pivotDataSheetIndex) : (this.column = null, this.row = null, this.values = null, this.filter = null, this.showType = null, this.filterparm = null, this.drawPivotTable = !0, this.pivotTableBoundary = [12, 6], this.pivot_select_save = null != a ? a : ga.luckysheet_select_save, this.pivotDataSheetIndex = null != t ? t : r); var l = _l(this.pivotDataSheetIndex), i = ga.luckysheetfile[l]; null == i.data && (i.data = Sh.buildGridData(i)), this.origindata = Yo(i.data, this.pivot_select_save); var o = {}; if (null != this.filterparm) for (var s in this.filterparm) for (var c in this.filterparm[s]) "rowhidden" === c && null != this.filterparm[s][c] && (o = $.extend(!0, o, this.filterparm[s][c])); this.rowhidden = o, this.pivotSheetIndex = r; for (var u = [], d = 0; d < this.origindata.length; d++)null != this.rowhidden && null != this.rowhidden[d] || u.push([].concat(this.origindata[d])); this.celldata = u, this.pivot_data_type = {}; for (var h = 0; h < this.celldata[1].length; h++) { var m = ps(this.celldata[1][h]); this.pivot_data_type[h.toString()] = m } }, pivot_data_type: {}, pivot_select_save: null, column: null, row: null, values: null, filter: null, showType: null, rowhidden: null, selected: null, caljs: null, initial: !0, filterparm: null, luckysheet_pivotTable_select_state: !1, jgridCurrentPivotInput: null, movestate: !1, moveitemposition: [], movesave: {}, showvaluecolrow: function () { $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").length >= 2 ? ($("#luckysheetpivottablevaluecolrowshow").show(), "column" == this.showType ? ($("#luckysheetpivottablevaluecolrow").prop("checked", !0), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").addClass("ui-state-active"), $("#luckysheetpivottablevaluecolrow1").prop("checked", !1), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").removeClass("ui-state-active")) : ($("#luckysheetpivottablevaluecolrow1").prop("checked", !0), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").addClass("ui-state-active"), $("#luckysheetpivottablevaluecolrow").prop("checked", !1), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").removeClass("ui-state-active"))) : $("#luckysheetpivottablevaluecolrowshow").hide() }, resetOrderby: function (e) { var t = $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").index(e); $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column").find(".luckysheet-modal-dialog-slider-config-item").each((function () { $(this).data("orderby") == t && $(this).data("orderby", "self") })) }, luckysheetsliderlistclearfilter: function (e) { var t = e.parent(), a = t.data("index"), r = {}, n = this.origindata; t.data("rowhidden", "").find(".luckysheet-slider-list-item-filtered").hide(), this.setDatatojsfile("selected", {}, a), this.setDatatojsfile("rowhidden", null, a); for (var l = [], i = 0; i < n.length; i++)null == r[i] && l.push([].concat(n[i])); this.celldata = l, this.refreshPivotTable(), $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide() }, luckysheetsliderlistitemfilter: function (e) { var t = gn().filter, a = e.parent(), r = a.offset(), n = $("#luckysheet-pivotTableFilter-menu"), l = $(window).height(), i = ($(window).width(), a.data("index")), o = a.data("rowhidden"); null == o || "" == o ? o = {} : "string" == Cm(o) && (o = JSON.parse(o)), $("body .luckysheet-cols-menu").hide(), $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide(), $("#luckysheet-pivotTableFilter-byvalue-input").val(""), $("#luckysheet-pivotTableFilter-bycondition").next().hide(), $("#luckysheet-pivotTableFilter-byvalue").next().show(), n.data("index", i), $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").hide().find("input").val(), $("#luckysheet-pivotTableFilter-selected span").data("type", "0").data("type", null).text(t.filiterInputNone); var s = a.data("byconditiontype"); if ($("#luckysheet-pivotTableFilter-selected span").data("value", a.data("byconditionvalue")).data("type", s).text(a.data("byconditiontext")), "2" == s) { var c = $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2").show().find("input"); c.eq(0).val(a.data("byconditionvalue1")), c.eq(1).val(a.data("byconditionvalue2")) } else "1" == s && $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").eq(0).show().find("input").val(a.data("byconditionvalue1")); $("#luckysheet-pivotTableFilter-byvalue-select").empty().html('<div style="width:100%;text-align:center;position:relative;top:45%;font-size: 14px;"> <div class="luckysheetLoaderGif"> </div> <span>' + t.filiterMoreDataTip + "</span></div>"); var u = {}; $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").not(a.get(0)).each((function () { var e = $(this).data("rowhidden"); if (null == e || "" == e) return !0; for (var t in "string" == Cm(e) && (e = JSON.parse(e)), e) u[t] = 0 })); var d = this.origindata; setTimeout((function () { for (var e = {}, a = {}, n = {}, s = {}, c = 1; c < d.length; c++)if (!(c in u) && null != d[c]) { var h = d[c][i]; if (null != h && null != h.ct && "d" == h.ct.t) { var m = ws("YYYY-MM-DD", h.v), p = m.split("-")[0], f = m.split("-")[1], g = m.split("-")[2]; p in e || (e[p] = {}), f in e[p] || (e[p][f] = {}), g in e[p][f] || (e[p][f][g] = 0), e[p][f][g]++, c in o && (a[p] = 0, a[f] = 0, a[g] = 0) } else { var v = void 0, y = void 0; null == h || ya(h.v) ? (v = null, y = null) : (v = h.v, y = h.m), v in n || (n[v] = {}), y in n[v] || (n[v][y] = 0), n[v][y]++, c in o && (s[v + "#$$$#" + y] = 0) } } var b = []; if (JSON.stringify(e).length > 2) for (var k in e) { var x = 0, w = ""; for (var _ in e[k]) { var C = 0, T = ""; for (var A in e[k][_]) { var S = e[k][_][A]; C += S; var I = void 0; I = Number(_) < 10 ? "0" + Number(_) : _; var R = void 0; R = Number(A) < 10 ? "0" + Number(A) : A, T += k in a && _ in a && A in a ? '<div class="day luckysheet-mousedown-cancel cf" data-check="false" title="' + k + "-" + I + "-" + R + '"><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + A + '</label><span class="count luckysheet-mousedown-cancel">( ' + S + " )</span></div>" : '<div class="day luckysheet-mousedown-cancel cf" data-check="true" title="' + k + "-" + I + "-" + R + '"><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + A + '</label><span class="count luckysheet-mousedown-cancel">( ' + S + " )</span></div>" } x += C; var q = void 0; q = Number(_) < 10 ? "0" + Number(_) : _, w += k in a && _ in a ? '<div class="monthBox luckysheet-mousedown-cancel"><div class="month luckysheet-mousedown-cancel cf" data-check="false" title="' + k + "-" + q + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + _ + t.filiterMonthText + '</label><span class="count luckysheet-mousedown-cancel">( ' + C + ' )</span></div><div class="dayList luckysheet-mousedown-cancel">' + T + "</div></div>" : '<div class="monthBox luckysheet-mousedown-cancel"><div class="month luckysheet-mousedown-cancel cf" data-check="true" title="' + k + "-" + q + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + _ + t.filiterMonthText + '</label><span class="count luckysheet-mousedown-cancel">( ' + C + ' )</span></div><div class="dayList luckysheet-mousedown-cancel">' + T + "</div></div>" } var D = void 0; D = k in a ? '<div class="yearBox luckysheet-mousedown-cancel"><div class="year luckysheet-mousedown-cancel cf" data-check="false" title="' + k + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + k + t.filiterYearText + '</label><span class="count luckysheet-mousedown-cancel">( ' + x + ' )</span></div><div class="monthList luckysheet-mousedown-cancel">' + w + "</div></div>" : '<div class="yearBox luckysheet-mousedown-cancel"><div class="year luckysheet-mousedown-cancel cf" data-check="true" title="' + k + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + k + t.filiterYearText + '</label><span class="count luckysheet-mousedown-cancel">( ' + x + ' )</span></div><div class="monthList luckysheet-mousedown-cancel">' + w + "</div></div>", b.unshift(D) } if (JSON.stringify(n).length > 2) { var F = Object.keys(n); F = xu(F, !0); for (var E = 0; E < F.length; E++) { var M = F[E]; for (var N in n[M]) { var P = void 0; P = M + "#$$$#" + N == "null#$$$#null" ? t.valueBlank : N; var z = void 0; z = M + "#$$$#" + N in s ? '<div class="textBox luckysheet-mousedown-cancel cf" data-check="false" data-filter="' + M + "#$$$#" + N + '" title="' + N + '"><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + P + '</label><span class="luckysheet-mousedown-cancel count">( ' + n[M][N] + " )</span></div>" : '<div class="textBox luckysheet-mousedown-cancel cf" data-check="true" data-filter="' + M + "#$$$#" + N + '" title="' + N + '"><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + P + '</label><span class="luckysheet-mousedown-cancel count">( ' + n[M][N] + " )</span></div>", b.push(z) } } } $("#luckysheet-pivotTableFilter-byvalue-select").html("<div class='ListBox luckysheet-mousedown-cancel' style='max-height:" + (l - r.top - 350) + "px;overflow-y:auto;overflow-x:hidden;'>" + b.join("") + "</div>") }), 1), Dm(n, r.left - 250, r.top) }, getSumTypeName: function (e) { var t = "", a = gn().pivotTable; return "SUM" == e ? t = a.valueStatisticsSUM : "COUNT" == e ? t = a.valueStatisticsCOUNT : "COUNTA" == e ? t = a.valueStatisticsCOUNTA : "COUNTUNIQUE" == e ? t = a.valueStatisticsCOUNTUNIQUE : "AVERAGE" == e ? t = a.valueStatisticsAVERAGE : "MAX" == e ? t = a.valueStatisticsMAX : "MIN" == e ? t = a.valueStatisticsMIN : "MEDIAN" == e ? t = a.valueStatisticsMEDIAN : "PRODUCT" == e ? t = a.valueStatisticsPRODUCT : "STDEV" == e ? t = a.valueStatisticsSTDEV : "STDEVP" == e ? t = a.valueStatisticsSTDEVP : "let" == e ? t = a.valueStatisticslet : "VARP" == e && (t = a.valueStatisticsVARP), t }, setDatatojsfile: function (e, t, a) { var r = _l(this.pivotSheetIndex); null == ga.luckysheetfile[r].pivotTable && (ga.luckysheetfile[r].pivotTable = {}), null == a ? (ga.luckysheetfile[r].pivotTable[e] = t, this[e] = t) : (null == ga.luckysheetfile[r].pivotTable.filterparm && (ga.luckysheetfile[r].pivotTable.filterparm = {}), null == ga.luckysheetfile[r].pivotTable.filterparm[a.toString()] && (ga.luckysheetfile[r].pivotTable.filterparm[a.toString()] = {}), ga.luckysheetfile[r].pivotTable.filterparm[a.toString()][e] = t, null == this.filterparm && (this.filterparm = {}), null == this.filterparm[a.toString()] && (this.filterparm[a.toString()] = {}), this.filterparm[a.toString()][e] = t) }, createPivotTable: function (e) { if (!wa() && !1 !== ga.allowEdit) { var t = ga.currentSheetIndex, a = gn().pivotTable; if (wa()) alert(a.errorNotAllowEdit); else if (ga.luckysheet_select_save.length > 1) fd.info("", a.errorNotAllowMulti); else if (0 != 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]) { var r = $.extend(!0, {}, ga.luckysheet_select_save[0]); Sh.addNewSheet(e, !0), this.getCellData(ga.currentSheetIndex, t, r), this.setDatatojsfile("pivot_select_save", r), this.setDatatojsfile("pivotDataSheetIndex", t), this.initialPivotManage() } else fd.info("", a.errorSelectRange) } }, changePivotTable: function (e) { var t = gn().pivotTable, a = ga.luckysheetfile[_l(e)].pivotTable.pivotDataSheetIndex; null != _l(a) ? (this.getCellData(e), this.initialPivotManage(!0), this.refreshPivotTable()) : fd.info(t.errorIsDamage, "") }, refreshPivotTable: function () { var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], t = this, a = {}; a.pivotTable = p, a.data = rs.deepCopyFlowData(ga.flowdata), t.storePivotTableParam(); var r = t.dataHandler(t.column, t.row, t.values, t.showType, t.celldata); t.setDatatojsfile("pivotDatas", r); var n = $.extend(!0, [], Sh.nulldata), l = n, i = 0, o = 0; if (0 == r.length) t.setDatatojsfile("drawPivotTable", !0), t.setDatatojsfile("pivotTableBoundary", [12, 6]); else { t.setDatatojsfile("drawPivotTable", !1), t.setDatatojsfile("pivotTableBoundary", [r.length, r[0].length]); var s = r.length, c = r[0].length; l = Zo(n, (i = s - n.length) + 20, (o = c - n[0].length) + 10, !0); for (var u = 0; u < s; u++) { for (var d = [].concat(l[u]), h = 0; h < c; h++) { var m = ""; null != r[u] && null != r[u][h] && (m = Ko(u, h, r)), d[h] = m } l[u] = d } } a.type = "pivotTable_change", a.curdata = $.extend(!0, [], l), a.sheetIndex = ga.currentSheetIndex; var p = t.getPivotTableData(); a.pivotTablecur = p, ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push(a)), yd(), ga.clearjfundo = !1, i > 0 || o > 0 ? od(l[0].length, l.length, l, null, ga.luckysheet_select_save, "datachangeAll", void 0, void 0, e) : (id(l, ga.luckysheet_select_save, {}, null, e), Rh()), ga.clearjfundo = !0 }, drawPivotTable: !0, pivotTableBoundary: [12, 6], pivotclick: function (e, t, a) { null == a && (a = ga.currentSheetIndex); var r = ga.luckysheetfile[_l(a)]; if (r.isPivotTable && null != _l(r.pivotTable.pivotDataSheetIndex)) { var n = $("#luckysheet-modal-dialog-slider-pivot"), l = this.isPivotRange(e, t); if (l && n.is(":hidden")) { if (!bu(a, "usePivotTablereports", !1)) return; n.show(), Uc(), $("#luckysheet-sta-content").css("padding-right", 260) } else !l && n.is(":visible") && (n.hide(), Uc(), $("#luckysheet-sta-content").css("padding-right", 10)) } }, isPivotRange: function (e, t) { if (ga.luckysheetcurrentisPivotTable) return e < this.pivotTableBoundary[0] && t < this.pivotTableBoundary[1] }, storePivotTableParam: function () { var e = [], t = [], a = [], r = []; $("#luckysheet-modal-dialog-config-filter .luckysheet-modal-dialog-slider-config-item").each((function () { var e = {}; e.index = $(this).data("index"), e.name = $(this).data("name"), e.fullname = $(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text(), a.push(e) })), $("#luckysheet-modal-dialog-config-row .luckysheet-modal-dialog-slider-config-item").each((function () { var e = {}; e.index = $(this).data("index"), e.name = $(this).data("name"), e.fullname = $(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text(), e.order = $(this).data("order"), e.orderby = $(this).data("orderby"), e.stastic = $(this).data("stastic"), t.push(e) })), $("#luckysheet-modal-dialog-config-column .luckysheet-modal-dialog-slider-config-item").each((function () { var t = {}; t.index = $(this).data("index"), t.name = $(this).data("name"), t.fullname = $(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text(), t.order = $(this).data("order"), t.orderby = $(this).data("orderby"), t.stastic = $(this).data("stastic"), e.push(t) })), $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").each((function () { var e = {}; e.index = $(this).data("index"), e.name = $(this).data("name"), e.fullname = $(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text(), e.sumtype = $(this).data("sumtype"), e.nameindex = $(this).data("nameindex"), r.push(e) })), this.setDatatojsfile("column", e), this.setDatatojsfile("row", t), this.setDatatojsfile("filter", a), this.setDatatojsfile("values", r); var n = $("#luckysheetpivottablevaluecolrow:checked, #luckysheetpivottablevaluecolrow1:checked").val(); this.setDatatojsfile("showType", "0" == n ? "row" : "column"); var l = this.getPivotTableData(); delete l.pivotDatas, pd.saveParam("all", this.pivotSheetIndex, l, { k: "pivotTable" }) }, getPivotTableData: function (e) { null == e && (e = this.pivotSheetIndex); var t = _l(e), a = ga.luckysheetfile[t].pivotTable; return a = "object" == Cm(a) ? $.extend(!0, {}, ga.luckysheetfile[t].pivotTable) : new Function("return " + a)() }, addValuesToTitle: function (e, t) { var a = e.length * t.length, r = e[0].length + 1, n = []; if (0 == e.length && t.length > 0) { for (var l = 0; l < t.length; l++)n.push(t[l].fullname); return n } if (0 == t.length && e.length > 0) return e; for (var i = 0; i < a; i++) { n[i] = new Array(r); for (var o = 0; o < r - 1; o++)n[i][o] = e[Math.floor(i / t.length)][o]; n[i][r - 1] = t[i % t.length].fullname } return n }, initialPivotManage: function (e) { var t = this, a = gn(), r = a.pivotTable, n = a.button, l = a.filter; if (t.initial) { t.initial = !1, $("body").append(function () { var e = gn().pivotTable; return '\n <div id="luckysheet-modal-dialog-slider-pivot" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot">\n <div class="luckysheet-modal-dialog-slider-title"> <span>'.concat(e.title, '</span> <span id="luckysheet-modal-dialog-slider-close" title="').concat(e.closePannel, '"><i class="fa fa-times" aria-hidden="true"></i></span> </div>\n <div class="luckysheet-modal-dialog-slider-content">\n <div class="luckysheet-modal-dialog-slider-range">\n <div id="luckysheet-dialog-pivotTable-range"></div>\n <div id="luckysheet-dialog-pivotTable-range-seleted">').concat(e.editRange, '</div>\n </div>\n <div class="luckysheet-modal-dialog-slider-list-title"> ').concat(e.tipPivotFieldSelected, ' <span title="').concat(e.tipClearSelectedField, '" id="luckysheet-dialog-pivotTable-clearitem">').concat(e.btnClearSelectedField, '</span></div>\n <div id="luckysheet-modal-dialog-pivotTable-list" class="luckysheet-modal-dialog-slider-list luckysheet-scrollbars"> </div>\n <div class="luckysheet-modal-dialog-slider-config-c">\n <div class="luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-filter">\n <div> <span><i class="fa fa-filter luckysheet-mousedown-cancel" aria-hidden="true"></i> ').concat(e.btnFilter, '</span> </div>\n <div id="luckysheet-modal-dialog-config-filter" class="luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars"> </div>\n </div>\n <div class="luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-row">\n <div> <span><i class="fa fa-list-alt" aria-hidden="true"></i> ').concat(e.titleRow, '</span> </div>\n <div id="luckysheet-modal-dialog-config-row" class="luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars"> </div>\n </div>\n <div class="luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-column">\n <div> <span><i class="fa fa-indent" aria-hidden="true"></i> ').concat(e.titleColumn, '</span> </div>\n <div id="luckysheet-modal-dialog-config-column" class="luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars"> </div>\n </div>\n <div class="luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-value">\n <div> <span><i class="fa fa-cube" aria-hidden="true"></i> ').concat(e.titleValue, '</span> <span style="float: right;margin-right: 10px;display:none;" id="luckysheetpivottablevaluecolrowshow"><label style="padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;" title="').concat(e.tipShowColumn, '" for="luckysheetpivottablevaluecolrow">').concat(e.titleColumn, '</label> <input type="radio" checked="checked" value="1" name="luckysheetpivottablevaluecolrow" id="luckysheetpivottablevaluecolrow" /> <label style="padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;" title="').concat(e.tipShowRow, '" for="luckysheetpivottablevaluecolrow1">').concat(e.titleRow, '</label> <input type="radio" value="0" name="luckysheetpivottablevaluecolrow" id="luckysheetpivottablevaluecolrow1" /></span></div>\n <div id="luckysheet-modal-dialog-config-value" class="luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars"> </div>\n </div>\n </div>\n </div>\n </div>\n ') }()), $("#luckysheet-modal-dialog-slider-close").click((function () { $("#luckysheet-modal-dialog-slider-pivot").hide(), Uc() })), $("body").append(_m(bn, { id: "luckysheet-data-pivotTable-selection", addclass: "luckysheet-data-pivotTable-selection", title: r.titleSelectionDataRange, content: '<input id="luckysheet-pivotTable-range-selection-input" class="luckysheet-datavisual-range-container" style="font-size: 14px;padding:5px;max-width:none;" spellcheck="false" aria-label="' + r.titleDataRange + '" placeholder="' + r.titleDataRange + '">', botton: '<button id="luckysheet-pivotTable-selection-confirm" class="btn btn-primary">' + n.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + n.cancel + "</button>" })), $("body").append(_m(xn(), { menuid: "pivotTableFilter" })), $("body").append(_m(wn(), { menuid: "pivotTableFilter" })), $("body").append(function () { var e = gn().pivotTable; return '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel" id="luckysheet-pivotTable-config-option"> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.titleSort + '</span> <select class="luckysheet-mousedown-cancel" style="height:24px;" id="luckysheet-pivotTable-config-option-order"> <option selected="selected" value="default">' + e.titleNoSort + '</option> <option value="asc">' + e.titleSortAsc + '</option> <option value="desc">' + e.titleSortDesc + '</option> </select> </div> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.titleSortBy + '</span> <select class="luckysheet-mousedown-cancel" style="height:24px;" id="luckysheet-pivotTable-config-option-orderby"> </select> </div> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.titleShowSum + '</span> <select class="luckysheet-mousedown-cancel" style="height:24px;" id="luckysheet-pivotTable-config-option-stastic"> <option value="0">' + e.titleStasticFalse + '</option> <option value="1" selected="selected">' + e.titleStasticTrue + "</option> </select> </div> </div> </div> </div>" }()), $("body").append(function () { var e = gn().pivotTable; return '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel" id="luckysheet-pivotTable-config-option-sumtype"> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="SUM"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsSUM + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="COUNT"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsCOUNT + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="COUNTA"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsCOUNTA + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="COUNTUNIQUE"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsCOUNTUNIQUE + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="AVERAGE"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsAVERAGE + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="MAX"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsMAX + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="MIN"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsMIN + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="MEDIAN"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsMEDIAN + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="PRODUCT"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsPRODUCT + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="STDEV"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsSTDEV + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="STDEVP"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsSTDEVP + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="VAR"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticslet + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> <div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" sumtype="VARP"> <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel"> <span class="luckysheet-mousedown-cancel">' + e.valueStatisticsVARP + '</span> <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;"><i class="fa fa-check luckysheet-mousedown-cancel" aria-hidden="true"></i></span> </div> </div> </div>' }()), $("#luckysheet-pivotTableFilter-orderby-asc").remove(), $("#luckysheet-pivotTableFilter-orderby-desc").next().remove(), $("#luckysheet-pivotTableFilter-orderby-desc").remove(), $("#luckysheet-pivotTableFilter-orderby-color").next().remove(), $("#luckysheet-pivotTableFilter-orderby-color").remove(), $("#luckysheetpivottablevaluecolrow, #luckysheetpivottablevaluecolrow1").checkboxradio({ icon: !1 }).change((function () { t.refreshPivotTable() })); var i = null; $("#luckysheet-pivotTableFilter-menu").mouseover((function () { clearTimeout(i), i = setTimeout((function () { $("#luckysheet-pivotTableFilter-submenu").hide() }), 500) })), $(document).off("click.ptFilterCheckbox1").on("click.ptFilterCheckbox1", "#luckysheet-pivotTableFilter-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.ptFilterCheckbox2").on("click.ptFilterCheckbox2", "#luckysheet-pivotTableFilter-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.ptFilterCheckbox3").on("click.ptFilterCheckbox3", "#luckysheet-pivotTableFilter-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.ptFilterCheckbox4").on("click.ptFilterCheckbox4", "#luckysheet-pivotTableFilter-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.ptFilterYearDropdown").on("click.ptFilterYearDropdown", "#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right", (function () { var e = $(this).parents(".luckysheet-mousedown-cancel"); e.hasClass("year") && $(this).parents(".yearBox").find(".monthList").slideToggle(), e.hasClass("month") && $(this).parents(".monthBox").find(".dayList").slideToggle() })), $("#luckysheet-pivotTableFilter-byvalue-btn-all").click((function () { $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").prop("checked", !0), $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").parents(".luckysheet-mousedown-cancel").attr("data-check", "true") })), $("#luckysheet-pivotTableFilter-byvalue-btn-contra").click((function () { $("#luckysheet-pivotTableFilter-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-pivotTableFilter-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-pivotTableFilter-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-pivotTableFilter-byvalue-btn-clear").click((function () { $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").removeAttr("checked"), $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").parents(".luckysheet-mousedown-cancel").attr("data-check", "false") })), $("#luckysheet-pivotTableFilter-byvalue-input").on("input propertychange", (function () { var e = $(this).val().toString(); ($("#luckysheet-pivotTableFilter-byvalue-select .ListBox .luckysheet-mousedown-cancel").show(), "" != e) && $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").each((function (t, a) { var r = $(a).parents(".luckysheet-mousedown-cancel"); if (r.hasClass("day")) { var n = $(a).siblings("label").text().toString(), l = $(a).parents(".monthBox").find(".month label").text().toString(); if (-1 == ($(a).parents(".yearBox").find(".year label").text().toString() + "-" + l + "-" + n).indexOf(e)) $(a).parents(".day").hide(), 0 == $(a).parents(".dayList").find(".day:visible").length && $(a).parents(".monthBox").find(".month").hide(), 0 == $(a).parents(".monthList").find(".day:visible").length && $(a).parents(".yearBox").find(".year").hide() } r.hasClass("textBox") && (-1 == $(a).siblings("label").text().toString().indexOf(e) && $(a).parents(".textBox").hide()) })) })), $("#luckysheet-pivotTableFilter-bycondition, #luckysheet-pivotTableFilter-byvalue").click((function () { var e = $(this); e.next().slideToggle(200), setTimeout((function () { "luckysheet-pivotTableFilter-bycondition" == e.attr("id") && $("#luckysheet-pivotTableFilter-bycondition").next().is(":visible") && $("#luckysheet-pivotTableFilter-selected span").text() != l.filiterInputNone && $("#luckysheet-pivotTableFilter-byvalue").next().slideUp(200), e.is($("#luckysheet-pivotTableFilter-bycondition")) && $("#luckysheet-pivotTableFilter-bycondition").next().is(":hidden") && $("#luckysheet-pivotTableFilter-byvalue").next().is(":hidden") && $("#luckysheet-pivotTableFilter-byvalue").next().slideDown(200) }), 300) })), $("#luckysheet-pivotTableFilter-cancel").click((function () { $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide() })), $("#luckysheet-pivotTableFilter-selected").click((function () { var e = $(this).offset(), t = $("#luckysheet-pivotTableFilter-submenu"); t.hide(); var a = $(window).height(), r = $(window).width(), n = t.width(), l = (t.height(), e.top), o = e.left, s = a - e.top - 20; e.left + n > r && (o = e.left - n), e.top > a / 2 && ((l = a - e.top) < 0 && (l = 0), s = e.top - 20), t.css({ top: l, left: o, height: s }).show(), clearTimeout(i) })), $("#luckysheet-pivotTableFilter-submenu").mouseover((function () { clearTimeout(i) })).find(".luckysheet-cols-menuitem").click((function (e) { $("#luckysheet-pivotTableFilter-selected span").html($(this).find(".luckysheet-cols-menuitem-content").text()).data("value", $(this).data("value")), $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").hide(), "2" == $(this).data("type") ? ($("#luckysheet-pivotTableFilter-selected span").data("type", "2"), $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2").show()) : "0" == $(this).data("type") ? $("#luckysheet-pivotTableFilter-selected span").data("type", "0") : ($("#luckysheet-pivotTableFilter-selected span").data("type", "1"), $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").eq(0).show(), "dateequal" == $(this).attr("data-value") || "datelessthan" == $(this).attr("data-value") || "datemorethan" == $(this).attr("data-value") ? $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input").prop("type", "date") : $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input").prop("type", "text")), $("#luckysheet-pivotTableFilter-byvalue").next().slideUp(), $("#luckysheet-pivotTableFilter-submenu").hide() })), $("#luckysheet-modal-dialog-pivotTable-list").on("click", " .luckysheet-slider-list-item-filter", (function (e) { return t.luckysheetsliderlistitemfilter($(this)), e.stopPropagation(), !1 })), $("#luckysheet-modal-dialog-pivotTable-list").on("click", " .luckysheet-slider-list-item-filtered", (function (e) { return t.luckysheetsliderlistclearfilter($(this).next()), e.stopPropagation(), !1 })), $("#luckysheet-dialog-pivotTable-range-seleted").click((function () { $("#luckysheet-modal-dialog-slider-pivot").hide(), Uc(); var e = $("#luckysheet-data-pivotTable-selection"), a = e.outerHeight(), r = e.outerWidth(), n = $(window).width(), l = $(window).height(), i = $(document).scrollLeft(), o = $(document).scrollTop(); $("#luckysheet-data-pivotTable-selection").css({ left: (n + i - r) / 2, top: (l + o - a) / 4 }).show(), t.jgridCurrentPivotInput = $("#luckysheet-dialog-pivotTable-range").html(), $("#luckysheet-pivotTable-range-selection-input").val(t.jgridCurrentPivotInput), t.luckysheet_pivotTable_select_state = !0 })), $("#luckysheet-pivotTableFilter-initial").click((function () { $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-slider-list-item-filtered").hide(), $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").data("rowhidden", ""), $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide(), $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").hide().find("input").val(), $("#luckysheet-pivotTableFilter-selected span").data("type", "0").data("type", null).text(l.filiterInputNone), t.setDatatojsfile("filterparm", null), t.celldata = t.origindata, t.refreshPivotTable() })), $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column").on("click", ".luckysheet-modal-dialog-slider-config-item-icon", (function (e) { var t = $(e.target).closest(".luckysheet-modal-dialog-slider-config-item"), a = t.data("index"), r = t.offset(), n = t.data("order"), l = t.data("orderby"), i = t.data("stastic"); null == n && (n = "default"); var o = '<option value="self">' + t.find(".luckysheet-modal-dialog-slider-config-item-txt").data("name") + "</option>"; return $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").each((function (e) { o += '<option value="' + e + '">' + $(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text() + "</option>" })), $("#luckysheet-pivotTable-config-option-orderby").empty().html(o), null == l && (l = "self"), null == i && (i = "1"), $("#luckysheet-pivotTable-config-option-order").val(n).data("index", a), $("#luckysheet-pivotTable-config-option-orderby").val(l).data("index", a), $("#luckysheet-pivotTable-config-option-stastic").val(i).data("index", a), Pm($("#luckysheet-pivotTable-config-option"), r.left + t.outerWidth(), r.top - 13, "rightbottom"), e.stopPropagation(), !1 })), $("#luckysheet-pivotTable-config-option-order,#luckysheet-pivotTable-config-option-orderby,#luckysheet-pivotTable-config-option-stastic").change((function () { var e = $(this), a = e.data("index"); $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column").find(".luckysheet-modal-dialog-slider-config-item").each((function () { $(this).data("index") == a && $(this).data(e.attr("id").replace("luckysheet-pivotTable-config-option-", ""), e.val()) })), t.refreshPivotTable() })), $("#luckysheet-modal-dialog-config-value").on("click", ".luckysheet-modal-dialog-slider-config-item-icon", (function (e) { var a = $(e.target).closest(".luckysheet-modal-dialog-slider-config-item"), r = a.data("index"), n = a.offset(), l = a.data("sumtype"), i = t.pivot_data_type[r.toString()]; null == l && (l = "num" == i ? "SUM" : "COUNTA"); var o = $("#luckysheet-pivotTable-config-option-sumtype"); return o.find(".luckysheet-submenu-arrow").hide(), o.find(".luckysheet-cols-menuitem[sumtype='" + l + "'] .luckysheet-submenu-arrow").css("display", "inline"), o.data("item", a), Pm(o, n.left + a.outerWidth(), n.top - 13, "rightbottom"), e.stopPropagation(), !1 })), $("#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem").click((function () { var e = $("#luckysheet-pivotTable-config-option-sumtype").data("item"), a = $(this).attr("sumtype"); e.data("sumtype", $(this).attr("sumtype")); var r = t.getSumTypeName(a) + ":" + e.data("name"); e.attr("title", r).find(".luckysheet-modal-dialog-slider-config-item-txt").html(r), $("#luckysheet-pivotTable-config-option-sumtype").hide(), t.refreshPivotTable() })), $("#luckysheet-modal-dialog-config-filter").on("click", ".luckysheet-modal-dialog-slider-config-item-icon", (function (e) { var a = $(e.target).closest(".luckysheet-modal-dialog-slider-config-item").data("index"); return t.luckysheetsliderlistitemfilter($("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(a).find(".luckysheet-slider-list-item-filter")), e.stopPropagation(), !1 })), $("#luckysheet-pivotTableFilter-confirm").click((function () { var e = $("#luckysheet-pivotTableFilter-menu").data("index"), a = {}; $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").each((function () { var t = $(this), r = t.data("rowhidden"); if (t.data("index") != e) { if (null == r || "" == r) return !0; for (var n in "string" == Cm(r) && (r = JSON.parse(r)), r) a[n] = 0 } })); var r = t.origindata, n = {}, i = {}, o = {}; if ($("#luckysheet-pivotTableFilter-bycondition").next().is(":visible") && $("#luckysheet-pivotTableFilter-byvalue").next().is(":hidden") && "null" != $("#luckysheet-pivotTableFilter-selected span").data("value")) { var s = $("#luckysheet-pivotTableFilter-selected span"), c = s.data("type"), u = s.data("value"); if (o.value = u, o.text = s.text(), "0" == c) o.type = "0"; else if ("2" == c) { var d = $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2 input"); o.type = "2", o.value1 = d.eq(0).val(), o.value2 = d.eq(1).val() } else o.type = "1", o.value1 = $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").eq(0).find("input").val(); for (var h = 1; h < r.length; h++)if (!(h in a) && null != r[h]) { var m = r[h][e]; if ("cellnull" == u) null == m || ya(m.v) || (i[h] = 0); else if ("cellnonull" == u) (null == m || ya(m.v)) && (i[h] = 0); else if ("textinclude" == u) { var p = o.value1; (null == m || ya(m.v) || -1 == m.m.indexOf(p)) && (i[h] = 0) } else if ("textnotinclude" == u) { var f = o.value1; null == m || ya(m.v) || m.m.indexOf(f) > -1 && (i[h] = 0) } else if ("textstart" == u) { var g = o.value1, v = g.length; (null == m || ya(m.v) || m.m.substr(0, v) != g) && (i[h] = 0) } else if ("textend" == u) { var y = o.value1, b = y.length; (null == m || ya(m.v) || b > m.m.length || m.m.substr(m.m.length - b, b) != y) && (i[h] = 0) } else if ("textequal" == u) { var k = o.value1; (null == m || ya(m.v) || m.m != k) && (i[h] = 0) } else if ("dateequal" == u) { var x = xs(o.value1)[2]; null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "d" == m.ct.t ? parseInt(m.v) != x && (i[h] = 0) : i[h] = 0 } else if ("datelessthan" == u) { var w = xs(o.value1)[2]; null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "d" == m.ct.t ? parseInt(m.v) >= w && (i[h] = 0) : i[h] = 0 } else if ("datemorethan" == u) { var _ = xs(o.value1)[2]; null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "d" == m.ct.t ? parseInt(m.v) <= _ && (i[h] = 0) : i[h] = 0 } else if ("morethan" == u) { var C = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v <= C && (i[h] = 0) : i[h] = 0 } else if ("moreequalthan" == u) { var T = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v < T && (i[h] = 0) : i[h] = 0 } else if ("lessthan" == u) { var A = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v >= A && (i[h] = 0) : i[h] = 0 } else if ("lessequalthan" == u) { var S = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v > S && (i[h] = 0) : i[h] = 0 } else if ("equal" == u) { var I = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v != I && (i[h] = 0) : i[h] = 0 } else if ("noequal" == u) { var R = parseFloat(o.value1); null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v == R && (i[h] = 0) : i[h] = 0 } else if ("include" == u) { var q = parseFloat(o.value1), D = parseFloat(o.value2), F = void 0, E = void 0; q < D ? (F = q, E = D) : (E = q, F = D), null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? (m.v < F || m.v > E) && (i[h] = 0) : i[h] = 0 } else if ("noinclude" == u) { var M = parseFloat(o.value1), N = parseFloat(o.value2), P = void 0, z = void 0; M < N ? (P = M, z = N) : (z = M, P = N), null == m || ya(m.v) ? i[h] = 0 : null != m.ct && "n" == m.ct.t ? m.v >= P && m.v <= z && (i[h] = 0) : i[h] = 0 } } } else { $("#luckysheet-pivotTableFilter-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 a = $(t).siblings("label").text(); Number(a) < 10 && (a = "0" + a); var r = $(t).closest(".monthBox").find(".month label").text().replace(l.filiterMonthText, ""); Number(r) < 10 && (r = "0" + r); var i = $(t).closest(".yearBox").find(".year label").text().replace(l.filiterYearText, ""), o = l.filterDateFormatTip + "#$$$#" + i + "-" + r + "-" + a; n[o] = "1" } if ($(t).closest(".textBox").length > 0) { var s = $(t).closest(".textBox").data("filter"); n[s] = "1" } })); for (var L = 1; L < r.length; L++)if (!(L in a) && null != r[L]) { var O = r[L][e], B = void 0; if (null == O || ya(O.v)) B = "null#$$$#null"; else if (null != O.ct && "d" == O.ct.t) { var V = ws("YYYY-MM-DD", O.v); B = l.filterDateFormatTip + "#$$$#" + V } else B = O.v + "#$$$#" + O.m; B in n && (i[L] = 0) } } var H = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(e); $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible:checked").length < $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible").length || $("#luckysheet-pivotTableFilter-byvalue-input").val().length > 0 || $("#luckysheet-pivotTableFilter-bycondition").next().is(":visible") && $("#luckysheet-pivotTableFilter-byvalue").next().is(":hidden") && "null" != $("#luckysheet-pivotTableFilter-selected span").data("value") ? (H.data("rowhidden", JSON.stringify(i)).find(".luckysheet-slider-list-item-filtered").show(), t.setDatatojsfile("rowhidden", i, e), null != o && (H.data("byconditionvalue", o.value).data("byconditiontype", o.type).data("byconditiontext", o.text), null != o.value1 && H.data("byconditionvalue1", o.value1), null != o.value2 && H.data("byconditionvalue2", o.value2), t.setDatatojsfile("caljs", o, e))) : (H.data("rowhidden", "").find(".luckysheet-slider-list-item-filtered").hide(), t.setDatatojsfile("rowhidden", null, e)); for (var U = [], j = 0; j < r.length; j++)j in i || j in a || U.push([].concat(r[j])); t.celldata = U, t.refreshPivotTable(), $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide(), yd() })), $("#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn, #luckysheet-data-pivotTable-selection .luckysheet-modal-dialog-title-close").click((function () { $("#luckysheet-modal-dialog-slider-pivot").show(), Uc(), $("#luckysheet-cell-main .luckysheet-pivotTable-selection-set div").show(), $("#luckysheet-data-pivotTable-selection").hide(), Sh.changeSheetExec(t.pivotSheetIndex), t.luckysheet_pivotTable_select_state = !1, yd() })), $("#luckysheet-pivotTable-selection-confirm").click((function () { var e = $("#luckysheet-pivotTable-range-selection-input"), a = e.val(); if (0 == $.trim(a).length || $.trim(a).toUpperCase() == t.jgridCurrentPivotInput.toUpperCase()) return e.val(t.jgridCurrentPivotInput), void $("#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn").click(); var n = a.split("!"), l = "", i = "", o = -1; if (n.length > 1) { for (var s in l = n[0], i = n[1], ga.luckysheetfile) if (l == ga.luckysheetfile[s].name) { o = ga.luckysheetfile[s].index; break } -1 == o && (o = 0) } else { var c = _l(ga.currentSheetIndex); l = ga.luckysheetfile[c].name, o = ga.luckysheetfile[c].index, i = n[0] } if (ga.luckysheetfile[_l(o)].isPivotTable) return wa() ? alert(r.errorNotAllowPivotData) : fd.info("", r.errorNotAllowPivotData), void e.val(t.jgridCurrentPivotInput); if (-1 == i.indexOf(":")) return wa() ? alert(r.errorSelectionRange) : fd.info("", r.errorSelectionRange), void e.val(t.jgridCurrentPivotInput); i = i.split(":"); var u = [], d = []; return u[0] = parseInt(i[0].replace(/[^0-9]/g, "")) - 1, u[1] = parseInt(i[1].replace(/[^0-9]/g, "")) - 1, u[0] > u[1] ? (wa() ? alert(r.errorSelectionRange) : fd.info("", r.errorSelectionRange), void e.val(t.jgridCurrentPivotInput)) : (d[0] = Sm(i[0].replace(/[^A-Za-z]/g, "")), d[1] = Sm(i[1].replace(/[^A-Za-z]/g, "")), d[0] > d[1] ? (wa() ? alert(r.errorSelectionRange) : fd.info(r.errorSelectionRange), void e.val(t.jgridCurrentPivotInput)) : (Sh.changeSheetExec(t.pivotSheetIndex), t.setDatatojsfile("pivot_select_save", { row: u, column: d }), t.setDatatojsfile("pivotDataSheetIndex", o), t.getCellData(t.pivotSheetIndex, o, { row: u, column: d }), t.initialPivotManage(), $("#luckysheet-dialog-pivotTable-range").html(a), $("#luckysheet-modal-dialog-slider-pivot").show(), $("#luckysheet-data-pivotTable-selection").hide(), t.luckysheet_pivotTable_select_state = !1, t.refreshPivotTable(), Uc(), void yd())) })), $("#luckysheet-modal-dialog-slider-pivot").on("mousedown", ".luckysheet-slider-list-item-name, .luckysheet-modal-dialog-slider-config-item-txt", (function (e) { var a = $(e.target); t.movestate = !0, t.movesave.obj = a.parent(), t.movesave.name = a.data("name"), t.movesave.containerid = a.parent().parent().attr("id"), t.movesave.index = a.data("index"), 0 == $("#luckysheet-modal-dialog-slider-pivot-move").length && $("body").append('<div id="luckysheet-modal-dialog-slider-pivot-move">' + t.movesave.name + "</div>"), t.movesave.width = $("#luckysheet-modal-dialog-slider-pivot-move").outerWidth(), t.movesave.height = $("#luckysheet-modal-dialog-slider-pivot-move").outerHeight(), $("#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-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value").mousemove((function (e) { if (t.movestate) { 0 == t.moveitemposition.length && (t.moveitemposition = [0], $(this).find(".luckysheet-modal-dialog-slider-config-item").each((function (e) { var a = $(this).outerHeight(); t.moveitemposition.push(t.moveitemposition[e] + a + 2) })), $(this).append('<div id="luckysheet-modal-dialog-config-order-help" style="position:absolute;height:3px;width:100%;background:#007ACC;z-index:1;pointer-events: none;user-select:none;"></div>')), $("#luckysheet-modal-dialog-slider-pivot-move").css({ background: "#FD8585", color: "#fff", border: "1px solid #FD7070" }); event.pageX; var a = event.pageY, r = $(this), n = a - r.offset().top + r.scrollTop(), l = t.moveitemposition, i = Ts(l, n); -1 == i ? $("#luckysheet-modal-dialog-config-order-help").css({ top: l[l.length - 1] }) : n - l[i - 1] > (l[i] - l[i - 1]) / 2 ? $("#luckysheet-modal-dialog-config-order-help").css({ top: l[i] }) : $("#luckysheet-modal-dialog-config-order-help").css({ top: l[i - 1] }) } })).mouseleave((function () { t.movestate && ($("#luckysheet-modal-dialog-slider-pivot-move").css({ background: "#fff", color: "#000", border: "1px dotted #000" }), t.moveitemposition = [], $("#luckysheet-modal-dialog-config-order-help").remove()) })).mouseup((function (e) { if (t.movestate) { var a, n = $(this); if (t.movesave.containerid == n.attr("id")) a = t.movesave.obj.clone(); else { var l = t.movesave.name, i = "", o = ""; if ("luckysheet-modal-dialog-config-value" == n.attr("id")) "num" == t.pivot_data_type[t.movesave.index.toString()] ? (l = r.valueStatisticsSUM + ":" + l, i = "data-sumtype='SUM'", o = "data-nameindex='0'") : (l = r.valueStatisticsCOUNTA + ":" + l, i = "data-sumtype='COUNTA'", o = "data-nameindex='0'"), $("#luckysheet-modal-dialog-config-value").find(".luckysheet-modal-dialog-slider-config-item").each((function () { if ($(this).find(".luckysheet-modal-dialog-slider-config-item-txt").text() == l) { var e = parseFloat($(this).data("nameindex")) + 1; return l += e.toString(), $(this).data("nameindex", e), !1 } })); a = '<div title="' + l + '" class="luckysheet-modal-dialog-slider-config-item" ' + o + " " + i + ' data-index="' + t.movesave.index + '" data-name="' + t.movesave.name + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' + o + " " + i + ' data-index="' + t.movesave.index + '" data-name="' + t.movesave.name + '">' + l + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>' } event.pageX; var s = event.pageY, c = $(this), u = s - c.offset().top + c.scrollTop(), d = t.moveitemposition, h = Ts(d, u); ("luckysheet-modal-dialog-pivotTable-list" == t.movesave.containerid || "luckysheet-modal-dialog-config-value" == t.movesave.containerid && t.movesave.containerid != n.attr("id")) && $("#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column").find(".luckysheet-modal-dialog-slider-config-item").each((function () { $(this).data("index") == t.movesave.index && $(this).remove() })), -1 == h ? 0 == n.find(".luckysheet-modal-dialog-slider-config-item").length ? n.append(a) : n.find(".luckysheet-modal-dialog-slider-config-item").last().after(a) : u - d[h - 1] > (d[h] - d[h - 1]) / 2 ? n.find(".luckysheet-modal-dialog-slider-config-item").eq(h - 1).after(a) : n.find(".luckysheet-modal-dialog-slider-config-item").eq(h - 1).before(a), "luckysheet-modal-dialog-pivotTable-list" == t.movesave.containerid || "luckysheet-modal-dialog-config-value" == t.movesave.containerid && t.movesave.containerid != n.attr("id") || t.movesave.obj.remove(), $("#luckysheet-modal-dialog-pivotTable-list").find(".luckysheet-modal-dialog-slider-list-item").each((function () { var e = $(this).find(".luckysheet-slider-list-item-selected"); $(this).data("index") == t.movesave.index && 0 == e.find("i").length && e.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') })), t.refreshPivotTable(), $("#luckysheet-modal-dialog-slider-pivot-move").remove(), t.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"), t.moveitemposition = [], $("#luckysheet-modal-dialog-config-order-help").remove(), t.showvaluecolrow(), e.stopPropagation() } })), $("#luckysheet-modal-dialog-pivotTable-list").on("click", ".luckysheet-slider-list-item-selected", (function () { var e, a = $(this), r = a.parent(), n = r.data("index"), l = r.data("name"); if (0 == a.find("i").length) if (a.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>'), "num" == t.pivot_data_type[n.toString()]) e = '<div title="' + l + '" class="luckysheet-modal-dialog-slider-config-item" data-nameindex="0" data-sumtype="SUM" data-index="' + n + '" data-name="' + l + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-nameindex="0" data-sumtype="SUM" data-index="' + n + '" data-name="' + l + '">求和:' + l + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>', $("#luckysheet-modal-dialog-config-value").append(e); else { e = '<div title="' + l + '" class="luckysheet-modal-dialog-slider-config-item" data-index="' + n + '" data-name="' + l + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-index="' + n + '" data-name="' + l + '">' + l + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>'; var i = $("#luckysheet-modal-dialog-config-column"), o = $("#luckysheet-modal-dialog-config-row"), s = i.find(".luckysheet-modal-dialog-slider-config-item"), c = o.find(".luckysheet-modal-dialog-slider-config-item"); s.length < 2 ? i.append(e) : c.length < 2 ? o.append(e) : i.append(e) } else a.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 () { $(this).data("index") == n && ("luckysheet-modal-dialog-config-value" == $(this).parent().attr("id") && t.resetOrderby($(this)), $(this).remove()) })); t.refreshPivotTable(), t.showvaluecolrow() })), $("#luckysheet-dialog-pivotTable-clearitem").click((function () { $("#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 () { $(this).remove() })), $("#luckysheet-modal-dialog-pivotTable-list").find(".luckysheet-modal-dialog-slider-list-item").each((function () { $(this).find(".luckysheet-slider-list-item-selected").find("i").remove() })), t.refreshPivotTable(), t.showvaluecolrow() })) } null == e && (e = !1), t.celldata.length <= 1 && t.celldata[0].length <= 1 && (wa() ? alert(r.errorIncreaseRange) : fd.info("", r.errorIncreaseRange)); for (var o = "", s = 1, c = {}, u = 1, d = 0; d < t.celldata[0].length; d++) { var h = void 0; null != (h = t.celldata[0][d] && t.celldata[0][d].m ? t.celldata[0][d].m : Ko(0, d, t.celldata)) && (h = h.toString()), null != h && 0 != $.trim(h.toString()).length || (h = r.titleColumn + " " + u), u++, h in c && (h += s++) in c && (h += s++) in c && (h += s++), c[h] = 1; var m = "", p = ""; if (e && null != t.filterparm && null != t.filterparm[d.toString()]) { var f = t.filterparm[d.toString()]; if (null != f.rowhidden && (m += "data-rowhidden='" + JSON.stringify(f.rowhidden) + "'"), null != f.selected && (m += "data-selected='" + JSON.stringify(f.selected) + "'"), null != f.caljs) { var g = f.caljs; null != g.value && (m += "data-byconditionvalue='" + g.value + "'"), null != g.type && (m += "data-byconditiontype='" + g.type + "'"), null != g.text && (m += "data-byconditiontext='" + g.text + "'"), null != g.value1 && (m += "data-byconditionvalue1='" + g.value1 + "'"), null != g.value2 && (m += "data-byconditionvalue2='" + g.value2 + "'") } } m.length > 0 && (p = "display:block;"), o += '<div class="luckysheet-modal-dialog-slider-list-item" ' + m + ' data-index="' + d + '" data-name="' + h + '"><div title="' + r.titleAddColumn + '" class="luckysheet-slider-list-item-selected"><div></div></div><div title="' + r.titleMoveColumn + '" class="luckysheet-slider-list-item-name" ' + m + ' data-index="' + d + '" data-name="' + h + '">' + h + '</div><div title="' + r.titleClearColumnFilter + '" class="luckysheet-slider-list-item-filtered" style="' + p + '"><i class="fa fa-filter luckysheet-mousedown-cancel" aria-hidden="true"></i><i class="fa fa-times" aria-hidden="true"></i></div><div title="' + r.titleFilterColumn + '" class="luckysheet-slider-list-item-filter"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>' } if ($("#luckysheet-modal-dialog-pivotTable-list").html(o), $("#luckysheetpivottablevaluecolrowshow").hide(), $("#luckysheetpivottablevaluecolrow").prop("checked", !0), $("#luckysheetpivottablevaluecolrow1").prop("checked", !1), $("#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value").empty(), e) { if (null != t.filter && t.filter.length > 0) for (var v = 0; v < t.filter.length; v++) { var y = t.filter[v], b = '<div title="' + name + '" class="luckysheet-modal-dialog-slider-config-item" data-index="' + y.index + '" data-name="' + y.name + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-index="' + y.index + '" data-name="' + y.name + '">' + y.name + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>'; $("#luckysheet-modal-dialog-config-filter").append(b); var k = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(y.index).find(".luckysheet-slider-list-item-selected"); 0 == k.find("i").length && k.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') } if (null != t.row && t.row.length > 0) for (var x = 0; x < t.row.length; x++) { var w = t.row[x], _ = ""; null != w.order && (_ += "data-order = '" + w.order + "'"), null != w.orderby && (_ += "data-orderby = '" + w.orderby + "'"), null != w.order && (_ += "data-stastic = '" + w.stastic + "'"); var C = '<div title="' + name + '" class="luckysheet-modal-dialog-slider-config-item" ' + _ + ' data-index="' + w.index + '" data-name="' + w.name + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' + _ + ' data-index="' + w.index + '" data-name="' + w.name + '">' + w.name + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>'; $("#luckysheet-modal-dialog-config-row").append(C); var T = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(w.index).find(".luckysheet-slider-list-item-selected"); 0 == T.find("i").length && T.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') } if (null != t.column && t.column.length > 0) for (var A = 0; A < t.column.length; A++) { var S = t.column[A], I = ""; null != S.order && (I += "data-order = '" + S.order + "'"), null != S.orderby && (I += "data-orderby = '" + S.orderby + "'"), null != S.order && (I += "data-stastic = '" + S.stastic + "'"); var R = '<div title="' + name + '" class="luckysheet-modal-dialog-slider-config-item" ' + I + ' data-index="' + S.index + '" data-name="' + S.name + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' + I + ' data-index="' + S.index + '" data-name="' + S.name + '">' + S.name + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>'; $("#luckysheet-modal-dialog-config-column").append(R); var q = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(S.index).find(".luckysheet-slider-list-item-selected"); 0 == q.find("i").length && q.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') } if (null != t.values && t.values.length > 0) { for (var D = 0; D < t.values.length; D++) { var F = t.values[D], E = ""; null != F.sumtype && (E += "data-sumtype = '" + F.sumtype + "'"), null != F.nameindex && (E += "data-nameindex = '" + F.nameindex + "'"); var M = '<div title="' + name + '" class="luckysheet-modal-dialog-slider-config-item" ' + E + ' data-index="' + F.index + '" data-name="' + F.name + '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' + E + ' data-index="' + F.index + '" data-name="' + F.name + '">' + t.getSumTypeName(F.sumtype) + ":" + F.name + '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>'; $("#luckysheet-modal-dialog-config-value").append(M); var N = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(F.index).find(".luckysheet-slider-list-item-selected"); 0 == N.find("i").length && N.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') } t.values.length >= 2 && ($("#luckysheetpivottablevaluecolrowshow").show(), "column" == t.showType ? ($("#luckysheetpivottablevaluecolrow").prop("checked", !0), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").addClass("ui-state-active"), $("#luckysheetpivottablevaluecolrow1").prop("checked", !1), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").removeClass("ui-state-active")) : ($("#luckysheetpivottablevaluecolrow1").prop("checked", !0), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").addClass("ui-state-active"), $("#luckysheetpivottablevaluecolrow").prop("checked", !1), $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").removeClass("ui-state-active"))) } } $("#luckysheet-dialog-pivotTable-range").html(Cl(t.pivotDataSheetIndex, t.pivot_select_save)), $("#luckysheet-modal-dialog-slider-pivot").show(), Uc(!1) }, getComposeArray: function (e) { if (0 == e.length) return []; for (var t = [], a = 0; a < e.length; a++) { for (var r = "", n = 0; n <= a; n++)e[n] && e[n].m ? r += e[n].m : r += Ko(n, null, e); t.push(r) } return t }, getnameArray: function (e, t) { if (0 == e.length) return []; if (0 == t.length) return []; for (var a = [], r = 0; r < t.length; r++) { var n = void 0; n = e[t[r].index] && e[t[r].index].m ? e[t[r].index].m : Ko(t[r].index, null, e), a.push(n) } return a }, getTitleFromGroup: function (e, t, a) { var r = this.orderbygroup(e, t, a); return this.generategrouparraymain(r, t) }, orderbygroup: function (e, t, a) { var r = []; if (0 == e.length) return []; for (var n = null, l = (r = e).length, i = r.length, o = 0; 0 != l;)if (l--, null != (n = r[o++]).children && n.children.length > 0) { n.children = this.orderbygroupchildren(n.children, t[n.index].orderby, t[n.index].order, a); for (var s = 0; s < n.children.length; s++)r.push(n.children[s]), l++ } return e.splice(0, i) }, orderbygroupchildren: function (e, t, a, r) { if (0 == e.length) return []; var n = !1; null != a && "asc" != a || (n = !0); var l = gn().filter; return n ? e.sort((function (e, a) { var n = null, i = null; if ("self" == t || null == t) { if (n = null == e.name ? l.valueBlank : e.name.toString(), i = null == a.name ? l.valueBlank : a.name.toString(), ds(n) && ds(i)) return hs(n, i) } else n = parseFloat(r[e.orderby].result), i = parseFloat(r[a.orderby].result); return isNaN(n) || isNaN(i) ? isNaN(n) && isNaN(i) ? n.localeCompare(i) : isNaN(n) ? 1 : isNaN(i) ? -1 : void 0 : fs(n).value() - fs(i).value() })) : e.sort((function (e, a) { var n = null, i = null; if ("self" == t || null == t) { if (n = null == e.name ? l.valueBlank : e.name.toString(), i = null == a.name ? l.valueBlank : a.name.toString(), ds(n) && ds(i)) return hs(n, i) } else n = parseFloat(r[e.orderby].result), i = parseFloat(r[a.orderby].result); return isNaN(n) || isNaN(i) ? isNaN(n) && isNaN(i) ? i.localeCompare(n) : isNaN(n) ? -1 : isNaN(i) ? 1 : void 0 : fs(i).value() - fs(n).value() })) }, generategroupaddstatic: function (e, t) { for (var a = [], r = gn().pivotTable, n = 0; n < e[0].length; n++)0 == n ? t == r.valueSum ? a.push(t) : a.push({ name: t, issum: !0 }) : a.push(""); return a }, generategrouparraymain: function (e, t) { for (var a = [], r = 0; r < e.length; r++) { var n = e[r].name, l = this.generategrouparray(e[r].children, t, 1); "1" != t[0].stastic && null != t[0].stastic || l.push(this.generategroupaddstatic(l, n)), a = a.concat(l) } return a }, generategrouparray: function (e, t, a) { for (var r = [], n = 0; n < e.length; n++) { var l = e[n].name, i = void 0; if (0 == e[n].children || 0 == e[n].children.length) i = [l], r.push(i); else { i = this.generategrouparray(e[n].children, t, a + 1); for (var o = 0; o < i.length; o++)i[o].unshift(l); "1" != t[a].stastic && null != t[a].stastic || i.push(this.generategroupaddstatic(i, l)), r = r.concat(i) } } return r }, addStatisticsData: function (e, t, a, r) { if (null == e[a] && (e[a] = { data: [], count: 0, max: -1 / 0, min: 1 / 0, counta: 0, countunique: 0, countuniquedata: {}, sum: 0, digitaldata: [], sumtype: t.sumtype, index: t.index, name: t.fullname, acc: 0 }), !0 === ms(r).num) { var n = Mm(r); e[a].digitaldata.push(n), e[a].count += 1, e[a].sum += n, n > e[a].max && (e[a].max = n), n < e[a].min && (e[a].min = n); var l = Nm(n); l > e[a].acc && (e[a].acc = l) } "" != r && (e[a].data.push(r), e[a].counta += 1, r in e[a].countuniquedata || (e[a].countuniquedata[r] = 1, e[a].countunique += 1)) }, dataHandler: function (e, t, a, r, n) { var l = gn(), i = l.filter, o = l.pivotTable; if (null == r && (r = "column"), 0 == e.length && 0 == t.length && 0 == a.length || 0 == n.length) return this.pivotDatas = [], []; for (var s = {}, c = n, u = [], d = [], h = {}, m = [], p = [], f = {}, g = 1; g < c.length; g++) { var v, y, b = c[g], k = [], x = []; v = this.getnameArray(b, t), y = this.getnameArray(b, e), k = this.getComposeArray(v), x = this.getComposeArray(y), k.length > 0 && k.unshift(o.valueSum), x.length > 0 && x.unshift(o.valueSum); for (var w = h, _ = d, C = 0; C < k.length; C++) { var T = k[C], A = 0 == C ? o.valueSum : v[C - 1]; if (null != w[C.toString()] && null != w[C.toString()][T]) _ = _[w[C.toString()][T]].children; else { var S = 0 == C ? "self" : "self" == t[C - 1].orderby || null == t[C - 1].orderby ? T : "column" == r ? T + a[parseInt(t[C - 1].orderby)].fullname : T + o.valueSum; null == A && (A = i.valueBlank), _.push({ name: A, fullname: T, index: C, orderby: S, children: [] }), null == w[C.toString()] && (w[C.toString()] = {}), null == w[C.toString()][T] && (w[C.toString()][T] = _.length - 1), _ = _[_.length - 1].children } } for (var I = f, R = p, $ = 0; $ < x.length; $++) { var q = x[$], D = 0 == $ ? o.valueSum : y[$ - 1]; if (null != I[$.toString()] && null != I[$.toString()][q]) R = R[I[$.toString()][q]].children; else { var F = 0 == $ ? "self" : "self" == e[$ - 1].orderby || null == e[$ - 1].orderby ? q : "column" == r ? o.valueSum + q : a[parseInt(e[$ - 1].orderby)].fullname + q; null == D && (D = i.valueBlank), R.push({ name: D, fullname: q, index: $, orderby: F, children: [] }), null == I[$.toString()] && (I[$.toString()] = {}), null == I[$.toString()][q] && (I[$.toString()][q] = R.length - 1), R = R[R.length - 1].children } } for (var E = 0; E < a.length; E++) { var M = Ko(a[E].index, null, b), N = [].concat(x), P = [].concat(k); "column" == r ? N.length > 0 ? (N.push(""), N = N.join(a[E].fullname + "|||").split("|||").slice(0, N.length - 1)) : N.push(a[E].fullname) : P.length > 0 ? (P.push(""), P = P.join(a[E].fullname + "|||").split("|||").slice(0, P.length - 1)) : P.push(a[E].fullname), 0 == N.length && N.push(""), 0 == P.length && P.push(""); for (var z = 0; z < P.length; z++)for (var L = 0; L < N.length; L++) { var O = P[z] + N[L]; this.addStatisticsData(s, a[E], O, M) } } } for (var B in s) { var V = s[B]; if ("SUM" == V.sumtype) V.result = V.sum; else if ("COUNT" == V.sumtype) V.result = V.count; else if ("COUNTA" == V.sumtype) V.result = V.counta; else if ("COUNTUNIQUE" == V.sumtype) V.result = V.countunique; else if ("AVERAGE" == V.sumtype) V.result = Mm(V.sum / V.count); else if ("MAX" == V.sumtype) V.result = V.max; else if ("MIN" == V.sumtype) V.result = V.min; else if ("MEDIAN" == V.sumtype) { var H = V.digitaldata.sort((function (e, t) { return e - t })), U = H.length, j = parseInt(U / 2); V.result = U % 2 == 0 ? (H[j - 1] + H[j]) / 2 : H[j] } else if ("PRODUCT" == V.sumtype) V.result = new Function("return " + V.digitaldata.join("*"))(); else if ("STDEV" == V.sumtype) { var G = V.sum / V.count; V.result = Au(G, V.digitaldata) } else if ("STDEVP" == V.sumtype) { var W = V.sum / V.count; V.result = Tu(W, V.digitaldata) } else if ("let" == V.sumtype) { var Y = V.sum / V.count; V.result = Iu(Y, V.digitaldata) } else if ("VARP" == V.sumtype) { var X = V.sum / V.count; V.result = Su(X, V.digitaldata) } var K = Nm(V.result); K > V.acc && (V.acc = K), V.result = Mm(V.result, V.acc) } if (u = this.getTitleFromGroup(d, t, s), m = this.getTitleFromGroup(p, e, s), "column" == r) if (m.length > 0 && m[0].length > 0) m = this.addValuesToTitle(m, a); else for (var Z = 0; Z < a.length; Z++)m.push([a[Z].fullname]); else if (u.length > 0 && u[0].length > 0) u = this.addValuesToTitle(u, a); else for (var Q = 0; Q < a.length; Q++)u.push([a[Q].fullname]); var J = m; m = Cu(m, !1); for (var ee = 0 == a.length ? 0 : 1, te = (0 == m.length ? ee : m.length) + (0 == u.length ? ee : u.length), ae = (0 == m.length ? ee : m[0].length) + (0 == u.length ? ee : u[0].length), re = m.length, ne = 0 == u.length ? 0 : u[0].length, le = [], ie = 0; ie < te; ie++) { le[ie] = new Array(ae); for (var oe = 0; oe < ae; oe++) { var se = u[ie - re]; if (ie < re && oe < ne) le[ie][oe] = ""; else if (ie < re && oe >= ne) null != m[ie] ? "object" == Cm(m[ie][oe - ne]) ? le[ie][oe] = m[ie][oe - ne].name + o.valueSum : le[ie][oe] = m[ie][oe - ne] : le[ie][oe] = ""; else if (ie >= re && oe < ne) null != se ? "object" == Cm(se[oe]) ? le[ie][oe] = se[oe].name + o.valueSum : le[ie][oe] = se[oe] : le[ie][oe] = ""; else { var ce = ""; if (null != se) if (se instanceof Array && 1 != se.length) for (var ue = 0; ue < se.length; ue++)"object" == Cm(se[ue]) ? ce += se[ue].name : ce += se[ue]; else ce = se instanceof Array ? se[0] : se; var de = "", he = J[oe - ne]; if (null != he) if (he instanceof Array && 1 != he.length) for (var me = 0; me < he.length; me++)"object" == Cm(he[me]) ? de += he[me].name : de += he[me]; else de = he instanceof Array ? he[0] : he; var pe = ce; "" != ce && "" != de ? pe = ce + de : "" == ce && (pe = de), le[ie][oe] = null == s[pe] ? "" : s[pe].result } } } if (1 == a.length && e.length > 0 && t.length > 0) le[0][0] = a[0].fullname, le.splice(e.length, 1); else if (1 == a.length && e.length > 0) { for (var fe = le.splice(e.length, 1), ge = [], ve = 0; ve < le.length; ve++) { var ye = []; ve == le.length - 1 ? ye.push(fe[0][0]) : ye.push(""); for (var be = 0; be < le[ve].length - 1; be++)ye.push(le[ve][be]); ge.push(ye) } le = ge } return this.pivotDatas = le, le }, drillDown: function (e, t) { if (bu(ga.currentSheetIndex, "usePivotTablereports")) { this.pivotDatas[e][t]; for (var a = $.extend(!0, [], Sh.nulldata), r = gn(), n = r.filter, l = r.pivotTable, i = 1, o = 0; o < this.celldata[0].length; o++) { var s = void 0; null != (s = this.celldata[0][o] && this.celldata[0][o].m ? this.celldata[0][o].m : Ko(0, o, this.celldata)) && (s = s.toString()), null != s && 0 != $.trim(s.toString()).length || (s = l.titleColumn + " " + i), i++, a[0][o] = s } var c = {}; if (null != this.row && this.row.length > 0) for (var u = 0; u < this.row.length; u++)c[this.row[u].index] = this.pivotDatas[e][u]; if (null != this.column && this.column.length > 0) for (var d = 0; d < this.column.length; d++)c[this.column[d].index] = this.pivotDatas[d][t]; for (var h = [], m = 1; m < this.celldata.length; m++) { var p = !0; for (var f in c) { var g = void 0; if ((g = null != (g = this.celldata[m][f] && this.celldata[m][f].m ? this.celldata[m][f].m : Ko(m, f, this.celldata)) ? g.toString() : n.valueBlank) != c[f]) { p = !1; break } } p && h.push(m) } for (var v = 0; v < h.length; v++)for (var y = 0; y < this.celldata[0].length; y++) { var b = void 0; b = null != (b = this.celldata[h[v]][y] && this.celldata[h[v]][y].m ? this.celldata[h[v]][y].m : Ko(h[v], y, this.celldata)) ? b.toString() : "", a[v + 1][y] = b } ga.luckysheet_select_save = [{ row: [0, h.length], column: [0, this.celldata[0].length - 1] }], ga.clearjfundo = !1, id(a, ga.luckysheet_select_save), Rh(), ga.clearjfundo = !0 } } }, $u = function () { var e, t; return e = function () { this.init.apply(this, arguments) }, arguments.length > 1 ? (arguments[0] ? (e.prototype = $.extend(new arguments[0], arguments[arguments.length - 1]), e._super = arguments[0].prototype) : e.prototype = arguments[arguments.length - 1], arguments.length > 2 && ((t = Array.prototype.slice.call(arguments, 1, -1)).unshift(e.prototype), $.extend.apply($, t))) : e.prototype = arguments[0], e.prototype.cls = e, e }, qu = $u({ fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, precre: /(\w+)\.(\d+)/, init: function (e, t) { this.format = e, this.fclass = t }, render: function (e, t, a) { var r, n, l, i, o, s = this, c = e; return this.format.replace(this.fre, (function () { return n = arguments[1], l = arguments[3], (r = s.precre.exec(n)) ? (o = r[2], n = r[1]) : o = !1, void 0 === (i = c[n]) ? "" : l && t && t[l] ? t[l].get ? t[l].get(i) || i : t[l][i] || i : (zu(i) && (i = a.get("numberFormatter") ? a.get("numberFormatter")(i) : Lu(i, o, a.get("numberDigitGroupCount"), a.get("numberDigitGroupSep"), a.get("numberDecimalMark"))), i) })) } }); $.spformat = function (e, t) { return new qu(e, t) }; var Du = function (e, t, a) { return e < t ? t : e > a ? a : e }, Fu = function (e, t) { var a; return 2 === t ? (a = Math.floor(e.length / 2), e.length % 2 ? e[a] : (e[a - 1] + e[a]) / 2) : e.length % 2 ? (a = (e.length * t + t) / 4) % 1 ? (e[Math.floor(a)] + e[Math.floor(a) - 1]) / 2 : e[a - 1] : (a = (e.length * t + 2) / 4) % 1 ? (e[Math.floor(a)] + e[Math.floor(a) - 1]) / 2 : e[a - 1] }, Eu = function (e) { var t; switch (e) { case "undefined": e = void 0; break; case "null": e = null; break; case "true": e = !0; break; case "false": e = !1; break; default: e == (t = parseFloat(e)) && (e = t) }return e }, Mu = function (e) { var t, a = []; for (t = e.length; t--;)a[t] = Eu(e[t]); return a }, Nu = function (e, t, a) { var r; for (r = t.length; r--;)if ((!a || null !== t[r]) && t[r] !== e) return !1; return !0 }, Pu = function (e, t) { var a, r, n = []; for (a = 0, r = e.length; a < r; a++)e[a] !== t && n.push(e[a]); return n }, zu = function (e) { return !isNaN(parseFloat(e)) && isFinite(e) }, Lu = function (e, t, a, r, n) { var l, i; for (e = (!1 === t ? parseFloat(e).toString() : e.toFixed(t)).split(""), (l = (l = $.inArray(".", e)) < 0 ? e.length : l) < e.length && (e[l] = n), i = l - a; i > 0; i -= a)e.splice(i, 0, r); return e.join("") }, Ou = $u({ init: function (e) { var t, a, r = []; for (t in e) e.hasOwnProperty(t) && "string" == typeof t && t.indexOf(":") > -1 && ((a = t.split(":"))[0] = 0 === a[0].length ? -1 / 0 : parseFloat(a[0]), a[1] = 0 === a[1].length ? 1 / 0 : parseFloat(a[1]), a[2] = e[t], r.push(a)); this.map = e, this.rangelist = r || !1 }, get: function (e) { var t, a, r, n = this.rangelist; if (void 0 !== (r = this.map[e])) return r; if (n) for (t = n.length; t--;)if ((a = n[t])[0] <= e && a[1] >= e) return a[2] } }); $.range_map = function (e) { return new Ou(e) }; var Bu = { defaultOption: { common: { type: "line", lineColor: "#2ec7c9", fillColor: "#CCF3F4", defaultPixelsPerValue: 3, width: "auto", height: "auto", composite: !1, tagValuesAttribute: "values", tagOptionsPrefix: "spark", enableTagOptions: !1, enableHighlight: !0, highlightLighten: 1.4, tooltipSkipNull: !0, tooltipPrefix: "", tooltipSuffix: "", disableHiddenCheck: !1, numberFormatter: !1, numberDigitGroupCount: 3, numberDigitGroupSep: ",", numberDecimalMark: ".", disableTooltips: !0, disableInteraction: !0, offsetX: 0, offsetY: 0 }, line: { spotColor: 0, highlightSpotColor: "#5f5", highlightLineColor: "#f22", spotRadius: 1.5, minSpotColor: 0, maxSpotColor: 0, lineWidth: 1, normalRangeMin: void 0, normalRangeMax: void 0, normalRangeColor: "#ccc", drawNormalOnTop: !0, chartRangeMin: void 0, chartRangeMax: void 0, chartRangeMinX: void 0, chartRangeMaxX: void 0 }, bar: { barColor: "#fc5c5c", negBarColor: "#97b552", stackedBarColor: ["#2ec7c9", "#fc5c5c", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3", "#e5cf0d", "#97b552", "#95706d", "#dc69aa", "#07a2a4", "#9a7fd1", "#588dd5", "#f5994e", "#c05050", "#59678c", "#c9ab00", "#7eb00a", "#6f5553", "#c14089"], zeroColor: void 0, nullColor: void 0, zeroAxis: !0, barWidth: 4, barSpacing: 1, chartRangeMax: void 0, chartRangeMin: void 0, chartRangeClip: !1, colorMap: void 0 }, column: { barColor: "#fc5c5c", negBarColor: "#97b552", stackedBarColor: ["#2ec7c9", "#fc5c5c", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3", "#e5cf0d", "#97b552", "#95706d", "#dc69aa", "#07a2a4", "#9a7fd1", "#588dd5", "#f5994e", "#c05050", "#59678c", "#c9ab00", "#7eb00a", "#6f5553", "#c14089"], zeroColor: void 0, nullColor: void 0, zeroAxis: !0, barWidth: 4, barSpacing: 1, chartRangeMax: void 0, chartRangeMin: void 0, chartRangeClip: !1, colorMap: void 0 }, tristate: { barWidth: 4, barSpacing: 1, posBarColor: "#fc5c5c", negBarColor: "#97b552", zeroBarColor: "#999", colorMap: {} }, discrete: { lineHeight: "auto", thresholdColor: "#fc5c5c", thresholdValue: 0, chartRangeMax: void 0, chartRangeMin: void 0, chartRangeClip: !1 }, bullet: { targetColor: "#f33", targetWidth: 3, performanceColor: "#33f", rangeColors: ["#d3dafe", "#a8b6ff", "#7f94ff", "#6D87FF", "#5876FF", "#4465FF", "#2F54FF", "#1A43FF", "#0532FF"], base: void 0 }, pie: { offset: 0, sliceColors: ["#2ec7c9", "#fc5c5c", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3", "#e5cf0d", "#97b552", "#95706d", "#dc69aa", "#07a2a4", "#9a7fd1", "#588dd5", "#f5994e", "#c05050", "#59678c", "#c9ab00", "#7eb00a", "#6f5553", "#c14089"], borderWidth: 0, borderColor: "#000" }, box: { raw: !1, boxLineColor: "#000", boxFillColor: "#cdf", whiskerColor: "#000", outlierLineColor: "#5E5E5E", outlierFillColor: "#fff", medianColor: "#f00", showOutliers: !0, outlierIQR: 1.5, spotRadius: 1.5, target: void 0, targetColor: "#4a2", chartRangeMax: void 0, chartRangeMin: void 0 } }, line: { type: "line", init: function (e, t, a, r, n) { this.vertices = [], this.regionMap = [], this.xvalues = [], this.yvalues = [], this.yminmax = [], this.hightlightSpotId = null, this.lastShapeId = null }, getRegion: function (e, t, a) { var r, n = this.regionMap; for (r = n.length; r--;)if (null !== n[r] && t >= n[r][0] && t <= n[r][1]) return n[r][2] }, getCurrentRegionFields: function () { var e = this.currentRegion; return { isNull: null === this.yvalues[e], x: this.xvalues[e], y: this.yvalues[e], color: this.options.get("lineColor"), fillColor: this.options.get("fillColor"), offset: e } }, renderHighlight: function () { var e, t, a = this.currentRegion, r = this.target, n = this.vertices[a], l = this.options, i = l.get("spotRadius"), o = l.get("highlightSpotColor"), s = l.get("highlightLineColor"); n && (i && o && (e = r.drawCircle(n[0], n[1], i, void 0, o), this.highlightSpotId = e.id, r.insertAfterShape(this.lastShapeId, e)), s && (t = r.drawLine(n[0], this.canvasTop, n[0], this.canvasTop + this.canvasHeight, s), this.highlightLineId = t.id, r.insertAfterShape(this.lastShapeId, t))) }, removeHighlight: function () { var e = this.target; this.highlightSpotId && (e.removeShapeId(this.highlightSpotId), this.highlightSpotId = null), this.highlightLineId && (e.removeShapeId(this.highlightLineId), this.highlightLineId = null) }, scanValues: function () { var e, t, a, r, n, l = this.values, i = l.length, o = this.xvalues, s = this.yvalues, c = this.yminmax; for (e = 0; e < i; e++)t = l[e], a = "string" == typeof l[e], r = "object" === Sa(l[e]) && l[e] instanceof Array, n = a && l[e].split(":"), a && 2 === n.length ? (o.push(Number(n[0])), s.push(Number(n[1])), c.push(Number(n[1]))) : r ? (o.push(t[0]), s.push(t[1]), c.push(t[1])) : (o.push(e), null === l[e] || "null" === l[e] ? s.push(null) : (s.push(Number(t)), c.push(Number(t)))); this.options.get("xvalues") && (o = this.options.get("xvalues")), this.maxy = this.maxyorg = Math.max.apply(Math, c), this.miny = this.minyorg = Math.min.apply(Math, c), this.maxx = Math.max.apply(Math, o), this.minx = Math.min.apply(Math, o), this.xvalues = o, this.yvalues = s, this.yminmax = c }, processRangeOptions: function () { var e = this.options, t = e.get("normalRangeMin"), a = e.get("normalRangeMax"); void 0 !== t && (t < this.miny && (this.miny = t), a > this.maxy && (this.maxy = a)), void 0 !== e.get("chartRangeMin") && (e.get("chartRangeClip") || e.get("chartRangeMin") < this.miny) && (this.miny = e.get("chartRangeMin")), void 0 !== e.get("chartRangeMax") && (e.get("chartRangeClip") || e.get("chartRangeMax") > this.maxy) && (this.maxy = e.get("chartRangeMax")), void 0 !== e.get("chartRangeMinX") && (e.get("chartRangeClipX") || e.get("chartRangeMinX") < this.minx) && (this.minx = e.get("chartRangeMinX")), void 0 !== e.get("chartRangeMaxX") && (e.get("chartRangeClipX") || e.get("chartRangeMaxX") > this.maxx) && (this.maxx = e.get("chartRangeMaxX")) }, drawNormalRange: function (e, t, a, r, n) { var l = this.options.get("normalRangeMin"), i = this.options.get("normalRangeMax"), o = t + Math.round(a - a * ((i - this.miny) / n)), s = Math.round(a * (i - l) / n); 0 == s && l == i && (s = 1), this.target.drawRect(e, o, r, s, void 0, this.options.get("normalRangeColor")).append() }, render: function (e, t) { this.vertices = [], this.regionMap = [], this.xvalues = [], this.yvalues = [], this.yminmax = [], this.hightlightSpotId = null, this.lastShapeId = null, this.values = t; var a, r, n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b, k, x, w, _, C, T, A = this.options, S = this.target, I = e.mergedOptions.width, R = e.mergedOptions.height, q = this.vertices, D = A.get("spotRadius"), F = this.regionMap; if (this.scanValues(), this.processRangeOptions(), _ = this.xvalues, C = this.yvalues, this.yminmax.length && !(this.yvalues.length < 2)) { for (l = i = 0, a = this.maxx - this.minx == 0 ? 1 : this.maxx - this.minx, r = this.maxy - this.miny == 0 ? 1 : this.maxy - this.miny, n = this.yvalues.length - 1, D && (I < 4 * D || R < 4 * D) && (D = 0), D && (((x = A.get("highlightSpotColor") && !A.get("disableInteraction")) || A.get("minSpotColor") || A.get("spotColor") && C[n] === this.miny) && (R -= Math.ceil(D)), (x || A.get("maxSpotColor") || A.get("spotColor") && C[n] === this.maxy) && (R -= Math.ceil(D), l += Math.ceil(D)), (x || (A.get("minSpotColor") || A.get("maxSpotColor")) && (C[0] === this.miny || C[0] === this.maxy)) && (i += Math.ceil(D), I -= Math.ceil(D)), (x || A.get("spotColor") || A.get("minSpotColor") || A.get("maxSpotColor") && (C[n] === this.miny || C[n] === this.maxy)) && (I -= Math.ceil(D))), R--, void 0 === A.get("normalRangeMin") || A.get("drawNormalOnTop") || this.drawNormalRange(i, l, R, I, r), c = [s = []], p = f = null, g = C.length, T = 0; T < g; T++)u = _[T], h = _[T + 1], d = C[T], f = (m = i + Math.round((u - this.minx) * (I / a))) + ((T < g - 1 ? i + Math.round((h - this.minx) * (I / a)) : I) - m) / 2, F[T] = [p || 0, f, T], p = f, null === d ? T && (null !== C[T - 1] && (s = [], c.push(s)), q.push(null)) : (d < this.miny && (d = this.miny), d > this.maxy && (d = this.maxy), s.length || s.push([m, l + R]), o = [m, l + Math.round(R - R * ((d - this.miny) / r))], s.push(o), q.push(o)); for (v = [], y = [], b = c.length, T = 0; T < b; T++)(s = c[T]).length && (A.get("fillColor") && (s.push([s[s.length - 1][0], l + R]), y.push(s.slice(0)), s.pop()), s.length > 2 && (s[0] = [s[0][0], s[1][1]]), v.push(s)); for (b = y.length, T = 0; T < b; T++)S.drawShape(y[T], A.get("fillColor"), A.get("fillColor")).append(); for (b = v.length, T = 0; T < b; T++)S.drawShape(v[T], A.get("lineColor"), void 0, A.get("lineWidth")).append(); if (void 0 !== A.get("normalRangeMin") && A.get("drawNormalOnTop") && this.drawNormalRange(i, l, R, I, r), D && A.get("valueSpots")) for (void 0 === (k = A.get("valueSpots")).get && (k = new Ou(k)), T = 0; T < g; T++)(w = k.get(C[T])) && S.drawCircle(i + Math.round((_[T] - this.minx) * (I / a)), l + Math.round(R - R * ((C[T] - this.miny) / r)), D, void 0, w).append(); D && A.get("spotColor") && null !== C[n] && S.drawCircle(i + Math.round((_[_.length - 1] - this.minx) * (I / a)), l + Math.round(R - R * ((C[n] - this.miny) / r)), D, void 0, A.get("spotColor")).append(), this.maxy !== this.minyorg && (D && A.get("minSpotColor") && (u = _[$.inArray(this.minyorg, C)], S.drawCircle(i + Math.round((u - this.minx) * (I / a)), l + Math.round(R - R * ((this.minyorg - this.miny) / r)), D, void 0, A.get("minSpotColor")).append()), D && A.get("maxSpotColor") && (u = _[$.inArray(this.maxyorg, C)], S.drawCircle(i + Math.round((u - this.minx) * (I / a)), l + Math.round(R - R * ((this.maxyorg - this.miny) / r)), D, void 0, A.get("maxSpotColor")).append())) } } }, bar: { type: "bar", init: function (e, t) { var a = this.options, r = e.mergedOptions.height; e.mergedOptions.width; this.canvasWidth = e.mergedOptions.height, this.canvasHeight = e.mergedOptions.width; parseInt(a.get("barWidth"), 10); var n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b, k, x, w, _, C, T = parseInt(a.get("barSpacing"), 10), A = a.get("chartRangeMin"), S = a.get("chartRangeMax"), I = a.get("chartRangeClip"), R = 1 / 0, q = -1 / 0; for (this.values = t, c = 0, u = t.length; c < u; c++)((n = "string" == typeof (_ = t[c]) && _.indexOf(":") > -1) || $.isArray(_)) && (y = !0, n && (_ = t[c] = Mu(_.split(":"))), _ = Pu(_, null), (l = Math.min.apply(Math, _)) < R && (R = l), (i = Math.max.apply(Math, _)) > q && (q = i)); this.stacked = y, this.regionShapes = {}, this.barWidth = Math.floor(r / t.length) - T, this.barSpacing = T, this.totalBarWidth = this.barWidth + T, this.width = r, I && (g = void 0 === A ? -1 / 0 : A, v = void 0 === S ? 1 / 0 : S), s = [], o = y ? [] : s; var D = [], F = []; for (c = 0, u = t.length; c < u; c++)if (y) for (b = t[c], t[c] = w = [], D[c] = 0, o[c] = F[c] = 0, k = 0, x = b.length; k < x; k++)null !== (_ = w[k] = I ? Du(b[k], g, v) : b[k]) && (_ > 0 && (D[c] += _), R < 0 && q > 0 ? _ < 0 ? F[c] += Math.abs(_) : o[c] += _ : o[c] += Math.abs(_), s.push(_)); else _ = I ? Du(t[c], g, v) : t[c], null !== (_ = t[c] = Eu(_)) && s.push(_); this.max = f = Math.max.apply(Math, s), this.min = p = Math.min.apply(Math, s), this.stackMax = q = y ? Math.max.apply(Math, D) : f, this.stackMin = R = y ? Math.min.apply(Math, s) : p, void 0 !== a.get("chartRangeMin") && (a.get("chartRangeClip") || a.get("chartRangeMin") < p) && (p = a.get("chartRangeMin")), void 0 !== a.get("chartRangeMax") && (a.get("chartRangeClip") || a.get("chartRangeMax") > f) && (f = a.get("chartRangeMax")), this.zeroAxis = h = a.get("zeroAxis", !0), m = p <= 0 && f >= 0 && h ? 0 : 0 == h ? p : p > 0 ? 0 : f, this.xaxisOffset = m, d = y ? Math.max.apply(Math, o) + Math.max.apply(Math, F) : f - m, this.canvasHeightEf = h && p < 0 ? this.canvasHeight - 2 : this.canvasHeight - 1, this.isNeg = !1, p < m ? (C = Math.floor(this.canvasHeight / 2), this.isNeg = !0, C !== Math.ceil(C) && (this.canvasHeightEf -= 2, C = Math.ceil(C))) : C = 0, this.yoffset = C, $.isArray(a.get("colorMap")) ? (this.colorMapByIndex = a.get("colorMap"), this.colorMapByValue = null) : (this.colorMapByIndex = null, this.colorMapByValue = a.get("colorMap"), this.colorMapByValue && void 0 === this.colorMapByValue.get && (this.colorMapByValue = new Ou(this.colorMapByValue))), this.range = d }, getRegion: function (e, t, a) { var r = Math.floor(t / this.totalBarWidth); return r < 0 || r >= this.values.length ? void 0 : r }, getCurrentRegionFields: function () { var e, t, a = this.currentRegion, r = ensureArray(this.values[a]), n = []; for (t = r.length; t--;)e = r[t], n.push({ isNull: null === e, value: e, color: this.calcColor(t, e, a), offset: a }); return n }, calcColor: function (e, t, a) { var r, n, l = this.colorMapByIndex, i = this.colorMapByValue, o = this.options; return r = this.stacked ? o.get("stackedBarColor") : t < 0 ? o.get("negBarColor") : o.get("barColor"), 0 === t && void 0 !== o.get("zeroColor") && (r = o.get("zeroColor")), i && (n = i.get(t)) ? r = n : l && l.length > a && (r = l[a]), $.isArray(r) ? r[e % r.length] : r }, renderRegion: function (e, t) { var a, r, n, l, i, o, s, c, u, d, h = this.values[e], m = this.options, p = this.xaxisOffset, f = [], g = this.range, v = this.stacked, y = this.target, b = e * this.totalBarWidth, k = this.canvasHeightEf, x = this.yoffset; if (s = (h = $.isArray(h) ? h : [h]).length, c = h[0], l = Nu(null, h), d = Nu(p, h, !0), l) return m.get("nullColor") ? (n = t ? m.get("nullColor") : this.calcHighlightColor(m.get("nullColor"), m), a = x > 0 ? x - 1 : x, y.drawRect(a, b, 0, this.barWidth - 1, n, n)) : void 0; for (i = x, this.isNeg && (k = Math.floor(k / 2)), o = 0; o < s; o++) { if (c = h[o], v && c === p) { if (!d || u) continue; u = !0 } r = g > 0 ? Math.floor(k * (Math.abs(c - p) / g)) : k, c < p || c === p && 0 === x ? (a = i - r, i += r) : v ? (a = x, x += r) : (a = x, x -= r), n = this.calcColor(o, c, e), t && (n = this.calcHighlightColor(n, m)), f.push(y.drawRect(a, b, r - 1, this.barWidth - 1, n, n)) } return 1 === f.length ? f[0] : f } }, column: { type: "column", init: function (e, t) { var a = this.options, r = e.mergedOptions.width; e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height; parseInt(a.get("barWidth"), 10); var n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b, k, x, w, _, C, T = parseInt(a.get("barSpacing"), 10), A = a.get("chartRangeMin"), S = a.get("chartRangeMax"), I = a.get("chartRangeClip"), R = 1 / 0, q = -1 / 0; for (this.values = t, c = 0, u = t.length; c < u; c++)((n = "string" == typeof (_ = t[c]) && _.indexOf(":") > -1) || $.isArray(_)) && (y = !0, n && (_ = t[c] = Mu(_.split(":"))), _ = Pu(_, null), (l = Math.min.apply(Math, _)) < R && (R = l), (i = Math.max.apply(Math, _)) > q && (q = i)); this.stacked = y, this.regionShapes = {}, this.barWidth = Math.floor(r / t.length) - T, this.barSpacing = T, this.totalBarWidth = this.barWidth + T, this.width = r, I && (g = void 0 === A ? -1 / 0 : A, v = void 0 === S ? 1 / 0 : S), s = [], o = y ? [] : s; var D = [], F = []; for (c = 0, u = t.length; c < u; c++)if (y) for (b = t[c], t[c] = w = [], D[c] = 0, o[c] = F[c] = 0, k = 0, x = b.length; k < x; k++)null !== (_ = w[k] = I ? Du(b[k], g, v) : b[k]) && (_ > 0 && (D[c] += _), R < 0 && q > 0 ? _ < 0 ? F[c] += Math.abs(_) : o[c] += _ : o[c] += Math.abs(_), s.push(_)); else _ = I ? Du(t[c], g, v) : t[c], null !== (_ = t[c] = Eu(_)) && s.push(_); this.max = f = Math.max.apply(Math, s), this.min = p = Math.min.apply(Math, s), this.stackMax = q = y ? Math.max.apply(Math, D) : f, this.stackMin = R = y ? Math.min.apply(Math, s) : p, void 0 !== a.get("chartRangeMin") && (a.get("chartRangeClip") || a.get("chartRangeMin") < p) && (p = a.get("chartRangeMin")), void 0 !== a.get("chartRangeMax") && (a.get("chartRangeClip") || a.get("chartRangeMax") > f) && (f = a.get("chartRangeMax")), this.zeroAxis = h = a.get("zeroAxis", !0), m = p <= 0 && f >= 0 && h ? 0 : 0 == h ? p : p > 0 ? 0 : f, this.xaxisOffset = m, d = y ? Math.max.apply(Math, o) + Math.max.apply(Math, F) : f - m, this.canvasHeightEf = h && p < 0 ? this.canvasHeight - 2 : this.canvasHeight - 1, this.isNeg = !1, p < m ? (C = Math.floor(this.canvasHeight / 2), this.isNeg = !0, C !== Math.ceil(C) && (this.canvasHeightEf -= 2, C = Math.ceil(C))) : C = this.canvasHeight, this.yoffset = C, $.isArray(a.get("colorMap")) ? (this.colorMapByIndex = a.get("colorMap"), this.colorMapByValue = null) : (this.colorMapByIndex = null, this.colorMapByValue = a.get("colorMap"), this.colorMapByValue && void 0 === this.colorMapByValue.get && (this.colorMapByValue = new Ou(this.colorMapByValue))), this.range = d }, getRegion: function (e, t, a) { var r = Math.floor(t / this.totalBarWidth); return r < 0 || r >= this.values.length ? void 0 : r }, getCurrentRegionFields: function () { var e, t, a = this.currentRegion, r = ensureArray(this.values[a]), n = []; for (t = r.length; t--;)e = r[t], n.push({ isNull: null === e, value: e, color: this.calcColor(t, e, a), offset: a }); return n }, calcColor: function (e, t, a) { var r, n, l = this.colorMapByIndex, i = this.colorMapByValue, o = this.options; return r = this.stacked ? o.get("stackedBarColor") : t < 0 ? o.get("negBarColor") : o.get("barColor"), 0 === t && void 0 !== o.get("zeroColor") && (r = o.get("zeroColor")), i && (n = i.get(t)) ? r = n : l && l.length > a && (r = l[a]), $.isArray(r) ? r[e % r.length] : r }, renderRegion: function (e, t) { var a, r, n, l, i, o, s, c, u, d, h = this.values[e], m = this.options, p = this.xaxisOffset, f = [], g = this.range, v = this.stacked, y = this.target, b = e * this.totalBarWidth, k = this.canvasHeightEf, x = this.yoffset; if (s = (h = $.isArray(h) ? h : [h]).length, c = h[0], l = Nu(null, h), d = Nu(p, h, !0), l) return m.get("nullColor") ? (n = t ? m.get("nullColor") : this.calcHighlightColor(m.get("nullColor"), m), a = x > 0 ? x - 1 : x, y.drawRect(b, a, this.barWidth - 1, 0, n, n)) : void 0; for (i = x, this.isNeg && (k = Math.floor(k / 2)), o = 0; o < s; o++) { if (c = h[o], v && c === p) { if (!d || u) continue; u = !0 } r = g > 0 ? Math.floor(k * (Math.abs(c - p) / g)) : k, c < p || c === p && 0 === x ? (a = i, i += r) : (a = x - r, x -= r), n = this.calcColor(o, c, e), t && (n = this.calcHighlightColor(n, m)), f.push(y.drawRect(b, a, this.barWidth - 1, r - 1, n, n)) } return 1 === f.length ? f[0] : f } }, tristate: { type: "tristate", init: function (e, t) { var a = this.options; e.mergedOptions.width, e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height; var r = parseInt(a.get("barWidth"), 10), n = parseInt(a.get("barSpacing"), 10); this.regionShapes = {}, this.barWidth = r, this.barSpacing = n, this.totalBarWidth = r + n, this.values = $.map(t, Number), this.width = t.length * r + (t.length - 1) * n, $.isArray(a.get("colorMap")) ? (this.colorMapByIndex = a.get("colorMap"), this.colorMapByValue = null) : (this.colorMapByIndex = null, this.colorMapByValue = a.get("colorMap"), this.colorMapByValue && void 0 === this.colorMapByValue.get && (this.colorMapByValue = new Ou(this.colorMapByValue))) }, getRegion: function (e, t, a) { return Math.floor(t / this.totalBarWidth) }, getCurrentRegionFields: function () { var e = this.currentRegion; return { isNull: void 0 === this.values[e], value: this.values[e], color: this.calcColor(this.values[e], e), offset: e } }, calcColor: function (e, t) { var a, r = this.values, n = this.options, l = this.colorMapByIndex, i = this.colorMapByValue; return i && (a = i.get(e)) ? a : l && l.length > t ? l[t] : r[t] < 0 ? n.get("negBarColor") : r[t] > 0 ? n.get("posBarColor") : n.get("zeroBarColor") }, renderRegion: function (e, t) { var a, r, n, l, i, o, s = this.values, c = this.options, u = this.target; if (a = this.canvasHeight, n = Math.round(a / 2), l = e * this.totalBarWidth, s[e] < 0 ? (i = n, r = n - 1) : s[e] > 0 ? (i = 0, r = n - 1) : (i = n - 1, r = 2), null !== (o = this.calcColor(s[e], e))) return t && (o = this.calcHighlightColor(o, c)), u.drawRect(l, i, this.barWidth - 1, r - 1, o, o) } }, discrete: { type: "discrete", init: function (e, t) { var a = this.options, r = e.mergedOptions.width; e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height, this.regionShapes = {}, this.values = t = $.map(t, Number), this.min = Math.min.apply(Math, t), this.max = Math.max.apply(Math, t), this.range = this.max - this.min, this.width = r, this.interval = Math.floor(r / t.length), this.itemWidth = r / t.length, void 0 !== a.get("chartRangeMin") && (a.get("chartRangeClip") || a.get("chartRangeMin") < this.min) && (this.min = a.get("chartRangeMin")), void 0 !== a.get("chartRangeMax") && (a.get("chartRangeClip") || a.get("chartRangeMax") > this.max) && (this.max = a.get("chartRangeMax")), this.target && (this.lineHeight = "auto" === a.get("lineHeight") ? Math.round(.3 * this.canvasHeight) : a.get("lineHeight")) }, getRegion: function (e, t, a) { return Math.floor(t / this.itemWidth) }, getCurrentRegionFields: function () { var e = this.currentRegion; return { isNull: void 0 === this.values[e], value: this.values[e], offset: e } }, renderRegion: function (e, t) { var a, r, n, l, i = this.values, o = this.options, s = this.min, c = this.max, u = this.range, d = this.interval, h = (this.target, this.canvasHeight), m = this.lineHeight, p = h - m; return r = Du(i[e], s, c), l = e * d, a = Math.round(p - p * ((r - s) / u)), n = o.get("thresholdColor") && r < o.get("thresholdValue") ? o.get("thresholdColor") : o.get("lineColor"), t && (n = this.calcHighlightColor(n, o)), this.target.drawRect(l, a, d <= 2 ? 1 : d - 2, m, n, n) } }, bullet: { type: "bullet", init: function (e, t) { var a, r, n, l = this.options, i = e.mergedOptions.width; e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height, this.values = t = Mu(t), (n = t.slice())[0] = null === n[0] ? n[2] : n[0], n[1] = null === t[1] ? n[2] : n[1], a = Math.min.apply(Math, t), r = Math.max.apply(Math, t), a = void 0 === l.get("base") ? a < 0 ? a : 0 : l.get("base"), this.min = a, this.max = r, this.range = r - a, this.shapes = {}, this.valueShapes = {}, this.regiondata = {}, this.width = i, t.length || (this.disabled = !0) }, getRegion: function (e, t, a) { var r = this.target.getShapeAt(e, t, a); return void 0 !== r && void 0 !== this.shapes[r] ? this.shapes[r] : void 0 }, getCurrentRegionFields: function () { var e = this.currentRegion; return { fieldkey: e.substr(0, 1), value: this.values[e.substr(1)], region: e } }, changeHighlight: function (e) { var t, a = this.currentRegion, r = this.valueShapes[a]; switch (delete this.shapes[r], a.substr(0, 1)) { case "r": t = this.renderRange(a.substr(1), e); break; case "p": t = this.renderPerformance(e); break; case "t": t = this.renderTarget(e) }this.valueShapes[a] = t.id, this.shapes[t.id] = a, this.target.replaceWithShape(r, t) }, renderRange: function (e, t) { var a = this.values[e], r = Math.round(this.canvasWidth * ((a - this.min) / this.range)), n = this.options.get("rangeColors")[e - 2]; return t && (n = this.calcHighlightColor(n, this.options)), this.target.drawRect(0, 0, r - 1, this.canvasHeight - 1, n, n) }, renderPerformance: function (e) { var t = this.values[1], a = Math.round(this.canvasWidth * ((t - this.min) / this.range)), r = this.options.get("performanceColor"); return e && (r = this.calcHighlightColor(r, this.options)), this.target.drawRect(0, Math.round(.3 * this.canvasHeight), a - 1, Math.round(.4 * this.canvasHeight) - 1, r, r) }, renderTarget: function (e) { var t = this.values[0], a = Math.round(this.canvasWidth * ((t - this.min) / this.range) - this.options.get("targetWidth") / 2), r = Math.round(.1 * this.canvasHeight), n = this.canvasHeight - 2 * r, l = this.options.get("targetColor"); return e && (l = this.calcHighlightColor(l, this.options)), this.target.drawRect(a, r, this.options.get("targetWidth") - 1, n - 1, l, l) }, render: function (e, t) { this.init(e, t); var a, r, n = this.values.length; this.target; for (a = 2; a < n; a++)r = this.renderRange(a).append(), this.shapes[r.id] = "r" + a, this.valueShapes["r" + a] = r.id; null !== this.values[1] && (r = this.renderPerformance().append(), this.shapes[r.id] = "p1", this.valueShapes.p1 = r.id), null !== this.values[0] && (r = this.renderTarget().append(), this.shapes[r.id] = "t0", this.valueShapes.t0 = r.id) } }, pie: { type: "pie", init: function (e, t) { var a = this.options; e.mergedOptions.width, e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height; var r, n = 0; if (this.shapes = {}, this.valueShapes = {}, this.values = t = $.map(t, Number), "auto" === a.get("width") && (this.width = this.height), t.length > 0) for (r = t.length; r--;)n += t[r]; this.total = n, this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2) }, getRegion: function (e, t, a) { var r = this.target.getShapeAt(e, t, a); return void 0 !== r && void 0 !== this.shapes[r] ? this.shapes[r] : void 0 }, getCurrentRegionFields: function () { var e = this.currentRegion; return { isNull: void 0 === this.values[e], value: this.values[e], percent: this.values[e] / this.total * 100, color: this.options.get("sliceColors")[e % this.options.get("sliceColors").length], offset: e } }, changeHighlight: function (e) { var t = this.currentRegion, a = this.renderSlice(t, e), r = this.valueShapes[t]; delete this.shapes[r], this.target.replaceWithShape(r, a), this.valueShapes[t] = a.id, this.shapes[a.id] = t }, renderSlice: function (e, t) { var a, r, n, l, i, o = this.target, s = this.options, c = this.radius, u = s.get("borderWidth"), d = s.get("offset"), h = 2 * Math.PI, m = this.values, p = this.total, f = d ? 2 * Math.PI * (d / 360) : 0; for (l = m.length, n = 0; n < l; n++) { if (a = f, r = f, p > 0 && (r = f + h * (m[n] / p)), e === n) return i = s.get("sliceColors")[n % s.get("sliceColors").length], t && (i = this.calcHighlightColor(i, s)), o.drawPieSlice(c, c, c - u, a, r, void 0, i); f = r } }, render: function (e, t) { this.init(e, t); var a, r, n = this.target, l = this.values, i = this.options, o = this.radius, s = i.get("borderWidth"); for (s && n.drawCircle(o, o, Math.floor(o - s / 2), i.get("borderColor"), void 0, s).append(), r = l.length; r--;)l[r] && (a = this.renderSlice(r).append(), this.valueShapes[r] = a.id, this.shapes[a.id] = r) } }, box: { type: "box", init: function (e, t) { var a = this.options, r = e.mergedOptions.width; e.mergedOptions.height; this.canvasWidth = e.mergedOptions.width, this.canvasHeight = e.mergedOptions.height, this.values = $.map(t, Number), this.width = "auto" === a.get("width") ? "4.0em" : r, this.values.length || (this.disabled = 1) }, getRegion: function () { return 1 }, getCurrentRegionFields: function () { var e = [{ field: "lq", value: this.quartiles[0] }, { field: "med", value: this.quartiles[1] }, { field: "uq", value: this.quartiles[2] }]; return void 0 !== this.loutlier && e.push({ field: "lo", value: this.loutlier }), void 0 !== this.routlier && e.push({ field: "ro", value: this.routlier }), void 0 !== this.lwhisker && e.push({ field: "lw", value: this.lwhisker }), void 0 !== this.rwhisker && e.push({ field: "rw", value: this.rwhisker }), e }, render: function (e, t) { this.init(e, t); var a, r, n, l, i, o, s, c, u, d, h, m = this.target, p = this.values, f = p.length, g = this.options, v = this.canvasWidth, y = this.canvasHeight, b = void 0 === g.get("chartRangeMin") ? Math.min.apply(Math, p) : g.get("chartRangeMin"), k = void 0 === g.get("chartRangeMax") ? Math.max.apply(Math, p) : g.get("chartRangeMax"), x = 0; if (g.get("raw")) g.get("showOutliers") && p.length > 5 ? (r = p[0], a = p[1], l = p[2], i = p[3], o = p[4], s = p[5], c = p[6]) : (a = p[0], l = p[1], i = p[2], o = p[3], s = p[4]); else if (p.sort((function (e, t) { return e - t })), l = Fu(p, 1), i = Fu(p, 2), n = (o = Fu(p, 3)) - l, g.get("showOutliers")) { for (a = s = void 0, u = 0; u < f; u++)void 0 === a && p[u] > l - n * g.get("outlierIQR") && (a = p[u]), p[u] < o + n * g.get("outlierIQR") && (s = p[u]); r = p[0], c = p[f - 1] } else a = p[0], s = p[f - 1]; this.quartiles = [l, i, o], this.lwhisker = a, this.rwhisker = s, this.loutlier = r, this.routlier = c, h = v / (k - b + 1), g.get("showOutliers") && (x = Math.ceil(g.get("spotRadius")), h = (v -= 2 * Math.ceil(g.get("spotRadius"))) / (k - b + 1), r < a && m.drawCircle((r - b) * h + x, y / 2, g.get("spotRadius"), g.get("outlierLineColor"), g.get("outlierFillColor")).append(), c > s && m.drawCircle((c - b) * h + x, y / 2, g.get("spotRadius"), g.get("outlierLineColor"), g.get("outlierFillColor")).append()), m.drawRect(Math.round((l - b) * h + x), Math.round(.1 * y), Math.round((o - l) * h), Math.round(.8 * y), g.get("boxLineColor"), g.get("boxFillColor")).append(), m.drawLine(Math.round((a - b) * h + x), Math.round(y / 2), Math.round((l - b) * h + x), Math.round(y / 2), g.get("lineColor")).append(), m.drawLine(Math.round((a - b) * h + x), Math.round(y / 4), Math.round((a - b) * h + x), Math.round(y - y / 4), g.get("whiskerColor")).append(), m.drawLine(Math.round((s - b) * h + x), Math.round(y / 2), Math.round((o - b) * h + x), Math.round(y / 2), g.get("lineColor")).append(), m.drawLine(Math.round((s - b) * h + x), Math.round(y / 4), Math.round((s - b) * h + x), Math.round(y - y / 4), g.get("whiskerColor")).append(), m.drawLine(Math.round((i - b) * h + x), Math.round(.1 * y), Math.round((i - b) * h + x), Math.round(.9 * y), g.get("medianColor")).append(), g.get("target") && (d = Math.ceil(g.get("spotRadius")), m.drawLine(Math.round((g.get("target") - b) * h + x), Math.round(y / 2 - d), Math.round((g.get("target") - b) * h + x), Math.round(y / 2 + d), g.get("targetColor")).append(), m.drawLine(Math.round((g.get("target") - b) * h + x - d), Math.round(y / 2), Math.round((g.get("target") - b) * h + x + d), Math.round(y / 2), g.get("targetColor")).append()) } }, shapeCount: 0, shapes: {}, shapeseq: [], lastShapeId: null, mergedOptions: null, init: function (e, t) { var a, r, n; t = t || {}; return n = (r = this.defaultOption).common, a = r[t.type || n.type], this.shapeCount = 0, this.shapes = {}, this.shapeseq = [], this.lastShapeId = null, this.mergedOptions = $.extend({}, n, a, t), this.mergedOptions.width = this.mergedOptions.width, this.mergedOptions.height = this.mergedOptions.height, this[this.mergedOptions.type].render(this, e), { shapes: this.shapes, shapeseq: this.shapeseq, offsetX: this.mergedOptions.offsetX, offsetY: this.mergedOptions.offsetY, pixelWidth: this.mergedOptions.width, pixelHeight: this.mergedOptions.height } }, _getContext: function (e, t, a) { var r; return r = null != this.ctx ? this.ctx : $("#" + this._canvasID).get(0).getContext("2d"), void 0 !== e && (r.strokeStyle = e), r.lineWidth = void 0 === a ? 1 : a, void 0 !== t && (r.fillStyle = t), r }, reset: function () { this._getContext().clearRect(0, 0, this.pixelWidth, this.pixelHeight), this.shapes = {}, this.shapeseq = [], this.currentTargetShapeId = void 0 }, _drawShape: function (e, t, a, r, n) { var l, i, o = this._getContext(a, r, n); for (o.beginPath(), o.moveTo(t[0][0] + .5 + this.offsetX, t[0][1] + .5 + this.offsetY), l = 1, i = t.length; l < i; l++)o.lineTo(t[l][0] + .5 + this.offsetX, t[l][1] + .5 + this.offsetY); void 0 !== a && o.stroke(), void 0 !== r && o.fill(), void 0 !== this.targetX && void 0 !== this.targetY && o.isPointInPath(this.targetX + this.offsetX, this.targetY + this.offsetY) && (this.currentTargetShapeId = e) }, _drawCircle: function (e, t, a, r, n, l, i) { var o = this._getContext(n, l, i); o.beginPath(), t += this.offsetX, a += this.offsetY, o.arc(t, a, r, 0, 2 * Math.PI, !1), void 0 !== this.targetX && void 0 !== this.targetY && o.isPointInPath(this.targetX + this.offsetX, this.targetY + this.offsetY) && (this.currentTargetShapeId = e), void 0 !== n && o.stroke(), void 0 !== l && o.fill() }, _drawPieSlice: function (e, t, a, r, n, l, i, o) { var s = this._getContext(i, o); t += this.offsetX, a += this.offsetY, s.beginPath(), s.moveTo(t, a), s.arc(t, a, r, n, l, !1), s.lineTo(t, a), s.closePath(), void 0 !== i && s.stroke(), o && s.fill(), void 0 !== this.targetX && void 0 !== this.targetY && s.isPointInPath(this.targetX + this.offsetX, this.targetY + this.offsetY) && (this.currentTargetShapeId = e) }, _drawRect: function (e, t, a, r, n, l, i) { return this._drawShape(e, [[t, a], [t + r, a], [t + r, a + n], [t, a + n], [t, a]], l, i) }, appendShape: function (e) { return this.shapes[e.id] = e, this.shapeseq.push(e.id), this.lastShapeId = e.id, e.id }, replaceWithShape: function (e, t) { var a, r = this.shapeseq; for (this.shapes[t.id] = t, a = r.length; a--;)r[a] == e && (r[a] = t.id); delete this.shapes[e] }, replaceWithShapes: function (e, t) { var a, r, n, l = this.shapeseq, i = {}; for (r = e.length; r--;)i[e[r]] = !0; for (r = l.length; r--;)i[a = l[r]] && (l.splice(r, 1), delete this.shapes[a], n = r); for (r = t.length; r--;)l.splice(n, 0, t[r].id), this.shapes[t[r].id] = t[r] }, insertAfterShape: function (e, t) { var a, r = this.shapeseq; for (a = r.length; a--;)if (r[a] === e) return r.splice(a + 1, 0, t.id), void (this.shapes[t.id] = t) }, removeShapeId: function (e) { var t, a = this.shapeseq; for (t = a.length; t--;)if (a[t] === e) { a.splice(t, 1); break } delete this.shapes[e] }, getShapeAt: function (e, t, a) { return this.targetX = t, this.targetY = a, this.render(), this.currentTargetShapeId }, _canvasID: "luckysheetTableContent", render: function (e, t, a, r, n, l, i, o) { null == i && (i = "luckysheetTableContent"), this._canvasID = i, null != o && (this.ctx = o); var s, c, u = e.length; this._getContext(); for (this.offsetX = a, this.offsetY = r, this.pixelWidth = n, this.pixelHeight = l, c = 0; c < u; c++)this["_draw" + (s = t[e[c]]).type].apply(this, s.args) }, drawLine: function (e, t, a, r, n, l) { return this.drawShape([[e, t], [a, r]], n, l) }, drawShape: function (e, t, a, r) { return this._genShape("Shape", [e, t, a, r]) }, drawCircle: function (e, t, a, r, n, l) { return this._genShape("Circle", [e, t, a, r, n, l]) }, drawPieSlice: function (e, t, a, r, n, l, i) { return this._genShape("PieSlice", [e, t, a, r, n, l, i]) }, drawRect: function (e, t, a, r, n, l) { return this._genShape("Rect", [e, t, a, r, n, l]) }, _genShape: function (e, t) { var a = this.shapeCount++; t.unshift(a); var r = { id: a, type: e, args: t }; return this.shapes[a] = r, this.shapeseq.push(a), this.lastShapeId = a, { append: function () { return r }, get: function () { return a } } } }, Vu = function (e) { var t, a = this.currentRegion, r = this.target, n = this.regionShapes[a]; n && (t = this.renderRegion(a, e), $.isArray(t) || $.isArray(n) ? (r.replaceWithShapes(n, t), this.regionShapes[a] = $.map(t, (function (e) { return e.id }))) : (r.replaceWithShape(n, t), this.regionShapes[a] = t.id)) }, Hu = function (e, t) { this.init(e, t); var a, r, n, l, i = this.values, o = (this.target, this.regionShapes); for (n = i.length; n--;)if (a = this.renderRegion(n)) if ($.isArray(a)) { for (r = [], l = a.length; l--;)a[l].append(), r.push(a[l].id); o[n] = r } else a.append(), o[n] = a.id; else o[n] = null }, Uu = { get: function (e) { return Bu.mergedOptions[e] } }, ju = { drawLine: function (e, t, a, r, n, l) { return Bu.drawLine(e, t, a, r, n, l) }, drawShape: function (e, t, a, r) { return Bu.drawShape(e, t, a, r) }, drawCircle: function (e, t, a, r, n, l) { return Bu.drawCircle(e, t, a, r, n, l) }, drawPieSlice: function (e, t, a, r, n, l, i) { return Bu.drawPieSlice(e, t, a, r, n, l, i) }, drawRect: function (e, t, a, r, n, l) { return Bu.drawRect(e, t, a, r, n, l) } }; for (var Gu in Bu) Gu in { line: null, bar: null, column: null, tristate: null, discrete: null, bullet: null, pie: null, box: null } && (Bu[Gu].options = Uu, Bu[Gu].target = ju), Gu in { bar: null, column: null, tristate: null, discrete: null } && (Bu[Gu].changeHighlight = Vu, Bu[Gu].render = Hu); function Wu(e, t, a) { null == e && (e = $("#luckysheet-cell-main").scrollTop()), null == t && (t = ga.luckysheetTableContentHW[1]), null == a && (a = ga.columnHeaderHeight); var r, n, l, i, o = $("#luckysheetTableContent").get(0).getContext("2d"); o.save(), o.scale(ga.devicePixelRatio, ga.devicePixelRatio), o.clearRect(0, a, ga.rowHeaderWidth - 1, t), o.font = Hn(), o.textBaseline = Bn, o.fillStyle = On, -1 == (r = Ts(ga.visibledatarow, e)) && (r = 0), -1 == (n = Ts(ga.visibledatarow, e + t)) && (n = ga.visibledatarow.length - 1), o.save(), o.beginPath(), o.rect(0, a - 1, ga.rowHeaderWidth - 1, t - 2), o.clip(); for (var s, c = r; c <= n; c++) { i = 0 == c ? -e - 1 : ga.visibledatarow[c - 1] - e - 1, l = ga.visibledatarow[c] - e; var u = r == c ? -2 : 0, d = n == c ? -2 : 0; if (Nc.createHookFunction("rowTitleCellRenderBefore", c + 1, { r: c, top: i + a + u, width: ga.rowHeaderWidth - 1, height: l - i + 1 + d - u }, o)) { if (null != ga.config.rowhidden && null != ga.config.rowhidden[c]); else { o.fillStyle = "#ffffff", o.fillRect(0, i + a + u, ga.rowHeaderWidth - 1, l - i + 1 + d - u), o.fillStyle = "#000000", o.save(), o.scale(ga.zoomRatio, ga.zoomRatio); var h = Fs(c + 1, o), m = (ga.rowHeaderWidth - h.width) / 2, p = i + (l - i) / 2 + a; o.fillText(c + 1, m / ga.zoomRatio, p / ga.zoomRatio), o.restore() } o.beginPath(), o.moveTo(ga.rowHeaderWidth - 2 + .5, i + a - 2), o.lineTo(ga.rowHeaderWidth - 2 + .5, l + a - 2), o.lineWidth = 1, o.strokeStyle = Vn, o.stroke(), o.closePath(), null != ga.config.rowhidden && null == ga.config.rowhidden[c] && null != ga.config.rowhidden[c + 1] ? (o.beginPath(), o.moveTo(-1, l + a - 4 + .5), o.lineTo(ga.rowHeaderWidth - 1, l + a - 4 + .5), o.closePath(), o.stroke()) : null != ga.config.rowhidden && null != ga.config.rowhidden[c] || (o.beginPath(), o.moveTo(-1, l + a - 2 + .5), o.lineTo(ga.rowHeaderWidth - 1, l + a - 2 + .5), o.closePath(), o.stroke()), null != ga.config.rowhidden && null != ga.config.rowhidden[c - 1] && null != s && (o.beginPath(), o.moveTo(-1, s + a + .5), o.lineTo(ga.rowHeaderWidth - 1, s + a + .5), o.closePath(), o.stroke()), s = l, Nc.createHookFunction("rowTitleCellRenderAfter", c + 1, { r: c, top: i + a + u, width: ga.rowHeaderWidth - 1, height: l - i + 1 + d - u }, o) } } o.restore(), o.restore() } function Yu(e, t, a) { null == e && (e = $("#luckysheet-cell-main").scrollLeft()), null == t && (t = ga.luckysheetTableContentHW[0]), null == a && (a = ga.rowHeaderWidth); var r, n, l, i, o = $("#luckysheetTableContent").get(0).getContext("2d"); o.save(), o.scale(ga.devicePixelRatio, ga.devicePixelRatio), o.clearRect(a, 0, t, ga.columnHeaderHeight - 1), o.font = Hn(), o.textBaseline = Bn, o.fillStyle = On, -1 == (r = Ts(ga.visibledatacolumn, e)) && (r = 0), -1 == (n = Ts(ga.visibledatacolumn, e + t)) && (n = ga.visibledatacolumn.length - 1), o.save(), o.beginPath(), o.rect(a - 1, 0, t, ga.columnHeaderHeight - 1), o.clip(); for (var s, c = r; c <= n; c++) { i = 0 == c ? -e : ga.visibledatacolumn[c - 1] - e, l = ga.visibledatacolumn[c] - e; var u = Im(c); if (Nc.createHookFunction("columnTitleCellRenderBefore", u, { c: c, left: i + a - 1, width: l - i, height: ga.columnHeaderHeight - 1 }, o)) { if (null != ga.config.colhidden && null != ga.config.colhidden[c]); else { o.fillStyle = "#ffffff", o.fillRect(i + a - 1, 0, l - i, ga.columnHeaderHeight - 1), o.fillStyle = "#000000", o.save(), o.scale(ga.zoomRatio, ga.zoomRatio); var d = Fs(u, o), h = Math.round(i + (l - i) / 2 + a - d.width / 2), m = Math.round(ga.columnHeaderHeight / 2); o.fillText(u, h / ga.zoomRatio, m / ga.zoomRatio), o.restore() } null != ga.config.colhidden && null == ga.config.colhidden[c] && null != ga.config.colhidden[c + 1] ? (o.beginPath(), o.moveTo(l + a - 4 + .5, 0), o.lineTo(l + a - 4 + .5, ga.columnHeaderHeight - 2), o.lineWidth = 1, o.strokeStyle = Vn, o.closePath(), o.stroke()) : null != ga.config.colhidden && null != ga.config.colhidden[c] || (o.beginPath(), o.moveTo(l + a - 2 + .5, 0), o.lineTo(l + a - 2 + .5, ga.columnHeaderHeight - 2), o.lineWidth = 1, o.strokeStyle = Vn, o.closePath(), o.stroke()), null != ga.config.colhidden && null != ga.config.colhidden[c - 1] && null != s && (o.beginPath(), o.moveTo(s + a + .5, 0), o.lineTo(s + a + .5, ga.columnHeaderHeight - 2), o.closePath(), o.stroke()), o.beginPath(), o.moveTo(i + a - 1, ga.columnHeaderHeight - 2 + .5), o.lineTo(l + a - 1, ga.columnHeaderHeight - 2 + .5), o.stroke(), o.closePath(), s = l, Nc.createHookFunction("columnTitleCellRenderAfter", u, { c: c, left: i + a - 1, width: l - i, height: ga.columnHeaderHeight - 1 }, o) } } o.restore(), o.restore() } function Xu(e, t, a, r, n, l, i, o, s) { if (null != ga.flowdata) { var c = Sh.getSheetByIndex(); clearTimeout(ga.measureTextCacheTimeOut), null == e && (e = $("#luckysheet-cell-main").scrollLeft()), null == t && (t = $("#luckysheet-cell-main").scrollTop()), null == a && (a = ga.luckysheetTableContentHW[0]), null == r && (r = ga.luckysheetTableContentHW[1]), null == n && (n = ga.rowHeaderWidth), null == l && (l = ga.columnHeaderHeight), null == i && (i = 0), null == o && (o = 0); var u, d, h, m, p, f, g = null; if (null == s) g = $("#luckysheetTableContent").get(0).getContext("2d"); else if ("object" == Cm(s)) try { g = s.get(0).getContext("2d") } catch (e) { g = s } else g = $("#" + s).get(0).getContext("2d"); g.save(), g.scale(ga.devicePixelRatio, ga.devicePixelRatio), g.clearRect(0, 0, ga.luckysheetTableContentHW[0], ga.luckysheetTableContentHW[1]), -1 == (u = Ts(ga.visibledatarow, t)) && (u = 0), u += o, -1 == (d = Ts(ga.visibledatarow, t + r)) && (d = ga.visibledatarow.length - 1), (d += o) >= ga.visibledatarow.length && (d = ga.visibledatarow.length - 1), -1 == (h = Ts(ga.visibledatacolumn, e)) && (h = 0), h += i, -1 == (m = Ts(ga.visibledatacolumn, e + a)) && (m = ga.visibledatacolumn.length - 1), (m += i) >= ga.visibledatacolumn.length && (m = ga.visibledatacolumn.length - 1), 0 == u ? 0 : ga.visibledatarow[u - 1], p = ga.visibledatarow[d], 0 == h ? 0 : ga.visibledatacolumn[h - 1], f = ga.visibledatacolumn[m], g.fillStyle = "#ffffff", g.fillRect(n - 1, l - 1, f - e, p - t), g.font = Hn(), g.fillStyle = On; var v = [], y = {}, b = {}; Nc.createHookFunction("cellAllRenderBefore", ga.flowdata, c, g); for (var k = u; k <= d; k++) { var x = void 0; x = 0 == k ? -t - 1 : ga.visibledatarow[k - 1] - t - 1; var w = ga.visibledatarow[k] - t; if (null == ga.config.rowhidden || null == ga.config.rowhidden[k]) for (var _ = h; _ <= m; _++) { var C = void 0; C = 0 == _ ? -e : ga.visibledatacolumn[_ - 1] - e; var T = ga.visibledatacolumn[_] - e; if (null == ga.config.colhidden || null == ga.config.colhidden[_]) { var A = ga.defaultcollen; if (null != ga.config.columnlen && null != ga.config.columnlen[_] && (A = ga.config.columnlen[_]), null != ga.flowdata[k] && null != ga.flowdata[k][_]) { var S = ga.flowdata[k][_]; if ("object" == Cm(S) && "mc" in S) { if (b[k + "_" + _] = { start_r: x, start_c: C, end_r: w, end_c: T }, !("rs" in S.mc)) { var I = "r" + S.mc.r + "c" + S.mc.c, R = v[y[I]]; null == R ? (y[I] = v.length, v.push({ r: k, c: _, start_c: C, start_r: x, end_r: w, end_c: T, firstcolumnlen: A })) : (R.c == _ && (R.end_r += w - x - 1), R.r == k && (R.end_c += T - C, R.firstcolumnlen += A)); continue } y["r" + k + "c" + _] = v.length } } v.push({ r: k, c: _, start_r: x, start_c: C, end_r: w, end_c: T, firstcolumnlen: A }), b[k + "_" + _] = { start_r: x, start_c: C, end_r: w, end_c: T } } } } for (var q = Io(ga.luckysheetfile[_l(ga.currentSheetIndex)].dynamicArray), D = wc.getComputeMap(), F = gd.getComputeMap(), E = function (e, t, a, r, n) { for (var l = {}, i = ga.flowdata, o = r; o <= n; o++)if (null != i[o]) if (null == ga.cellOverflowMapCache[o]) { for (var s = !1, c = 0; c < i[o].length; c++) { var u = i[o][c]; if ((null == ga.config.colhidden || null == ga.config.colhidden[c]) && (null != u && (!ya(u.v) || No(u)) && null == u.mc && "1" == u.tb)) { var d = xm.checkstatus(i, o, c, "ht"), h = Es(u, e, { r: o, c: c }), m = 0; null != h && (m = h.textWidthAll); var p = c - 1 < 0 ? 0 : ga.visibledatacolumn[c - 1], f = ga.visibledatacolumn[c], g = void 0, v = void 0; if (f - p < m) { if ("0" == d) { var y = ed(o, c, c - 1, "forward", d, m), b = ed(o, c, c + 1, "backward", d, m); g = y.success ? y.c : y.c + 1, v = b.success ? b.c : b.c - 1 } else if ("1" == d) { var k = ed(o, c, c + 1, "backward", d, m); g = c, v = k.success ? k.c : k.c - 1 } else if ("2" == d) { var x = ed(o, c, c - 1, "forward", d, m); v = c, g = x.success ? x.c : x.c + 1 } } else g = c, v = c; if ((g <= a || v >= t) && g < v) { var w = { r: o, stc: g, edc: v }; null == l[o] && (l[o] = {}), l[o][c] = w, s = !0 } } } s && (ga.cellOverflowMapCache[o] = l[o]) } else l[o] = ga.cellOverflowMapCache[o]; return l }(g, h, m, u, d), M = [], N = 0; N < v.length; N++) { var P = v[N], z = P.r, L = P.c, O = P.start_r, B = P.start_c, V = P.end_r, H = P.end_c; P.firstcolumnlen; if (null != ga.flowdata[z]) if (null == ga.flowdata[z][L]) Zu(z, L, O, B, V, H, g, D, F, n, l, q, E, h, m, t, e, .5); else { var U = ga.flowdata[z][L], j = null; if ("object" == Sa(U) && "mc" in U ? M.push(v[N]) : j = Jo(z, L), null == j || 0 == j.toString().length) { Zu(z, L, O, B, V, H, g, D, F, n, l, q, E, h, m, t, e, .5); var G = xm.borderfix(ga.flowdata, z, L), W = [B + n + G[0], O + l + G[1], H - B - 3 + G[2], V - O - 3 - 1 + G[3]]; Ku(z, L, W[0], W[1], "luckysheetTableContent", g) } else z + "_" + L in q && (j = q[z + "_" + L].v), Qu(z, L, O, B, V, H, j, g, D, F, n, l, q, E, h, m, t, e, .5) } } for (var Y = 0; Y < M.length; Y++) { var X = M[Y], K = X.r, Z = X.c, Q = X.start_r, J = X.start_c, ee = X.end_r, te = X.end_c, ae = (X.firstcolumnlen, null), re = ga.flowdata[K][Z].mc; ae = Jo(re.r, re.c), K = re.r, Z = re.c; var ne = ga.flowdata[K][Z]; if (J = 0 == Z ? -e : ga.visibledatacolumn[Z - 1] - e, Q = 0 == K ? -t - 1 : ga.visibledatarow[K - 1] - t - 1, ee = ga.visibledatarow[K + ne.mc.rs - 1] - t, te = ga.visibledatacolumn[Z + ne.mc.cs - 1] - e, null == ae || 0 == ae.toString().length) { Zu(K, Z, Q, J, ee, te, g, D, F, n, l, q, E, h, m, t, e, .5, !0); var le = xm.borderfix(ga.flowdata, K, Z), ie = [J + n + le[0], Q + l + le[1], te - J - 3 + le[2], ee - Q - 3 - 1 + le[3]]; Ku(K, Z, ie[0], ie[1], "luckysheetTableContent", g) } else K + "_" + Z in q && (ae = q[K + "_" + Z].v), Qu(K, Z, Q, J, ee, te, ae, g, D, F, n, l, q, E, h, m, t, e, .5, !0) } for (var oe = u; oe <= d; oe++) { var se = void 0; se = 0 == oe ? -t - 1 : ga.visibledatarow[oe - 1] - t - 1; for (var ce = ga.visibledatarow[oe] - t, ue = h; ue <= m; ue++) { var de = void 0; de = 0 == ue ? -e : ga.visibledatacolumn[ue - 1] - e; var he = ga.visibledatacolumn[ue] - e; ga.luckysheetcurrentisPivotTable && Ru.drawPivotTable ? ((0 == ue || 5 == ue) && oe <= 11 && (g.beginPath(), g.moveTo(he - 2 + .5 + n, se + l), g.lineTo(he - 2 + .5 + n, ce - 2 + .5 + l), g.lineWidth = 1, g.strokeStyle = "#000000", g.closePath(), g.stroke()), (2 == oe || 11 == oe) && ue <= 5 && (g.beginPath(), g.moveTo(de - 1 + n, ce - 2 + .5 + l), g.lineTo(he - 2 + .5 + n, ce - 2 + .5 + l), g.lineWidth = 1, g.strokeStyle = "#000000", g.closePath(), g.stroke()), 6 == oe && 3 == ue && (g.save(), g.font = "bold 30px Arial", g.fillStyle = "#626675", g.textAlign = "center", g.fillText(gn().pivotTable.title, de + (he - de) / 2 + 4 + n, se + (ce - se) / 2 - 1 + l), g.restore())) : ga.luckysheetcurrentisPivotTable && ue < Ru.pivotTableBoundary[1] && oe < Ru.pivotTableBoundary[0] && (g.beginPath(), g.moveTo(he - 2 + .5 + n, se + l), g.lineTo(he - 2 + .5 + n, ce - 2 + .5 + l), g.lineWidth = 1, g.strokeStyle = "#000000", g.closePath(), g.stroke(), g.beginPath(), g.moveTo(de - 1 + n, ce - 2 + .5 + l), g.lineTo(he - 2 + n, ce - 2 + .5 + l), g.lineWidth = 1, g.strokeStyle = "#000000", g.closePath(), g.stroke()) } } if (null != ga.config.borderInfo && ga.config.borderInfo.length > 0) { var me = function (e, t, a, r, n, l, i, o, s) { var c = e, u = r - 2 + .5 + i, d = a + o - 1, h = r - 2 + .5 + i, m = n - 2 + .5 + o; s.save(), xm.setLineDash(s, c, "v", u, d, h, m), s.strokeStyle = t, s.stroke(), s.closePath(), s.restore() }, pe = function (e, t, a, r, n, l, i, o, s) { var c = e, u = l - 2 + .5 + i, d = a + o - 1, h = l - 2 + .5 + i, m = n - 2 + .5 + o; s.save(), xm.setLineDash(s, c, "v", u, d, h, m), s.strokeStyle = t, s.stroke(), s.closePath(), s.restore() }, fe = function (e, t, a, r, n, l, i, o, s) { var c = e, u = r - 2 + .5 + i, d = n - 2 + .5 + o, h = l - 2 + .5 + i, m = n - 2 + .5 + o; s.save(), xm.setLineDash(s, c, "h", u, d, h, m), s.strokeStyle = t, s.stroke(), s.closePath(), s.restore() }, ge = function (e, t, a, r, n, l, i, o, s) { var c = e, u = r - 2 + .5 + i, d = a - 1 + .5 + o, h = l - 2 + .5 + i, m = a - 1 + .5 + o; s.save(), xm.setLineDash(s, c, "h", u, d, h, m), s.strokeStyle = t, s.stroke(), s.closePath(), s.restore() }, ve = zc(u, d, h, m); for (var ye in ve) { var be = ye.substr(0, ye.indexOf("_")), ke = ye.substr(ye.indexOf("_") + 1); if (b[be + "_" + ke]) { var xe = b[be + "_" + ke].start_r, we = b[be + "_" + ke].start_c, _e = b[be + "_" + ke].end_r, Ce = b[be + "_" + ke].end_c, Te = td(E, be, ke, h, m), Ae = ve[ye].l; null == Ae || Te.colIn && Te.stc != ke || me(Ae.style, Ae.color, xe, we, _e, 0, n, l, g); var Se = ve[ye].r; null == Se || Te.colIn && !Te.colLast || pe(Se.style, Se.color, xe, 0, _e, Ce, n, l, g); var Ie = ve[ye].t; null != Ie && ge(Ie.style, Ie.color, xe, we, 0, Ce, n, l, g); var Re = ve[ye].b; null != Re && fe(Re.style, Re.color, 0, we, _e, Ce, n, l, g) } } } m == ga.visibledatacolumn.length - 1 && g.clearRect(f - e + n - 1, l - 1, ga.ch_width - ga.visibledatacolumn[m], p - t), g.restore(), ga.measureTextCacheTimeOut = setTimeout((function () { ga.measureTextCache = {}, ga.measureTextCellInfoCache = {}, ga.cellOverflowMapCache = {} }), 100) } } var Ku = function (e, t, a, r, n, l) { if (null != ga.flowdata[e] && null != ga.flowdata[e][t]) { var i = ga.flowdata[e][t].spl; if (null != i) if ("string" == typeof i && (i = new Function("return " + i)()), "object" == Cm(i)) { var o = i, s = o.offsetX, c = o.offsetY; s = null == s ? 0 : s, c = null == c ? 0 : c, Bu.render(o.shapeseq, o.shapes, a + s, r + c, o.pixelWidth, o.pixelHeight, n, l) } else if ("array" == Cm(i) && "object" == Cm(i[0])) for (var u = 0; u < i.length; u++) { var d = i[u], h = d.offsetX, m = d.offsetY; h = null == h ? 0 : h, m = null == m ? 0 : m, Bu.render(d.shapeseq, d.shapes, a + h, r + m, d.pixelWidth, d.pixelHeight, n, l) } } }, Zu = function (e, t, a, r, n, l, i, o, s, c, u, d, h, m, p, f, g, v, y) { var b = wc.checksAF(e, t, o), k = gd.checksCF(e, t, s), x = xm.borderfix(ga.flowdata, e, t), w = xm.checkstatus(ga.flowdata, e, t, "bg"); null != b && null != b[1] && (w = b[1]), null != k && null != k.cellColor && (w = k.cellColor), null != ga.flowdata[e][t] && null != ga.flowdata[e][t].tc && (w = ga.flowdata[e][t].tc), i.fillStyle = null == w ? "#FFFFFF" : w; var _ = [r + c + x[0], a + u + x[1], l - r + x[2] - (y ? 1 : 0), n - a + x[3]]; if (Nc.createHookFunction("cellRenderBefore", ga.flowdata[e][t], { r: e, c: t, start_r: _[1], start_c: _[0], end_r: _[3] + _[1], end_c: _[2] + _[0] }, Sh.getSheetByIndex(), i)) { if (i.fillRect(_[0], _[1], _[2], _[3]), e + "_" + t in d) { var C = d[e + "_" + t].v; i.fillStyle = "#000000"; var T = Hn(); i.font = T; var A = r + 4 + c, S = (Ml.luckysheetrefreshfixed(), n + u - 2); i.textBaseline = "bottom", i.fillText(null == C ? "" : C, A, S) } if (null != ga.flowdata[e][t] && null != ga.flowdata[e][t].ps) { var I = 8 * ga.zoomRatio, R = 8 * ga.zoomRatio; i.beginPath(), i.moveTo(l + c - 1 - I, a + u), i.lineTo(l + c - 1, a + u), i.lineTo(l + c - 1, a + u + R), i.fillStyle = "#FC6666", i.fill(), i.closePath() } var $ = td(h, e, t, m, p); $.colLast && Ju($.rowIndex, $.colIndex, $.stc, $.edc, i, f, g, c, u, o, s), $.colIn && !$.colLast || ga.luckysheetcurrentisPivotTable || w || !ga.showGridLines || (i.beginPath(), i.moveTo(l + c - 2 + v, a + u), i.lineTo(l + c - 2 + v, n + u), i.lineWidth = 1, i.strokeStyle = Vn, i.stroke(), i.closePath()), ga.luckysheetcurrentisPivotTable || w || !ga.showGridLines || (i.beginPath(), i.moveTo(r + c - 1, n + u - 2 + v), i.lineTo(l + c - 1, n + u - 2 + v), i.lineWidth = 1, i.strokeStyle = Vn, i.stroke(), i.closePath()), Nc.createHookFunction("cellRenderAfter", ga.flowdata[e][t], { r: e, c: t, start_r: _[1], start_c: _[0], end_r: _[3] + _[1], end_c: _[2] + _[0] }, Sh.getSheetByIndex(), i) } }, Qu = function (e, t, a, r, n, l, i, o, s, c, u, d, h, m, p, f, g, v, y, b) { var k = ga.flowdata[e][t], x = l - r - 2, w = n - a - 2, _ = xm.checkstatus(ga.flowdata, e, t, "ht"), C = xm.checkstatus(ga.flowdata, e, t, "vt"), T = wc.checksAF(e, t, s), A = gd.checksCF(e, t, c), S = xm.checkstatus(ga.flowdata, e, t, "bg"); null != T && null != T[1] && (S = T[1]), null != A && null != A.cellColor && (S = A.cellColor), o.fillStyle = null == S ? "#FFFFFF" : S; var I = xm.borderfix(ga.flowdata, e, t), R = [r + u + I[0], a + d + I[1], l - r + I[2] - (b ? 1 : 0), n - a + I[3]]; if (Nc.createHookFunction("cellRenderBefore", ga.flowdata[e][t], { r: e, c: t, start_r: R[1], start_c: R[0], end_r: R[3] + R[1], end_c: R[2] + R[0] }, Sh.getSheetByIndex(), o)) { o.fillRect(R[0], R[1], R[2], R[3]); var $ = $c.dataVerification; if (null != $ && null != $[e + "_" + t] && !$c.validateCellData(i, $[e + "_" + t])) { var q = 5 * ga.zoomRatio, D = 5 * ga.zoomRatio; o.beginPath(), o.moveTo(r + u, a + d), o.lineTo(r + u + q, a + d), o.lineTo(r + u, a + d + D), o.fillStyle = "#FC6666", o.fill(), o.closePath() } if (null != k.ps) { var F = 8 * ga.zoomRatio, E = 8 * ga.zoomRatio; o.beginPath(), o.moveTo(l + u - F, a + d), o.lineTo(l + u, a + d), o.lineTo(l + u, a + d + E), o.fillStyle = "#FC6666", o.fill(), o.closePath() } if (1 == k.qp && ba(k.v)) { var M = 6 * ga.zoomRatio, N = 6 * ga.zoomRatio; o.beginPath(), o.moveTo(r + u + M - 1, a + d), o.lineTo(r + u - 1, a + d), o.lineTo(r + u - 1, a + d + N), o.fillStyle = "#487f1e", o.fill(), o.closePath() } var P = !0, z = td(m, e, t, p, f); if ("1" == k.tb && z.colIn) z.colLast ? Ju(z.rowIndex, z.colIndex, z.stc, z.edc, o, g, v, u, d, s, c) : P = !1; else if (null != $ && null != $[e + "_" + t] && "checkbox" == $[e + "_" + t].type) { var L = r + u, O = a + d + 1; o.save(), o.beginPath(), o.rect(L, O, x, w), o.clip(), o.scale(ga.zoomRatio, ga.zoomRatio); var B = Fs(i, o), V = B.width + 14, H = B.actualBoundingBoxDescent + B.actualBoundingBoxAscent, U = L + 2; "0" == _ ? U = L + x / 2 - V / 2 : "2" == _ && (U = L + x - 2 - V); var j = w > H ? w : H, G = O + j - 2; o.textBaseline = "bottom"; var W = G - 13 * ga.zoomRatio; "0" == C ? (G = O + j / 2, o.textBaseline = "middle", W = G - 6 * ga.zoomRatio) : "1" == C && (G = O + 2, o.textBaseline = "top", W = G + 1 * ga.zoomRatio), U /= ga.zoomRatio, G /= ga.zoomRatio, W /= ga.zoomRatio, o.lineWidth = 1, o.strokeStyle = "#000", o.strokeRect(U, W, 10, 10), $[e + "_" + t].checked && (o.beginPath(), o.lineTo(U + 1, W + 6), o.lineTo(U + 4, W + 9), o.lineTo(U + 9, W + 2), o.stroke(), o.closePath()), o.fillStyle = xm.checkstatus(ga.flowdata, e, t, "fc"), o.fillText(null == i ? "" : i, U + 14, G), o.restore() } else { if (null != A && null != A.dataBar) { var Y = r + u + 2, X = a + d + 2, K = x - 4, Z = w - 4, Q = A.dataBar.valueType, J = A.dataBar.valueLen, ee = A.dataBar.format; if ("minus" == Q) { var te = A.dataBar.minusLen; if (ee.length > 1) { var ae = o.createLinearGradient(Y + K * te * (1 - J), X, Y + K * te, X); ae.addColorStop(0, "#ffffff"), ae.addColorStop(1, "#ff0000"), o.fillStyle = ae } else o.fillStyle = "#ff0000"; o.fillRect(Y + K * te * (1 - J), X, K * te * J, Z), o.beginPath(), o.moveTo(Y + K * te * (1 - J), X), o.lineTo(Y + K * te * (1 - J), X + Z), o.lineTo(Y + K * te, X + Z), o.lineTo(Y + K * te, X), o.lineTo(Y + K * te * (1 - J), X), o.lineWidth = 1, o.strokeStyle = "#ff0000", o.stroke(), o.closePath() } else if ("plus" == Q) { var re = A.dataBar.plusLen; if (1 == re) { if (ee.length > 1) { var ne = o.createLinearGradient(Y, X, Y + K * J, X); ne.addColorStop(0, ee[0]), ne.addColorStop(1, ee[1]), o.fillStyle = ne } else o.fillStyle = ee[0]; o.fillRect(Y, X, K * J, Z), o.beginPath(), o.moveTo(Y, X), o.lineTo(Y, X + Z), o.lineTo(Y + K * J, X + Z), o.lineTo(Y + K * J, X), o.lineTo(Y, X), o.lineWidth = 1, o.strokeStyle = ee[0], o.stroke(), o.closePath() } else { var le = A.dataBar.minusLen; if (ee.length > 1) { var ie = o.createLinearGradient(Y + K * le, X, Y + K * le + K * re * J, X); ie.addColorStop(0, ee[0]), ie.addColorStop(1, ee[1]), o.fillStyle = ie } else o.fillStyle = ee[0]; o.fillRect(Y + K * le, X, K * re * J, Z), o.beginPath(), o.moveTo(Y + K * le, X), o.lineTo(Y + K * le, X + Z), o.lineTo(Y + K * le + K * re * J, X + Z), o.lineTo(Y + K * le + K * re * J, X), o.lineTo(Y + K * le, X), o.lineWidth = 1, o.strokeStyle = ee[0], o.stroke(), o.closePath() } } } var oe = r + u, se = a + d + 1; o.save(), o.beginPath(), o.rect(oe, se, x, w), o.clip(), o.scale(ga.zoomRatio, ga.zoomRatio); var ce = Es(k, o, { cellWidth: x, cellHeight: w, space_width: 2, space_height: 2, r: e, c: t }); if (null != A && null != A.icons && "plain" == ce.type) { var ue = A.icons.left, de = A.icons.top, he = ce.values[0], me = (he.left, se + he.top - ce.textHeightAll); "0" == C ? me = se + w / 2 - ce.textHeightAll / 2 : "1" == C ? me = se : "2" == C && (me -= ce.desc), me /= ga.zoomRatio, ga.zoomRatio, o.drawImage(Un, 42 * ue, 32 * de, 32, 32, oe / ga.zoomRatio, me, ce.textHeightAll / ga.zoomRatio, ce.textHeightAll / ga.zoomRatio), "0" != _ && "2" != _ && ce.textHeightAll / ga.zoomRatio } o.fillStyle = xm.checkstatus(ga.flowdata, e, t, "fc"), null != T && null != T[0] && (o.fillStyle = T[0]), null != A && null != A.textColor && (o.fillStyle = A.textColor), k.ct && k.ct.fa && k.ct.fa.indexOf("[Red]") > -1 && "n" == k.ct.t && k.v < 0 && (o.fillStyle = "#ff0000"), ad(ce, o, { pos_x: oe, pos_y: se }), o.restore() } P && (ga.luckysheetcurrentisPivotTable || S || !ga.showGridLines || (o.beginPath(), o.moveTo(l + u - 2 + y, a + d), o.lineTo(l + u - 2 + y, n + d), o.lineWidth = 1, o.strokeStyle = Vn, o.stroke(), o.closePath())), ga.luckysheetcurrentisPivotTable || S || !ga.showGridLines || (o.beginPath(), o.moveTo(r + u - 1, n + d - 2 + y), o.lineTo(l + u - 1, n + d - 2 + y), o.lineWidth = 1, o.strokeStyle = Vn, o.stroke(), o.closePath()), Nc.createHookFunction("cellRenderAfter", ga.flowdata[e][t], { r: e, c: t, start_r: R[1], start_c: R[0], end_r: R[3] + R[1], end_c: R[2] + R[0] }, Sh.getSheetByIndex(), o) } }, Ju = function (e, t, a, r, n, l, i, o, s, c, u) { var d; d = 0 == e ? -l - 1 : ga.visibledatarow[e - 1] - l - 1; var h, m = ga.visibledatarow[e] - l; h = 0 == a ? -i : ga.visibledatacolumn[a - 1] - i; var p = ga.visibledatacolumn[r] - i, f = ga.flowdata[e][t], g = p - h - 2, v = m - d - 2, y = h + o, b = d + s + 1, k = qm(f); n.font = k, n.save(), n.beginPath(), n.rect(y, b, g, v), n.clip(), n.scale(ga.zoomRatio, ga.zoomRatio); var x = Es(f, n, { cellWidth: g, cellHeight: v, space_width: 2, space_height: 2, r: e, c: t }), w = wc.checksAF(e, t, c), _ = gd.checksCF(e, t, u); n.fillStyle = xm.checkstatus(ga.flowdata, e, t, "fc"), null != w && null != w[0] && (n.fillStyle = w[0]), null != _ && null != _.textColor && (n.fillStyle = _.textColor), ad(x, n, { pos_x: y, pos_y: b }), n.restore() }; function ed(e, t, a, r, n, l) { var i = ga.flowdata; if ("forward" == r && a < 0) return { success: !1, r: e, c: a }; if ("backward" == r && a > i[e].length - 1) return { success: !1, r: e, c: a }; var o = i[e][a]; if (null != o && (!ya(o.v) || null != o.mc)) return { success: !1, r: e, c: a }; var s = t - 1 < 0 ? 0 : ga.visibledatacolumn[t - 1], c = ga.visibledatacolumn[t], u = l - (c - s); "0" == n ? (s -= u / 2, c += u / 2) : "1" == n ? c += u : "2" == n && (s -= u); var d = a - 1 < 0 ? 0 : ga.visibledatacolumn[a - 1], h = ga.visibledatacolumn[a]; return "forward" == r ? s < d ? ed(e, t, a - 1, r, n, l) : s < h ? { success: !0, r: e, c: a } : { success: !1, r: e, c: a } : "backward" == r ? c > h ? ed(e, t, a + 1, r, n, l) : c > d ? { success: !0, r: e, c: a } : { success: !1, r: e, c: a } : void 0 } function td(e, t, a, r, n) { var l, i, o, s, c = !1, u = !1; for (var d in e) { for (var h in e[d]) { l = d, i = h; var m = e[d][h]; if (o = m.stc, s = m.edc, l == t && a >= o && a <= s && (c = !0, a == s || a == n)) { u = !0; break } } if (u) break } return { colIn: c, colLast: u, rowIndex: l, colIndex: i, stc: o, edc: s } } function ad(e, t, a) { if (null != e) { var r = e.values, n = a.pos_x, l = a.pos_y; if (null != r) { 0 != e.rotate && "verticalWrap" != e.type && (t.save(), t.translate((n + e.textLeftAll) / ga.zoomRatio, (l + e.textTopAll) / ga.zoomRatio), t.rotate(-e.rotate * Math.PI / 180), t.translate(-(e.textLeftAll + n) / ga.zoomRatio, -(l + e.textTopAll) / ga.zoomRatio)); for (var i = 0; i < r.length; i++) { var o = r[i]; !0 === o.inline && null != o.style ? (t.font = o.style.fontset, t.fillStyle = o.style.fc) : t.font = o.style; var s = "object" === Sa(o.content) ? o.content.m : o.content; if (t.fillText(s, (n + o.left) / ga.zoomRatio, (l + o.top) / ga.zoomRatio), null != o.cancelLine) { var c = o.cancelLine; t.beginPath(), t.moveTo(Math.floor((n + c.startX) / ga.zoomRatio) + .5, Math.floor((l + c.startY) / ga.zoomRatio) + .5), t.lineTo(Math.floor((n + c.endX) / ga.zoomRatio) + .5, Math.floor((l + c.endY) / ga.zoomRatio) + .5), t.lineWidth = Math.floor(c.fs / 9), t.strokeStyle = t.fillStyle, t.stroke(), t.closePath() } if (null != o.underLine) for (var u = o.underLine, d = 0; d < u.length; d++) { var h = u[d]; t.beginPath(), t.moveTo(Math.floor((n + h.startX) / ga.zoomRatio) + .5, Math.floor((l + h.startY) / ga.zoomRatio)), t.lineTo(Math.floor((n + h.endX) / ga.zoomRatio) + .5, Math.floor((l + h.endY) / ga.zoomRatio) + .5), t.lineWidth = Math.floor(h.fs / 9), t.strokeStyle = t.fillStyle, t.stroke(), t.closePath() } } 0 != e.rotate && "verticalWrap" != e.type && t.restore() } } } var rd = { item: { linkType: "external", linkAddress: "", linkTooltip: "" }, hyperlink: null, createDialog: function () { var e = gn(), t = e.insertLink, a = e.toolbar, r = e.button; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-insertLink-dialog").remove(); var n = ""; ga.luckysheetfile.forEach((function (e) { n += '<option value="'.concat(e.name, '">').concat(e.name, "</option>") })); var l = '<div class="box">\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkText">'.concat(t.linkText, '</label>\n <input type="text" id="luckysheet-insertLink-dialog-linkText"/>\n </div>\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkType">').concat(t.linkType, '</label>\n <select id="luckysheet-insertLink-dialog-linkType">\n <option value="external">').concat(t.external, '</option>\n <option value="internal">').concat(t.internal, '</option>\n </select>\n </div>\n <div class="show-box show-box-external">\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkAddress">').concat(t.linkAddress, '</label>\n <input type="text" id="luckysheet-insertLink-dialog-linkAddress" placeholder="').concat(t.placeholder1, '" />\n </div>\n </div>\n <div class="show-box show-box-internal">\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkSheet">').concat(t.linkSheet, '</label>\n <select id="luckysheet-insertLink-dialog-linkSheet">\n ').concat(n, '\n </select>\n </div>\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkCell">').concat(t.linkCell, '</label>\n <input type="text" id="luckysheet-insertLink-dialog-linkCell" value="A1" placeholder="').concat(t.placeholder2, '" />\n </div>\n </div>\n <div class="box-item">\n <label for="luckysheet-insertLink-dialog-linkTooltip">').concat(t.linkTooltip, '</label>\n <input type="text" id="luckysheet-insertLink-dialog-linkTooltip" placeholder="').concat(t.placeholder3, '" />\n </div>\n </div>'); $("body").append(_m(bn, { id: "luckysheet-insertLink-dialog", addclass: "luckysheet-insertLink-dialog", title: a.insertLink, content: l, botton: '<button id="luckysheet-insertLink-dialog-confirm" class="btn btn-primary">'.concat(r.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(r.cancel, "</button>"), style: "z-index:100003" })); var i = $("#luckysheet-insertLink-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 350).end(), o = i.outerHeight(), s = i.outerWidth(), c = $(window).width(), u = $(window).height(), d = $(document).scrollLeft(), h = $(document).scrollTop(); $("#luckysheet-insertLink-dialog").css({ left: (c + d - s) / 2, top: (u + h - o) / 3 }).show(), this.dataAllocation() }, init: function () { var e = this, t = gn().insertLink; $(document).off("change.linkType").on("change.linkType", "#luckysheet-insertLink-dialog-linkType", (function (e) { var t = this.value; $("#luckysheet-insertLink-dialog .show-box").hide(), $("#luckysheet-insertLink-dialog .show-box-" + t).show() })), $(document).off("click.confirm").on("click.confirm", "#luckysheet-insertLink-dialog-confirm", (function (a) { var r = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], n = r.row_focus || r.row[0], l = r.column_focus || r.column[0], i = $("#luckysheet-insertLink-dialog-linkText").val(), o = $("#luckysheet-insertLink-dialog-linkType").val(), s = $("#luckysheet-insertLink-dialog-linkAddress").val(), c = $("#luckysheet-insertLink-dialog-linkSheet").val(), u = $("#luckysheet-insertLink-dialog-linkCell").val(), d = $("#luckysheet-insertLink-dialog-linkTooltip").val(); if ("external" == o) { if (/^http[s]?:\/\//.test(s) || (s = "https://" + s), !/^http[s]?:\/\/([\w\-\.]+)+[\w-]*([\w\-\.\/\?%&=]+)?$/gi.test(s)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo1) } else { if (!Ih.iscelldata(u)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', t.tooltipInfo2); s = c + "!" + u } null != i && "" != i.replace(/\s/g, "") || (i = s); var h = { linkType: o, linkAddress: s, linkTooltip: d }, m = $.extend(!0, {}, e.hyperlink), p = $.extend(!0, {}, e.hyperlink); p[n + "_" + l] = h; var f = rs.deepCopyFlowData(ga.flowdata), g = f[n][l]; null == g && (g = {}), g.fc = "rgb(0, 0, 255)", g.un = 1, g.v = i, f[n][l] = g, e.ref(m, p, ga.currentSheetIndex, f, { row: [n, n], column: [l, l] }), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-insertLink-dialog").hide() })) }, dataAllocation: function () { var e = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], t = e.row_focus || e.row[0], a = e.column_focus || e.column[0], r = (this.hyperlink || {})[t + "_" + a] || {}, n = Ko(t, a, null, "m"); $("#luckysheet-insertLink-dialog-linkText").val(n); var l = r.linkType || "external"; $("#luckysheet-insertLink-dialog-linkType").val(l), $("#luckysheet-insertLink-dialog .show-box").hide(), $("#luckysheet-insertLink-dialog .show-box-" + l).show(); var i = r.linkAddress || ""; if ("external" == l) $("#luckysheet-insertLink-dialog-linkAddress").val(i); else if (Ih.iscelldata(i)) { var o = i.split("!")[0], s = i.split("!")[1]; $("#luckysheet-insertLink-dialog-linkSheet").val(o), $("#luckysheet-insertLink-dialog-linkCell").val(s) } var c = r.linkTooltip || ""; $("#luckysheet-insertLink-dialog-linkTooltip").val(c) }, cellFocus: function (e, t) { if (null != this.hyperlink && null != this.hyperlink[e + "_" + t]) { var a = this.hyperlink[e + "_" + t]; if ("external" == a.linkType) window.open(a.linkAddress); else { var r = Ih.getcellrange(a.linkAddress), n = r.sheetIndex, l = [{ row: r.row, column: r.column }]; n != ga.currentSheetIndex && ($("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + n).addClass("luckysheet-sheets-item-active"), Sh.changeSheet(n)), ga.luckysheet_select_save = l, Rh(); var i = r.row[0] - 1 == -1 ? 0 : ga.visibledatarow[r.row[0] - 1], o = r.column[0] - 1 == -1 ? 0 : ga.visibledatacolumn[r.column[0] - 1]; $("#luckysheet-scrollbar-x").scrollLeft(o), $("#luckysheet-scrollbar-y").scrollTop(i) } } }, overshow: function (e) { if ($("#luckysheet-hyperlink-overshow").remove(), 0 != $(e.target).closest("#luckysheet-cell-main").length) { 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; if (!(null != Bc.freezenverticaldata && t[0] < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] || null != Bc.freezenhorizontaldata && t[1] < Bc.freezenhorizontaldata[0] - 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]), null != this.hyperlink && null != this.hyperlink[i + "_" + o]) { var c = this.hyperlink[i + "_" + o], u = c.linkTooltip; null != u && "" != u.replace(/\s/g, "") || (u = c.linkAddress); var d = ga.visibledatarow[i], h = (i - 1 == -1 || ga.visibledatarow[i - 1], ga.visibledatacolumn[o], o - 1 == -1 ? 0 : ga.visibledatacolumn[o - 1]); s && (d = s.row[1], s.row[0], s.column[1], h = s.column[0]); var m = '<div id="luckysheet-hyperlink-overshow" style="background:#fff;padding:5px 10px;border:1px solid #000;box-shadow:2px 2px #999;position:absolute;left:'.concat(h, "px;top:").concat(d + 5, 'px;z-index:100;">\n <div>').concat(u, "</div>\n <div>单击鼠标可以追踪</div>\n </div>"); $(m).appendTo($("#luckysheet-cell-main")) } } } }, ref: function (e, t, a, r, n) { if (ga.clearjfundo) { ga.jfundo.length = 0; var l = { type: "updateHyperlink" }; l.sheetIndex = a, l.historyHyperlink = e, l.currentHyperlink = t, l.data = ga.flowdata, l.curData = r, l.range = n, ga.jfredo.push(l) } this.hyperlink = t, ga.luckysheetfile[_l(a)].hyperlink = t, ga.flowdata = r, rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(a)].data = ga.flowdata, pd.allowUpdate && (pd.saveParam("all", a, t, { k: "hyperlink" }), pd.historyParam(ga.flowdata, a, n)), setTimeout((function () { md() }), 1) } }, nd = null; function ld(e, t, a) { Ih.execFunctionExist = []; for (var r = 0; r < e.length; r++)for (var n = e[r].row[0]; n <= e[r].row[1]; n++)for (var l = e[r].column[0]; l <= e[r].column[1]; l++)Ih.execFunctionExist.push({ r: n, c: l, i: t }); Ih.execFunctionExist.reverse(), Ih.execFunctionGroup(null, null, null, null, a), Ih.execFunctionGlobalData = null } function id(e, t, a) { var r = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], n = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4]; null == e && (e = ga.flowdata), null == t && (t = ga.luckysheet_select_save), clearTimeout(nd), null == a && (a = {}); var l, i, o, s, c = a.cfg, u = a.RowlChange, d = a.cdformat, h = a.dataVerification, m = a.dynamicArray, p = ga.luckysheetfile[_l(ga.currentSheetIndex)]; ga.clearjfundo && (ga.jfundo.length = 0, l = null == c ? $.extend(!0, {}, ga.config) : $.extend(!0, {}, c), i = null == d ? $.extend(!0, [], p.luckysheet_conditionformat_save) : d, o = null == h ? $.extend(!0, {}, p.dataVerification) : h, s = null == m ? $.extend(!0, [], p.dynamicArray) : m, ga.jfredo.push({ type: "datachange", data: ga.flowdata, curdata: e, sheetIndex: ga.currentSheetIndex, range: t, config: $.extend(!0, {}, ga.config), curConfig: l, cdformat: $.extend(!0, [], p.luckysheet_conditionformat_save), curCdformat: i, RowlChange: u, dataVerification: $.extend(!0, [], p.dataVerification), curDataVerification: o, dynamicArray: $.extend(!0, [], p.dynamicArray), curDynamicArray: s, dataRange: Da(p.luckysheet_select_save) })); ga.flowdata = e, rs.webWorkerFlowDataCache(ga.flowdata), p.data = ga.flowdata, null != c && (ga.config = c, p.config = ga.config, pd.saveParam("all", ga.currentSheetIndex, c, { k: "config" }), null != u && hd(ga.flowdata.length, ga.flowdata[0].length)), null != d && (p.luckysheet_conditionformat_save = d, pd.saveParam("all", ga.currentSheetIndex, d, { k: "luckysheet_conditionformat_save" })), null != h && ($c.dataVerification = h, p.dataVerification = h, pd.saveParam("all", ga.currentSheetIndex, h, { k: "dataVerification" })), null != m && (p.dynamicArray = m, pd.saveParam("all", ga.currentSheetIndex, m, { k: "dynamicArray" })); for (var f = 0; f < t.length; f++) { var g = t[f].row[0], v = t[f].column[0]; if (null != ga.flowdata[g][v] && null != ga.flowdata[g][v].spl) { window.luckysheetCurrentRow = g, window.luckysheetCurrentColumn = v, window.luckysheetCurrentFunction = ga.flowdata[g][v].f; var y = $.trim(Ih.functionParserExe(ga.flowdata[g][v].f)), b = new Function("return " + y)(); ga.flowdata[g][v].spl = b } pd.allowUpdate && pd.historyParam(ga.flowdata, ga.currentSheetIndex, t[f]), "function" == typeof ga.chartparam.jfrefreshchartall && ga.chartparam.jfrefreshchartall(ga.flowdata, t[f].row[0], t[f].row[1], t[f].column[0], t[f].column[1]) } r && ld(t, ga.currentSheetIndex, e), n && (nd = setTimeout((function () { md() }), 1)), window.luckysheet_getcelldata_cache = null } function od(e, t, a, r, n, l, i, o) { var s = !(arguments.length > 8 && void 0 !== arguments[8]) || arguments[8], c = {}, u = !1; if (clearTimeout(nd), "cellRowChange" == l) { c.type = "cellRowChange", c.config = $.extend(!0, {}, ga.config), c.curconfig = $.extend(!0, {}, r), c.range = $.extend(!0, [], ga.luckysheet_select_save), c.currange = n, c.ctrlType = l, c.ctrlValue = i; var d = r.rowlen; null == d && (d = {}), pd.saveParam("cg", ga.currentSheetIndex, d, { k: "rowlen" }) } else if ("resizeC" == l) { c.type = "resize", c.config = $.extend(!0, {}, ga.config), c.curconfig = $.extend(!0, {}, r), c.range = $.extend(!0, [], ga.luckysheet_select_save), c.currange = n, c.ctrlType = l, c.ctrlValue = i; var h = r.columnlen; null == h && (h = {}), pd.saveParam("cg", ga.currentSheetIndex, h, { k: "columnlen" }) } else if (l.indexOf("extend") > -1) c.type = "extend", c.config = $.extend(!0, {}, ga.config), c.curconfig = $.extend(!0, {}, r), c.range = $.extend(!0, [], ga.luckysheet_select_save), c.currange = n, c.ctrlType = l, c.ctrlValue = i, pd.saveParam("arc", ga.currentSheetIndex, { index: i.index, len: i.len, direction: i.direction, mc: r.merge }, { rc: i.type }); else if (l.indexOf("dele") > -1) c.type = "dele", c.config = $.extend(!0, {}, ga.config), c.curconfig = $.extend(!0, {}, r), c.range = $.extend(!0, [], ga.luckysheet_select_save), c.currange = n, c.ctrlType = l, c.ctrlValue = i, pd.saveParam("drc", ga.currentSheetIndex, { index: i.index, len: i.len, mc: r.merge, borderInfo: r.borderInfo }, { rc: i.type }); else { c.type = "datachangeAll", c.range = $.extend(!0, [], ga.luckysheet_select_save), c.currange = n, c.ctrlType = l, c.ctrlValue = i, u = !0; for (var m = 0; m < n.length; m++)pd.historyParam(a, ga.currentSheetIndex, n[m]) } ga.clearjfundo && (ga.jfundo.length = 0, c.data = ga.flowdata, c.curdata = a, c.sheetIndex = ga.currentSheetIndex, c.cdformat = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save), c.curCdformat = o, ga.jfredo.push(c)), ga.flowdata = a, rs.webWorkerFlowDataCache(a), ga.luckysheetfile[_l(ga.currentSheetIndex)].data = ga.flowdata, null != r && (ga.config = r, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("all", ga.currentSheetIndex, r, { k: "config" })), null != o && (ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save = o, pd.saveParam("all", ga.currentSheetIndex, o, { k: "luckysheet_conditionformat_save" })), ga.luckysheet_select_save = $.extend(!0, [], n), ga.luckysheet_select_save.length > 0 && Rh(), u && ld(n, ga.currentSheetIndex, a), hd(t, e), s && (nd = setTimeout((function () { md() }), 1)), Sh.storeSheetParamALL(), window.luckysheet_getcelldata_cache = null } function sd(e, t, a) { clearTimeout(nd), ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "rangechange", data: ga.flowdata, curdata: e, range: t, sheetIndex: ga.currentSheetIndex, cdformat: $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save), curCdformat: a })), ga.flowdata = e, rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(ga.currentSheetIndex)].data = ga.flowdata, null != a && (ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save = a), ld(t, ga.currentSheetIndex, e), nd = setTimeout((function () { md() }), 1); for (var r = 0; r < t.length; r++)pd.historyParam(ga.flowdata, ga.currentSheetIndex, t[r]) } function cd(e, t, a, r, n, l, i, o, s, c, u) { var d = ga.luckysheetfile[_l(ga.currentSheetIndex)]; Fh(); var h = []; for (var m in t.merge) for (var p = t.merge[m], f = p.r; f <= p.r + p.rs - 1; f++)for (var g = p.c; g <= p.c + p.cs - 1; g++)null == e[f][g] && (e[f][g] = {}), f == p.r && g == p.c ? e[f][g].mc = p : e[f][g].mc = { r: p.r, c: p.c }, h.push({ r: f, c: g }); var v = []; ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: a, sheetIndex: ga.currentSheetIndex, data: ga.flowdata, curData: e, config: $.extend(!0, {}, ga.config), curConfig: t, ctrlValue: r, mcData: h, calc: $.extend(!0, [], d.calcChain), curCalc: n, funcData: v, filterObj: { filter_select: $.extend(!0, {}, d.filter_select), filter: $.extend(!0, {}, d.filter) }, curFilterObj: l, cf: $.extend(!0, [], d.luckysheet_conditionformat_save), curCf: i, af: $.extend(!0, [], d.luckysheet_alternateformat_save), curAf: o, freezen: { freezenhorizontaldata: Bc.freezenhorizontaldata, freezenverticaldata: Bc.freezenverticaldata }, curFreezen: s, dataVerification: $.extend(!0, {}, d.dataVerification), curDataVerification: c, hyperlink: $.extend(!0, {}, d.hyperlink), curHyperlink: u, dataRange: Da(d.luckysheet_select_save) })); var y = r.index, b = r.len, k = r.rc; if ("addRC" == a) { var x = r.direction, w = []; if (r.restore) if ("r" == k) { var _; "lefttop" == x ? _ = y : "rightbottom" == x && (_ = y + 1); for (var C = _ + b - 1, T = _; T <= C; T++) { for (var A = [], S = 0; S < e[0].length; S++) { var I = e[T][S]; A.push(I) } w.push(A) } } else if ("c" == k) { var R; "lefttop" == x ? R = y : "rightbottom" == x && (R = y + 1); for (var q = R + b - 1, D = 0; D < e.length; D++) { for (var F = [], E = R; E <= q; E++) { var M = e[D][E]; F.push(M) } w.push(F) } } pd.saveParam("arc", ga.currentSheetIndex, { index: y, len: b, direction: x, data: w }, { rc: k }) } else "delRC" == a && pd.saveParam("drc", ga.currentSheetIndex, { index: y, len: b }, { rc: k }); ga.flowdata = e, rs.webWorkerFlowDataCache(ga.flowdata), d.data = e, ga.config = t, d.config = ga.config, pd.saveParam("all", ga.currentSheetIndex, t, { k: "config" }); for (var N = 0; N < h.length; N++) { var P = h[N].r, z = h[N].c; pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[P][z], { r: P, c: z }) } if (n.length > 0) for (var L = 0; L < n.length; L++) { var O = n[L], B = O.r, V = O.c, H = O.index, U = Qo(B, V, H, e), j = Ih.execfunction(U, B, V, H, null, !0); O.func = j, e[B][V].f == U && Cs(B, V, e, j[1]) } d.calcChain = n, pd.saveParam("all", ga.currentSheetIndex, n, { k: "calcChain" }); for (var G = 0; G < v.length; G++) { var W = v[G].r, Y = v[G].c; pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[W][Y], { r: W, c: Y }) } null != l ? (d.filter_select = l.filter_select, d.filter = l.filter) : (d.filter_select = null, d.filter = null), Sc(d.filter_select, d.filter), pd.saveParam("all", ga.currentSheetIndex, d.filter_select, { k: "filter_select" }), pd.saveParam("all", ga.currentSheetIndex, d.filter, { k: "filter" }), d.luckysheet_conditionformat_save = i, pd.saveParam("all", ga.currentSheetIndex, d.luckysheet_conditionformat_save, { k: "luckysheet_conditionformat_save" }), d.luckysheet_alternateformat_save = o, pd.saveParam("all", ga.currentSheetIndex, d.luckysheet_alternateformat_save, { k: "luckysheet_alternateformat_save" }), null != s ? (Bc.freezenhorizontaldata = s.freezenhorizontaldata, Bc.freezenverticaldata = s.freezenverticaldata) : (Bc.freezenhorizontaldata = null, Bc.freezenverticaldata = null), $c.dataVerification = c, d.dataVerification = c, pd.saveParam("all", ga.currentSheetIndex, d.dataVerification, { k: "dataVerification" }), rd.hyperlink = u, d.hyperlink = u, pd.saveParam("all", ga.currentSheetIndex, d.hyperlink, { k: "hyperlink" }), hd(ga.flowdata.length, ga.flowdata[0].length) } function ud(e, t, a, r, n, l, i, o) { var s = ga.luckysheetfile[_l(ga.currentSheetIndex)]; clearTimeout(nd), Fh(); var c = []; if ("{}" == JSON.stringify(t.merge)) for (var u = 0; u < e.length; u++)for (var d = 0; d < e[0].length; d++) { var h = e[u][d]; null != h && null != h.mc && (delete h.mc, c.push({ r: u, c: d })) } else for (var m in t.merge) for (var p = t.merge[m], f = p.r; f <= p.r + p.rs - 1; f++)for (var g = p.c; g <= p.c + p.cs - 1; g++)null == e[f][g] && (e[f][g] = {}), f == p.r && g == p.c ? e[f][g].mc = p : e[f][g].mc = { r: p.r, c: p.c }, c.push({ r: f, c: g }); var v = []; if (ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "deleteCell", sheetIndex: ga.currentSheetIndex, ctrl: a, data: ga.flowdata, curData: e, config: $.extend(!0, {}, ga.config), curConfig: t, mcData: c, calc: $.extend(!0, [], s.calcChain), curCalc: r, funcData: v, filterObj: { filter_select: $.extend(!0, {}, s.filter_select), filter: $.extend(!0, {}, s.filter) }, curFilterObj: n, cf: $.extend(!0, [], s.luckysheet_conditionformat_save), curCf: l, dataVerification: $.extend(!0, {}, s.dataVerification), curDataVerification: i, hyperlink: $.extend(!0, {}, s.hyperlink), curHyperlink: o, dataRange: Da(s.luckysheet_select_save) })), ga.flowdata = e, rs.webWorkerFlowDataCache(ga.flowdata), s.data = e, pd.allowUpdate) { var y, b = a.type, k = a.str, x = a.edr, w = a.stc, _ = a.edc; "moveUp" == b ? y = { row: [k, e.length - 1], column: [w, _] } : "moveLeft" == b && (y = { row: [k, x], column: [w, e[0].length - 1] }), pd.historyParam(ga.flowdata, ga.currentSheetIndex, y) } ga.config = t, s.config = ga.config, pd.saveParam("all", ga.currentSheetIndex, t, { k: "config" }); for (var C = 0; C < c.length; C++) { var T = c[C].r, A = c[C].c; pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[T][A], { r: T, c: A }) } if (r.length > 0) for (var S = 0; S < r.length; S++) { var I = r[S], R = I.r, q = I.c, D = I.index, F = Qo(R, q, D, e), E = Ih.execfunction(F, R, q, D, null, !0); I.func = E, e[R][q].f == F && Cs(R, q, e, E[1]) } s.calcChain = r, pd.saveParam("all", ga.currentSheetIndex, r, { k: "calcChain" }); for (var M = 0; M < v.length; M++) { var N = v[M].r, P = v[M].c; pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[N][P], { r: N, c: P }) } null != n ? (s.filter_select = n.filter_select, s.filter = n.filter) : (s.filter_select = null, s.filter = null), Sc(s.filter_select, s.filter), pd.saveParam("all", ga.currentSheetIndex, s.filter_select, { k: "filter_select" }), pd.saveParam("all", ga.currentSheetIndex, s.filter, { k: "filter" }), s.luckysheet_conditionformat_save = l, pd.saveParam("all", ga.currentSheetIndex, s.luckysheet_conditionformat_save, { k: "luckysheet_conditionformat_save" }), $c.dataVerification = i, s.dataVerification = i, pd.saveParam("all", ga.currentSheetIndex, s.dataVerification, { k: "dataVerification" }), rd.hyperlink = o, s.hyperlink = o, pd.saveParam("all", ga.currentSheetIndex, s.hyperlink, { k: "hyperlink" }), nd = setTimeout((function () { md() }), 1) } function dd(e, t, a) { var r, n = {}; Ih.execFunctionExist = [], clearTimeout(nd); for (var l = e.range.row[0]; l <= e.range.row[1]; l++)for (var i = e.range.column[0]; i <= e.range.column[1]; i++)l + "_" + i + "_" + e.sheetIndex in n || (n[l + "_" + i + "_" + e.sheetIndex] = 0, Ih.execFunctionExist.push({ r: l, c: i, i: e.sheetIndex })); for (var o = t.range.row[0]; o <= t.range.row[1]; o++)for (var s = t.range.column[0]; s <= t.range.column[1]; s++)o + "_" + s + "_" + t.sheetIndex in n || (n[o + "_" + s + "_" + t.sheetIndex] = 0, Ih.execFunctionExist.push({ r: o, c: s, i: t.sheetIndex })); if (ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "pasteCut", source: e, target: t, RowlChange: a })), ga.currentSheetIndex == e.sheetIndex ? (ga.config = e.curConfig, r = e.curData.length, ga.luckysheetfile[_l(t.sheetIndex)].config = t.curConfig) : ga.currentSheetIndex == t.sheetIndex && (ga.config = t.curConfig, r = t.curData.length, ga.luckysheetfile[_l(e.sheetIndex)].config = e.curConfig), a) { ga.visibledatarow = [], ga.rh_height = 0; for (var c = 0; c < r; c++) { var u = ga.defaultrowlen; null != ga.config.rowlen && null != ga.config.rowlen[c] && (u = ga.config.rowlen[c]), null == ga.config.rowhidden || null == ga.config.rowhidden[c] ? (ga.rh_height += u + 1, ga.visibledatarow.push(ga.rh_height)) : (u = ga.config.rowhidden[c], ga.visibledatarow.push(ga.rh_height)) } if (ga.rh_height += 110, ga.currentSheetIndex == e.sheetIndex) { var d = Ds(t.curData.length, t.curConfig); ga.luckysheetfile[_l(t.sheetIndex)].visibledatarow = d } else if (ga.currentSheetIndex == t.sheetIndex) { var h = Ds(e.curData.length, e.curConfig); ga.luckysheetfile[_l(e.sheetIndex)].visibledatarow = h } } ga.currentSheetIndex == e.sheetIndex ? (ga.flowdata = e.curData, ga.luckysheetfile[_l(t.sheetIndex)].data = t.curData) : ga.currentSheetIndex == t.sheetIndex && (ga.flowdata = t.curData, ga.luckysheetfile[_l(e.sheetIndex)].data = e.curData), rs.webWorkerFlowDataCache(ga.flowdata), ga.luckysheetfile[_l(ga.currentSheetIndex)].data = ga.flowdata, ga.currentSheetIndex == t.sheetIndex ? ga.luckysheet_select_save = [{ row: t.range.row, column: t.range.column }] : ga.luckysheet_select_save = [{ row: e.range.row, column: e.range.column }], ga.luckysheet_select_save.length > 0 && Rh(), ga.luckysheetfile[_l(e.sheetIndex)].luckysheet_conditionformat_save = e.curCdformat, ga.luckysheetfile[_l(t.sheetIndex)].luckysheet_conditionformat_save = t.curCdformat, ga.currentSheetIndex == e.sheetIndex ? $c.dataVerification = e.curDataVerification : ga.currentSheetIndex == t.sheetIndex && ($c.dataVerification = t.curDataVerification), ga.luckysheetfile[_l(e.sheetIndex)].dataVerification = e.curDataVerification, ga.luckysheetfile[_l(t.sheetIndex)].dataVerification = t.curDataVerification, Ih.execFunctionExist.reverse(), Ih.execFunctionGroup(null, null, null, null, t.curData), Ih.execFunctionGlobalData = null, nd = setTimeout((function () { md() }), 1), Sh.storeSheetParamALL(), pd.saveParam("all", e.sheetIndex, e.curConfig, { k: "config" }), pd.saveParam("all", t.sheetIndex, t.curConfig, { k: "config" }), pd.historyParam(e.curData, e.sheetIndex, { row: e.range.row, column: e.range.column }), pd.historyParam(t.curData, t.sheetIndex, { row: t.range.row, column: t.range.column }), pd.saveParam("all", e.sheetIndex, e.curCdformat, { k: "luckysheet_conditionformat_save" }), pd.saveParam("all", t.sheetIndex, t.curCdformat, { k: "luckysheet_conditionformat_save" }), pd.saveParam("all", e.sheetIndex, e.curDataVerification, { k: "dataVerification" }), pd.saveParam("all", t.sheetIndex, t.curDataVerification, { k: "dataVerification" }) } function hd(e, t) { var a = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; So(e, t), clearTimeout(nd), Sh.storeSheetParam(); var r = ga.luckysheetfile[_l(ga.currentSheetIndex)].calcChain; if (null != r && r.length > 0) { null == ga.config.rowlen && (ga.config.rowlen = {}), null == ga.config.columnlen && (ga.config.columnlen = {}); for (var n = 0; n < r.length; n++) { var l = r[n].r, i = r[n].c, o = r[n].index; if (o == ga.currentSheetIndex && null != ga.flowdata[l][i] && null != ga.flowdata[l][i].spl && (l in ga.config.rowlen || i in ga.config.columnlen)) { window.luckysheetCurrentRow = l, window.luckysheetCurrentColumn = i, window.luckysheetCurrentFunction = ga.flowdata[l][i].f; var s = $.trim(Ih.functionParserExe(ga.flowdata[l][i].f)), c = new Function("return " + s)(); ga.flowdata[l][i].spl = c, pd.saveParam("v", ga.currentSheetIndex, ga.flowdata[l][i], { r: l, c: i }) } } ga.luckysheetfile[_l(ga.currentSheetIndex)].data = ga.flowdata } if (Pc.positionSync(), Rh(), Fh(), $(".luckysheet-selection-copy").is(":visible") && Eh(), $("#luckysheet-dropCell-icon").is(":visible") && $("#luckysheet-dropCell-icon").remove(), null != Bc.freezenhorizontaldata && null != Bc.freezenverticaldata) { var u = Bc.freezenhorizontaldata[1] - 1, d = Bc.freezenverticaldata[1] - 1, h = Bc.freezenhorizontaldata[2], m = Bc.freezenverticaldata[2], p = ga.visibledatarow[u] - 2 - h + ga.columnHeaderHeight, f = [ga.visibledatarow[u], u + 1, h, Bc.cutVolumn(ga.visibledatarow, u + 1), p], g = ga.visibledatacolumn[d] - 2 - m + ga.rowHeaderWidth, v = [ga.visibledatacolumn[d], d + 1, m, Bc.cutVolumn(ga.visibledatacolumn, d + 1), g]; Bc.saveFreezen(f, p, v, g), Bc.createFreezenHorizontal(f, p), Bc.createFreezenVertical(v, g), Bc.createAssistCanvas() } else if (null != Bc.freezenhorizontaldata) { var y = Bc.freezenhorizontaldata[1] - 1, b = Bc.freezenhorizontaldata[2], k = ga.visibledatarow[y] - 2 - b + ga.columnHeaderHeight, x = [ga.visibledatarow[y], y + 1, b, Bc.cutVolumn(ga.visibledatarow, y + 1), k]; Bc.saveFreezen(x, k, null, null), Bc.createFreezenHorizontal(x, k), Bc.createAssistCanvas() } else if (null != Bc.freezenverticaldata) { var w = Bc.freezenverticaldata[1] - 1, _ = Bc.freezenverticaldata[2], C = ga.visibledatacolumn[w] - 2 - _ + ga.rowHeaderWidth, T = [ga.visibledatacolumn[w], w + 1, _, Bc.cutVolumn(ga.visibledatacolumn, w + 1), C]; Bc.saveFreezen(null, null, T, C), Bc.createFreezenVertical(T, C), Bc.createAssistCanvas() } else $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").length > 0 && $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function (e, t) { var a = $(t).data("str"), r = $(t).data("cindex"), n = ga.visibledatacolumn[r] - 20, l = a - 1 == -1 ? 0 : ga.visibledatarow[a - 1]; $(t).css({ left: n, top: l }) })); if ($("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex).length > 0) { var A = ga.luckysheetfile[_l(ga.currentSheetIndex)].filter_select, S = A.row[0], I = A.row[1], R = A.column[0], q = A.column[1], D = ga.visibledatarow[I], F = S - 1 == -1 ? 0 : ga.visibledatarow[S - 1], E = ga.visibledatacolumn[q], M = R - 1 == -1 ? 0 : ga.visibledatacolumn[R - 1]; $("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex).css({ left: M, width: E - M - 1, top: F, height: D - F - 1 }) } Sh.showSheet(), a && (nd = setTimeout((function () { md() }), 1)) } function md(e, t) { if (Ih.groupValuesRefresh(), null == e && (e = $("#luckysheet-cell-main").scrollLeft()), null == t && (t = $("#luckysheet-cell-main").scrollTop()), null != Bc.freezenverticaldata || null != Bc.freezenhorizontaldata) { var a, r, n, l, i = ga.luckysheetTableContentHW[0], o = ga.luckysheetTableContentHW[1]; null != Bc.freezenverticaldata && null != Bc.freezenhorizontaldata ? (a = Bc.freezenhorizontaldata[0], Bc.freezenhorizontaldata[1], r = Bc.freezenhorizontaldata[2], n = Bc.freezenverticaldata[0], Bc.freezenverticaldata[1], Xu(l = Bc.freezenverticaldata[2], r, n, a, 1, 1, null, null, "freezen_3"), Xu(e + n - l, r, i - n + l, a, 1, 1, null, null, "freezen_4"), Xu(l, t + a - r, n, o - a + r, 1, 1, null, null, "freezen_7"), Xu(e + n - l, t + a - r, i - n + l, o - a + r, n - l + ga.rowHeaderWidth, a - r + ga.columnHeaderHeight), Yu(l, n, ga.rowHeaderWidth), Yu(e + n - l, i - n + l, n - l + ga.rowHeaderWidth), Wu(r, a, ga.columnHeaderHeight), Wu(t + a - r, o - a + r, a - r + ga.columnHeaderHeight)) : null != Bc.freezenhorizontaldata ? (a = Bc.freezenhorizontaldata[0], Bc.freezenhorizontaldata[1], Xu(e, r = Bc.freezenhorizontaldata[2], i, a, 1, 1, null, null, "freezen_h"), Xu(e, t + a - r, i, o - a + r, null, a - r + ga.columnHeaderHeight), Yu(e, i, null), Wu(r, a, ga.columnHeaderHeight), Wu(t + a - r, o - a + r, a - r + ga.columnHeaderHeight)) : null != Bc.freezenverticaldata && (n = Bc.freezenverticaldata[0], Bc.freezenverticaldata[1], Xu(l = Bc.freezenverticaldata[2], t, n, o, 1, 1, null, null, "freezen_v"), Xu(e + n - l, t, i - n + l, o, n - l + ga.rowHeaderWidth, null), Wu(t, o, null), Yu(l, n, ga.rowHeaderWidth), Yu(e + n - l, i - n + l, n - l + ga.rowHeaderWidth)) } else { if (0 == $("#luckysheetTableContent").length) return; var s = $("#luckysheetTableContent").get(0).getContext("2d"); Xu(e, t), Yu(e), Wu(t), s.clearRect(0, 0, ga.rowHeaderWidth * ga.devicePixelRatio - 1, ga.columnHeaderHeight * ga.devicePixelRatio - 1) } } var pd = { gridKey: null, loadUrl: null, updateUrl: null, updateImageUrl: null, title: null, loadSheetUrl: null, retryTimer: null, allowUpdate: !1, historyParam: function (e, t, a) { var r = a.row[0], n = a.row[1], l = a.column[0], i = a.column[1]; if (r == n && l == i) { var o = e[r][l]; this.saveParam("v", t, o, { r: r, c: l }) } else for (var s = n - r + 1, c = i - l + 1, u = Math.floor(1e3 / c), d = Math.ceil(s / u), h = 0; h < d; h++) { var m = r + u * h, p = void 0; p = h == d - 1 ? n : r + u * (h + 1) - 1; for (var f = [], g = m; g <= p; g++) { for (var v = [], y = l; y <= i; y++)null == e[g] ? v.push(null) : v.push(e[g][y]); f.push(v) } this.saveParam("rv", t, f, { range: { row: [m, p], column: [l, i] } }), h == d - 1 && this.saveParam("rv_end", t, null) } }, saveParam: function (e, t, a, r) { if (this.allowUpdate) { null == a && (a = null); var n = {}; if (n.t = e, n.i = t, n.v = a, "shs" !== e) { "rv" == e ? n.range = r.range : "v" == e || "fu" == e || "fm" == e ? (n.r = r.r, n.c = r.c) : "fc" == e ? (n.op = r.op, n.pos = r.pos) : "drc" == e || "arc" == e || "h" == e || "wh" == e ? n.rc = r.rc : "c" == e ? (n.cid = r.cid, n.op = r.op) : "f" == e ? (n.op = r.op, n.pos = r.pos) : "s" == e || ("sh" == e ? (n.op = r.op, null != r.cur && (n.cur = r.cur)) : ("cg" == e || "all" == e) && (n.k = r.k)); var l = To.gzip(encodeURIComponent(JSON.stringify(n)), { to: "string" }); null != this.websocket && this.websocket.send(l) } } }, websocket: null, wxErrorCount: 0, openWebSocket: function () { var e = this; if ("WebSocket" in window) { var t = e.updateUrl + "?t=111&g=" + encodeURIComponent(e.gridKey); e.updateUrl.indexOf("?") > -1 && (t = e.updateUrl + "&t=111&g=" + encodeURIComponent(e.gridKey)), e.websocket = new WebSocket(t), e.websocket.onopen = function () { console.info(gn().websocket.success), $("#luckysheet-cell-loading").hide(), e.wxErrorCount = 0, e.retryTimer = setInterval((function () { e.websocket.send("rub") }), 6e4) }, e.websocket.onmessage = function (t) { ga.result = t; var a = new Function("return " + t.data)(); console.info(a); var r = a.type, n = a.message, l = a.id; if ("用户退出" === n && ($("#luckysheet-multipleRange-show-" + l).hide(), ga.cooperativeEdit.changeCollaborationSize = ga.cooperativeEdit.changeCollaborationSize.filter((function (e) { return e.id != l })), ga.cooperativeEdit.checkoutData = ga.cooperativeEdit.checkoutData.filter((function (e) { return e.id != l }))), 1 == r); else if (2 == r) { var i = JSON.parse(a.data); e.wsUpdateMsg(i); var o = JSON.parse(a.data); ("columnlen" == o.k || "rowlen" == o.k) && Fh(o.v) } else if (3 == r) { var s = a.id, c = a.username, u = JSON.parse(a.data), d = (u.t, u.i), h = u.v; 0 === ga.cooperativeEdit.changeCollaborationSize.length && ga.cooperativeEdit.changeCollaborationSize.push({ id: s, v: u.v[0], i: d }), ga.cooperativeEdit.changeCollaborationSize.some((function (e) { return e.id == s })) ? ga.cooperativeEdit.changeCollaborationSize.forEach((function (e) { e.id == s && (e.v = u.v[0], e.i = d) })) : ga.cooperativeEdit.changeCollaborationSize.push({ id: s, v: u.v[0], i: d }), "array" != Cm(h) && "object" !== Cm(h) && (h = JSON.parse(h)); var m = 0, p = 0; if (d == ga.currentSheetIndex ? "object" === Cm(h) && "enterEdit" === h.op ? (m = h.range[h.range.length - 1].row[0], p = h.range[h.range.length - 1].column[0], e.multipleRangeShow(s, c, m, p, h.op)) : (m = h[h.length - 1].row[0], p = h[h.length - 1].column[0], e.multipleRangeShow(s, c, m, p)) : "object" === Cm(h) && "enterEdit" === h.op ? (m = h.range[h.range.length - 1].row[0], p = h.range[h.range.length - 1].column[0]) : (m = h[h.length - 1].row[0], p = h[h.length - 1].column[0]), 0 === ga.cooperativeEdit.checkoutData.length && (h.op ? ga.cooperativeEdit.checkoutData.push({ id: s, username: c, r: m, c: p, op: h.op, index: d }) : ga.cooperativeEdit.checkoutData.push({ id: s, username: c, r: m, c: p, index: d })), ga.cooperativeEdit.checkoutData.some((function (e) { return e.id == s })) ? ga.cooperativeEdit.checkoutData.forEach((function (e) { e.id == s && (e.username = c, e.r = m, e.c = p, e.index = d, "enterEdit" === h.op && (e.op = h.op)) })) : "enterEdit" === h.op ? ga.cooperativeEdit.checkoutData.push({ id: s, username: c, r: m, c: p, op: h.op, index: d }) : ga.cooperativeEdit.checkoutData.push({ id: s, username: c, r: m, c: p, index: d }), ga.cooperativeEdit.checkoutData.forEach((function (e) { e.index != ga.currentSheetIndex && ($("#luckysheet-multipleRange-show-" + e.id).hide(), e.op) })), $("#luckysheet-multipleRange-show-" + s)[0]) { var f = $("#luckysheet-multipleRange-show-" + s)[0].offsetHeight - 1; $("#luckysheet-multipleRange-show-" + s + ">.username").css({ bottom: f + "px" }) } } else if (4 == r) for (var g = "" === a.data ? a.data : JSON.parse(a.data), v = 0; v < g.length; v++)e.wsUpdateMsg(item[v]) }, e.websocket.onerror = function () { e.wxErrorCount++, e.wxErrorCount > 3 ? Ao(gn().websocket.refresh) : (Ao(gn().websocket.wait), e.openWebSocket()) }, e.websocket.onclose = function (t) { console.info(gn().websocket.close), 1e3 === t.code ? (clearInterval(e.retryTimer), e.retryTimer = null) : alert(gn().websocket.contact) } } else alert(gn().websocket.support) }, wsUpdateMsg: function (e) { var t = e.t, a = e.i, r = e.v, n = ga.luckysheetfile[_l(a)]; if (!["v", "rv", "cg", "all", "fc", "drc", "arc", "f", "fsc", "fsr", "sh", "c"].includes(t) || null != n) if ("v" == t) { if (null == n.data || 0 == n.data.length) return; var l = e.r, i = e.c; n.data[l][i] = r, a == ga.currentSheetIndex && (ga.flowdata = n.data, rs.webWorkerFlowDataCache(ga.flowdata), null != r && null != r.ps ? Pc.buildPs(l, i, r.ps) : Pc.buildPs(l, i, null), setTimeout((function () { md() }), 1)) } else if ("rv" == t) { if (Object.keys(e.range).length > 0 && (ga.cooperativeEdit.merge_range = e.range, ga.cooperativeEdit.merge_range.v = e.v, Fh()), null == n.data || 0 == n.data.length) return; for (var o = e.range.row[0], s = e.range.row[1], c = e.range.column[0], u = e.range.column[1], d = o; d <= s; d++)for (var h = c; h <= u; h++)n.data[d][h] = r[d - o][h - c]; if (a == ga.currentSheetIndex) { ga.flowdata = n.data, rs.webWorkerFlowDataCache(ga.flowdata); for (var m = o; m <= s; m++)for (var p = c; p <= u; p++)null != r[m - o][p - c] && null != r[m - o][p - c].ps ? Pc.buildPs(m, p, r[m - o][p - c].ps) : Pc.buildPs(m, p, null); setTimeout((function () { md() }), 1) } } else if ("cg" == t) { var f = e.k; if ("borderInfo" == f) n.config.borderInfo = r; else for (var g in f in n.config || (n.config[f] = {}), r) n.config[f][g] = r[g]; a == ga.currentSheetIndex && (ga.config = n.config, "rowlen" != f && "columnlen" != f && "rowhidden" != f || hd(ga.flowdata.length, ga.flowdata[0].length), setTimeout((function () { md() }), 1)) } else if ("all" == t) { var v = e.k; if (n[v] = r, "name" == v) $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + a).find("span.luckysheet-sheets-item-name").html(r); else if ("color" == v) { var y = $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + a); y.find(".luckysheet-sheets-item-color").remove(), null == r && "" == r || y.append('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + r + ';"></div>') } else if ("pivotTable" == v); else if ("frozen" == v) { if (Bc.frozenTofreezen(), a == ga.currentSheetIndex) { var b = gn().freezen; null == n.freezen.horizontal ? ($("#luckysheet-freezen-btn-horizontal").html('<i class="fa fa-list-alt"></i> ' + b.freezenRow), Bc.freezenhorizontaldata = null, $("#luckysheet-freezebar-horizontal").hide()) : Bc.createFreezenHorizontal(n.freezen.horizontal.freezenhorizontaldata, n.freezen.horizontal.top), null == n.freezen.vertical ? ($("#luckysheet-freezen-btn-vertical").html('<i class="fa fa-indent"></i> ' + b.freezenColumn), Bc.freezenverticaldata = null, $("#luckysheet-freezebar-vertical").hide()) : Bc.createFreezenVertical(n.freezen.vertical.freezenverticaldata, n.freezen.vertical.left), Bc.createAssistCanvas() } } else "filter_select" == v ? a == ga.currentSheetIndex && Sc(r) : "filter" == v ? a == ga.currentSheetIndex && Sc(n.filter_select, r) : "luckysheet_conditionformat_save" == v || "luckysheet_alternateformat_save" == v ? a == ga.currentSheetIndex && setTimeout((function () { md() }), 1) : "config" == v ? a == ga.currentSheetIndex && (ga.config = r, hd(ga.flowdata.length, ga.flowdata[0].length)) : "dynamicArray" == v ? a == ga.currentSheetIndex && setTimeout((function () { md() }), 1) : "images" == v ? a == ga.currentSheetIndex && (Rc.images = r, Rc.allImagesShow(), Rc.init()) : "dataVerification" == v ? a == ga.currentSheetIndex && ($c.dataVerification = r, $c.init()) : "hyperlink" == v && a == ga.currentSheetIndex && (rd.hyperlink = r, rd.init()) } else if ("fc" == t) { var k = e.op; e.pos; "object" != Cm(r) && (r = new Function("return " + r)()); var x = r.r, w = r.c, _ = null == n.calcChain ? [] : n.calcChain; if ("add" == k) _.push(r); else if ("del" == k) for (var C = 0; C < _.length; C++)x == _[C].r && w == _[C].c && a == _[C].index && _.splice(C, 1); setTimeout((function () { md() }), 1) } else if ("drc" == t) { if (null == n.data || 0 == n.data.length) return; var T = e.rc, A = r.index, S = r.len, I = r.mc, R = r.borderInfo, q = n.data; if ("r" == T) { n.row -= S, q.splice(A, S); for (var D = [], F = 0; F < q[0].length; F++)D.push(null); for (var E = 0; E < S; E++)q.push(D) } else { n.column -= S; for (var M = [], N = 0; N < S; N++)M.push(null); for (var P = 0; P < q.length; P++)q[P].splice(A, S), q[P] = q[P].concat(M) } for (var z in I) { var L = I[z].r, O = I[z].c; q[L][O].mc = I[z] } n.config.merge = I, n.config.borderInfo = R, a == ga.currentSheetIndex && (ga.flowdata = q, rs.webWorkerFlowDataCache(ga.flowdata), ga.config.merge = I, ga.config.borderInfo = R, setTimeout((function () { md() }), 1)) } else if ("arc" == t) { if (null == n.data || 0 == n.data.length) return; var B = e.rc, V = r.index, H = r.len, U = r.data, j = r.direction, G = r.mc, W = r.borderInfo, Y = $.extend(!0, [], n.data); if ("r" == B) { n.row += H; for (var X = [], K = 0; K < Y[0].length; K++)X.push(null); for (var Z = [], Q = 0; Q < H; Q++)null == U[Q] ? Z.push(JSON.stringify(X)) : Z.push(JSON.stringify(U[Q])); "lefttop" == j ? 0 == V ? new Function("data", "return data.unshift(" + Z.join(",") + ")")(Y) : new Function("data", "return data.splice(" + V + ", 0, " + Z.join(",") + ")")(Y) : new Function("data", "return data.splice(" + (V + 1) + ", 0, " + Z.join(",") + ")")(Y) } else { n.column += H; for (var J = 0; J < Y.length; J++)Y[J].splice(V, 0, U[J]) } for (var ee in G) { var te = G[ee].r, ae = G[ee].c; Y[te][ae].mc = G[ee] } n.data = Y, n.config.merge = G, n.config.borderInfo = W, a == ga.currentSheetIndex && (ga.flowdata = Y, rs.webWorkerFlowDataCache(ga.flowdata), ga.config.merge = G, ga.config.borderInfo = W, setTimeout((function () { md() }), 1)) } else if ("f" == t) { var re = e.op, ne = e.pos, le = n.filter; null == le && (le = {}), "upOrAdd" == re ? le[ne] = r : "del" == re && delete le[ne], a == ga.currentSheetIndex && Sc(n.filter_select, le) } else if ("fsc" == t) n.filter = null, n.filter_select = null, a == ga.currentSheetIndex && ($("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex + ", #luckysheet-filter-options-sheet" + ga.currentSheetIndex).remove(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide()); else if ("fsr" == t) n.filter = r.filter, n.filter_select = r.filter_select, a == ga.currentSheetIndex && Sc(n.filter_select, n.filter); else if ("sha" == t) { ga.luckysheetfile.push(r); var ie = ""; null != r.color && (ie = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + r.color + ';"></div>'), $("#luckysheet-sheet-container-c").append(_m(yn, { index: r.index, active: "", name: r.name, style: "", colorset: ie })), $("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + r.index + '" class="luckysheet-datavisual-selection-set"></div>') } else if ("shc" == t) { var oe = r.copyindex, se = r.name, ce = _l(oe), ue = $.extend(!0, {}, ga.luckysheetfile[ce]); ue.index = a, ue.name = se, ga.luckysheetfile.splice(ce + 1, 0, ue); var de = $("#luckysheet-sheets-item" + oe); $("#luckysheet-sheet-container-c").append(_m(yn, { index: ue.index, active: "", name: ue.name, style: "", colorset: "" })), $("#luckysheet-sheets-item" + ue.index).insertAfter(de), $("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + ue.index + '" class="luckysheet-datavisual-selection-set"></div>') } else if ("shd" == t) { for (var he = 0; he < ga.luckysheetfile.length; he++)if (ga.luckysheetfile[he].index == r.deleIndex) { if (ga.currentSheetIndex === r.deleIndex) { var me = r.deleIndex; ga.luckysheetfile[Sh.getSheetIndex(me)].hide = 1; var pe = $("#luckysheet-sheets-item" + me); pe.hide(), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"); var fe = pe.nextAll(":visible"); fe = pe.nextAll(":visible").length > 0 ? fe.eq(0).data("index") : pe.prevAll(":visible").eq(0).data("index"), $("#luckysheet-sheets-item" + fe).addClass("luckysheet-sheets-item-active"), Sh.changeSheetExec(fe) } pd.sheetDeleSave.push(ga.luckysheetfile[he]), ga.luckysheetfile.splice(he, 1); break } $("#luckysheet-sheets-item" + r.deleIndex).remove(), $("#luckysheet-datavisual-selection-set-" + r.deleIndex).remove() } else if ("shr" == t) for (var ge in r) ga.luckysheetfile[_l(ge)].order = r[ge]; else if ("shre" == t) { for (var ve = 0; ve < pd.sheetDeleSave.length; ve++)if (pd.sheetDeleSave[ve].index == r.reIndex) { var ye = pd.sheetDeleSave[ve]; ga.luckysheetfile.push(ye); var be = ""; null != r.color && (be = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ye.color + ';"></div>'), $("#luckysheet-sheet-container-c").append(_m(yn, { index: ye.index, active: "", name: ye.name, style: "", colorset: be })), $("#luckysheet-cell-main").append('<div id="luckysheet-datavisual-selection-set-' + ye.index + '" class="luckysheet-datavisual-selection-set"></div>'); break } } else if ("sh" == t) { var ke = e.op, xe = e.cur; "hide" == ke ? (n.hide = 1, $("#luckysheet-sheets-item" + a).hide(), a == ga.currentSheetIndex && ($("#luckysheet-sheets-item" + xe).addClass("luckysheet-sheets-item-active"), Sh.changeSheetExec(xe))) : "show" == ke && (n.hide = 0, $("#luckysheet-sheets-item" + a).show()) } else if ("c" == t) { var we = e.op, _e = e.cid; if ("add" == we) n.chart.push(r), luckysheet.insertChartTosheet(r.sheetIndex, r.dataSheetIndex, r.option, r.chartType, r.selfOption, r.defaultOption, r.row, r.column, r.chart_selection_color, r.chart_id, r.chart_selection_id, r.chartStyle, r.rangeConfigCheck, r.rangeRowCheck, r.rangeColCheck, r.chartMarkConfig, r.chartTitleConfig, r.winWidth, r.winHeight, r.scrollLeft1, r.scrollTop1, r.chartTheme, r.myWidth, r.myHeight, r.myLeft, r.myTop, r.myindexrank1, !0); else if ("xy" == we || "wh" == we || "update" == we) for (var Ce = 0; Ce < n.chart.length; Ce++) { var Te = n.chart[Ce]; if (Te.chart_id == _e) { for (var Ae in Te) for (var Se in r) Ae == Se && (Te[Ae] = r[Se]); return void Sh.saveChart(Te) } } else if ("del" == we) for (var Ie = 0; Ie < n.chart.length; Ie++) { if (n.chart[Ie].chart_id == _e) return n.chart.splice(Ie, 1), $("#" + _e).remove(), void Sh.delChart($("#" + _e).attr("chart_id"), $("#" + _e).attr("sheetIndex")) } } else "na" == t && $("#luckysheet_info_detail_input").val(r).css("width", 10 * Rm(r)) }, multipleIndex: 0, multipleRangeShow: function (e, t, a, r, n) { var l = ga.visibledatarow[a], i = a - 1 == -1 ? 0 : ga.visibledatarow[a - 1], o = ga.visibledatacolumn[r], s = r - 1 == -1 ? 0 : ga.visibledatacolumn[r - 1], c = xm.mergeborer(ga.flowdata, a, r); if (c && (l = c.row[1], i = c.row[0], o = c.column[1], s = c.column[0]), Rm(t) > 16 && (t = Rm(t, 16) + "..."), "enterEdit" === n && (t += " " + gn().edit.typing), $("#luckysheet-multipleRange-show-" + e).length > 0) $("#luckysheet-multipleRange-show-" + e).css({ position: "absolute", left: s - 1, width: o - s - 1, top: i - 1, height: l - i - 1 }), $("#luckysheet-multipleRange-show-" + e + " .username").text(t), $("#luckysheet-multipleRange-show-" + e + " .username").show(), null != ga.cooperativeEdit.usernameTimeout["user" + e] && clearTimeout(ga.cooperativeEdit.usernameTimeout["user" + e]), ga.cooperativeEdit.usernameTimeout["user" + e] = setTimeout((function () { clearTimeout(ga.cooperativeEdit.usernameTimeout["user" + e]), ga.cooperativeEdit.usernameTimeout["user" + e] = null }), 1e4); else { var u = '<div \n\t\t\t\t\t\t\t\tid="luckysheet-multipleRange-show-'.concat(e, '"\n\t\t\t\t\t\t\t\tclass="luckysheet-multipleRange-show"\n\t\t\t\t\t\t\t\tdata-color="').concat(Cn[this.multipleIndex], '" \n\t\t\t\t\t\t\t\ttitle="').concat(t, '" \n\t\t\t\t\t\t\t\tstyle="position: absolute;left: ').concat(s - 1, "px;width: ").concat(o - s - 1, "px;top: ").concat(i - 1, "px;height: ").concat(l - i - 1, "px;border: 1px solid ").concat(Cn[this.multipleIndex], ';z-index: 15;">\n\n\t\t\t\t\t\t\t\t<div class="username" style="height: 19px;line-height:19px;width: max-content;position: absolute;bottom: ').concat(l - i - 1, "px;right: 0;background-color: ").concat(Cn[this.multipleIndex], ';color:#ffffff;padding:0 10px;">\n\t\t\t\t\t\t\t\t').concat(t, '\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div style="width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: ').concat(Cn[this.multipleIndex], '">\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t</div>'); $(u).appendTo($("#luckysheet-cell-main #luckysheet-multipleRange-show")), this.multipleIndex++, null != ga.cooperativeEdit.usernameTimeout["user" + e] && clearTimeout(ga.cooperativeEdit.usernameTimeout["user" + e]), ga.cooperativeEdit.usernameTimeout["user" + e] = setTimeout((function () { clearTimeout(ga.cooperativeEdit.usernameTimeout["user" + e]), ga.cooperativeEdit.usernameTimeout["user" + e] = null }), 1e4) } }, sheetDeleSave: [], submitInterval: 1e3, imagesubmitInterval: 5e3, submitdatalimit: 50, submitcompresslimit: 1e3, checksubmit: function (e) { var t = this; t.submitTimeout(), clearTimeout(t.imageRequestTimeout), t.imageRequestTimeout = setTimeout((function () { t.imageRequest() }), t.imagesubmitInterval) }, submitTimeout: function () { var e = this; clearTimeout(e.requestTimeOut), !e.requestLock && null != e.requestlast && e.requestlast.clone().add(1, "seconds").isBefore(us()) && e.request(), e.requestTimeOut = setTimeout((function () { e.submitTimeout() }), e.submitInterval) }, requestLock: !1, requestlast: null, firstchange: !0, requestTimeOut: null, request: function () { var e = this; this.gridKey; e.cachelocaldata((function (t, a) { if (0 != a.length) { (a = encodeURIComponent(JSON.stringify(a))).length; e.requestLock = !0, "" != e.updateUrl && $.post(e.updateUrl, { compress: !1, gridKey: e.gridKey, data: a }, (function (t) { new Function("return " + t)().status ? ($("#luckysheet_info_detail_update").html("最近存档时间:" + us().format("M-D H:m:s")), $("#luckysheet_info_detail_save").html("同步成功"), e.clearcachelocaldata()) : ($("#luckysheet_info_detail_save").html("<span style='color:#ff2121'>同步失败</span>"), e.restorecachelocaldata()), e.requestlast = us(), e.requestLock = !1 })) } })) }, imageRequestLast: null, imageRequestLock: !1, imageRequestTimeout: null, imageRequest: function () { var e = this; html2canvas($("#" + container).find(".luckysheet-grid-window").get(0), { onrendered: function (t) { var a = $(t).appendTo("body"); a.hide(); var r = a.width(), n = a.height(), l = a.get(0).getContext("2d").getImageData(0, 0, r, n), i = r, o = n; .54 * i > o ? i = o / .54 : o = .54 * i; var s = $("<canvas>").attr("width", i).attr("height", o)[0]; s.getContext("2d").putImageData(l, 0, 0), a.attr("width", 350), a.attr("height", 189), a.get(0).getContext("2d").drawImage(s, 0, 0, 350, 189); var c = a.get(0).toDataURL("image/jpeg", .9), u = luckysheet.sheetmanage.getCurSheetnoset(); e.imageRequestLock = !0; var d = encodeURIComponent(JSON.stringify({ t: "thumb", img: c, curindex: u })); a.remove(), "" != e.updateImageUrl && $.post(e.updateImageUrl, { compress: !1, gridKey: e.gridKey, data: d }, (function (t) { new Function("return " + t)().status ? imageRequestLast = us() : $("#luckysheet_info_detail_save").html("<span style='color:#ff2121'>网络不稳定</span>"), e.imageRequestLock = !0 })) } }) }, localdata: [], matchOpt: function (e, t) { for (var a in e) { if ("t" == a && e.t in { drc: 1, arc: 1, sha: 1, shc: 1, shd: 1 }) return !1; if ("v" != a) { if (!(a in t)) return !1; if (t[a] != e[a]) return !1 } } return !0 }, deleteRepeatOpt: function (e, t) { var a = e; if (t instanceof Array) for (var r = 0; r < t.length; r++)for (var n = t[r], l = 0; l < a.length; l++) { var i = e[r]; this.matchOpt(n, i) && delete a[l] } else for (var o = 0; o < a.length; o++) { var s = a[o]; this.matchOpt(t, s) && delete a[o] } for (var c = [], u = 0; u < a.length; u++)null != a[u] && c.push(a[u]); return c }, setlocaldata: function (e, t) { this.gridKey; var a = this; a.getlocaldata((function (r) { null == r && (r = []), e instanceof Array ? r = r.concat(e) : r.push(e), a.localdata = r, t(a.localdata) })) }, getlocaldata: function (e) { this.gridKey; e(this.localdata) }, clearlocaldata: function (e) { this.gridKey; this.localdata = [], e() }, cachelocaldata: function (e) { var t = this.gridKey + "__qkcache", a = this.localdata, r = a.length; if (r > 1) { var n = []; n[0] = a[0]; for (var l = 1; l < r; l++) { for (var i = a[l], o = !0, s = 0; s < n.length; s++) { var c = n[s]; if (this.matchOpt(i, c)) { n.splice(s, 1, i), o = !1; break } } o && (n = n.concat(i)) } a = n } null != a && 0 != a.length && this.clearlocaldata((function () { localforage.setItem(t, a).then((function () { e(t, a) })) })) }, clearcachelocaldata: function (e) { var t = this.gridKey + "__qkcache"; localforage.removeItem(t, (function (t, a) { e && "function" == typeof e && e() })) }, restorecachelocaldata: function (e) { var t = this.gridKey + "__qkcache", a = this; localforage.getItem(t).then((function (t) { var r = t; a.getlocaldata((function (t) { null == t && (t = []); var n = r.concat(t); a.localdata = n, e instanceof Function && e(a.localdata) })) })) }, keepHighLightBox: function () { ga.cooperativeEdit.checkoutData.forEach((function (e) { e.index == ga.currentSheetIndex && ("enterEdit" === e.op ? pd.multipleRangeShow(e.id, e.username, e.r, e.c, e.op) : pd.multipleRangeShow(e.id, e.username, e.r, e.c)) })) } }, fd = { info: function (e, t) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-info").remove(); var a = gn().button; $("body").append(_m(bn, { id: "luckysheet-info", addclass: "", title: e, content: t, botton: '<button class="btn btn-default luckysheet-model-close-btn">&nbsp;&nbsp;' + a.close + "&nbsp;&nbsp;</button>", style: "z-index:100003" })); var r = $("#luckysheet-info").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-info").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show() }, confirm: function (e, t, a, r, n, l) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-confirm").remove(); var i = gn().button; null == n && (n = i.confirm), null == l && (l = i.cancel), $("body").append(_m(bn, { id: "luckysheet-confirm", addclass: "", style: "z-index:100003", title: e, content: t, botton: '<button class="btn btn-primary luckysheet-model-conform-btn">&nbsp;&nbsp;' + n + '&nbsp;&nbsp;</button><button class="btn btn-default luckysheet-model-cancel-btn">&nbsp;&nbsp;' + l + "&nbsp;&nbsp;</button>" })); var o = $("#luckysheet-confirm").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), s = o.outerHeight(), c = o.outerWidth(), u = $(window).width(), d = $(window).height(), h = $(document).scrollLeft(), m = $(document).scrollTop(); $("#luckysheet-confirm").css({ left: (u + h - c) / 2, top: (d + m - s) / 3 }).show(), o.find(".luckysheet-model-conform-btn").click((function () { "function" == typeof a && a(), pd.keepHighLightBox(), $("#luckysheet-confirm").hide(), $("#luckysheet-modal-dialog-mask").hide() })), o.find(".luckysheet-model-cancel-btn").click((function () { "function" == typeof r && r(), $("#luckysheet-confirm").hide(), $("#luckysheet-modal-dialog-mask").hide() })) }, screenshot: function (e, t, a) { var r = gn().screenshot; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-confirm").remove(), $("body").append(_m(bn, { id: "luckysheet-confirm", addclass: "", style: "z-index:100003", title: e, content: t, botton: '<a style="text-decoration:none;color:#fff;" class="download btn btn-primary luckysheet-model-conform-btn">&nbsp;&nbsp;' + r.downLoadBtn + '&nbsp;&nbsp;</a>&nbsp;&nbsp;<button class="btn btn-primary luckysheet-model-copy-btn">&nbsp;&nbsp;' + r.downLoadCopy + '&nbsp;&nbsp;</button><button class="btn btn-default luckysheet-model-cancel-btn">&nbsp;&nbsp;' + r.downLoadClose + "&nbsp;&nbsp;</button>" })); var n = $("#luckysheet-confirm").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-confirm").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show(), n.find(".luckysheet-model-conform-btn").click((function () { "1" == Ml.isIE() ? alert(r.browserNotTip) : (window.ActiveXObject || "ActiveXObject" in window) && (0 === $("#IframeReportImg").length && $('<iframe style="display:none;" id="IframeReportImg" name="IframeReportImg" onload="downloadImg();" width="0" height="0" src="about:blank"></iframe>').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", "<img src='" + a + "'>"), "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: '<div class="luckysheet-chart-point-config"> <div class="luckysheet-chart-point-config-set"> <div class="luckysheet-chart-point-config-left"> <div class="luckysheet-chart-point-config-left-top"> <div class="luckysheet-chart-point-searchcondition"> <div class="luckysheet-datavisual-content-row" style="margin-bottom: 0px;margin-top: 0px;height: 30px;"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">选择维度</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-tips="维度选择" name="luckysheetpointconfigsearchdim" id="luckysheetpointconfigsearchdim"> </select> </div> </div> <div class="luckysheet-datavisual-content-row" style="margin-bottom: 0px;margin-top: 3px;height: 30px;"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;">排序</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <label data-tips="无排序" for="luckysheetpointconfigsearchorderno">无排序</label> <input type="radio" checked="checked" value="0" name="luckysheetpointconfigsearchorder" id="luckysheetpointconfigsearchorderno"> <label data-tips="升序" for="luckysheetpointconfigsearchorderasc">升序</label> <input type="radio" value="1" name="luckysheetpointconfigsearchorder" id="luckysheetpointconfigsearchorderasc"> <label data-tips="降序" for="luckysheetpointconfigsearchorderdesc">降序</label> <input type="radio" value="2" name="luckysheetpointconfigsearchorder" id="luckysheetpointconfigsearchorderdesc"> </div> </div> <div class="luckysheet-datavisual-content-row" style="margin-bottom: 0px;margin-top: 5px;height: 30px;"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:90%;text-align: left;"> <select data-width="70" data-tips="按照什么方式查询" name="luckysheetpointconfigsearchtype" id="luckysheetpointconfigsearchtype"> <option value="0" selected="selected">按照名称</option> <option value="1">按排序前%</option> </select> <input data-tips="查询关于点的关键字" id="luckysheetpointconfigsearchcontent" type="text" class="luckysheet-datavisual-config-input-no" style="width:40%;" placeholder="查询内容" /> <button id="luckysheetpointconfigsearchcomfirm" class="btn btn-primary luckysheet-model-conform-btn">查询</button> </div> </div> </div> </div> <div class="luckysheet-chart-point-config-left-mid"> <span id="luckysheet-chart-point-btn-all" class="luckysheet-mousedown-cancel">全选</span> - <span id="luckysheet-chart-point-btn-clear" class="luckysheet-mousedown-cancel">清除</span> - <span id="luckysheet-chart-point-btn-contra" class="luckysheet-mousedown-cancel">反选</span><span style="text-decoration:none;color:#8D8D8D;float:right;margin-right:40px;cursor:default;" class="luckysheet-mousedown-cancel">可以直接框选数据点</span> </div> <div class="luckysheet-chart-point-config-left-bottom"> <div class="luckysheet-chart-point-searchitem-c luckysheet-noselected-text"> </div> </div> </div> <div class="luckysheet-chart-point-config-right"> <div class="luckysheet-chart-point-itemconfig"> <div class="luckysheet-datavisual-content-row" style="font-size: 16px;font-weight: bold;"> 数据点设置 </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">图形颜色</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <input data-tips="颜色" class="luckysheet-datavisual-config-colorOpacity" id="scattersingleitemstylecolor" type="text" data-bigclass="scattersingle" data-attr="itemstyle" data-func="color" /> </div> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">图形大小</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-sliderdiy="scattersingleallsymbolsizeslider" data-tips="点大小设置" name="scattersingleallsymbolsize" id="scattersingleallsymbolsize" data-width="50" data-bigclass="scattersingle" data-attr="all" data-func="symbolsize"> <option value="4" selected="selected">4px</option> <option value="6">6px</option> <option value="8">8px</option> <option value="10">10px</option> <option value="12">12px</option> <option value="14">14px</option> <option value="16">16px</option> <option value="diy">自定义</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row" style="display:none;"> <div data-tips="滑动修改点大小" id="scattersingleallsymbolsizeslider" data-bigclass="scattersingle" data-attr="all" data-func="symbolsize" class="luckysheet-datavisual-config-slider" style="width:70%;" data-min="1" data-max="50" data-step="1"></div> <input data-tips="自定义点大小" data-sliderid="scattersingleallsymbolsizeslider" id="scattersingleallsymbolsizesliderdiy" type="text" class="luckysheet-datavisual-config-input" data-bigclass="scattersingle" data-attr="all" data-func="symbolsize" placeholder="请输入" style="width:10%;margin-left:10px;text-align:center;margin-right: 2px;" /><label for="scattersingleallsymbolsizesliderdiy">px</label> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">图形形状</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-tips="点类型设置" data-width="70" name="scattersingleallsymboltype" id="scattersingleallsymboltype" data-bigclass="scattersingle" data-attr="all" data-func="symboltype"> <option value="emptyCircle" selected="selected">空心圆</option> <option value="circle">圆形</option> <option value="emptyRectangle">空心矩形</option> <option value="rect">矩形</option> <option value="roundRect">圆角矩形</option> <option value="emptyTriangle">空心三角</option> <option value="triangle">三角形</option> <option value="emptyDiamond">空心菱形</option> <option value="diamond">菱形</option> <option value="droplet">水滴</option> <option value="pin">标注</option> <option value="arrow">箭头</option> <option value="heart">心形</option> <option value="star">星星</option> </select> </div> </div> <div class="luckysheet-datavisual-content-rowsplit-sub"></div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">边框粗细</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-sliderdiy="scattersingleitemstyleborderwidthslider" data-tips="点边框粗细" name="scattersingleitemstyleborderwidth" id="scattersingleitemstyleborderwidth" data-width="50" data-bigclass="scattersingle" data-attr="itemstyle" data-func="borderwidth"><option value="0" selected="selected">无</option> <option value="1">1px</option> <option value="2">2px</option> <option value="3">3px</option> <option value="4">4px</option> <option value="5">5px</option> <option value="6">6px</option> <option value="7">7px</option> <option value="8">8px</option> <option value="diy">自定义</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row" style="display:none;"> <div data-tips="滑动修改边框粗细" id="scattersingleitemstyleborderwidthslider" data-bigclass="scattersingle" data-attr="itemstyle" data-func="borderwidth" class="luckysheet-datavisual-config-slider" style="width:70%;" data-min="12" data-max="100" data-step="1"></div> <input data-tips="自定义边框粗细" data-sliderid="scattersingleitemstyleborderwidthslider" id="scattersingleitemstyleborderwidthsliderdiy" type="text" class="luckysheet-datavisual-config-input" data-bigclass="scattersingle" data-attr="itemstyle" data-func="borderwidth" placeholder="请输入" style="width:10%;margin-left:10px;text-align:center;margin-right: 2px;" /><label for="scattersingleitemstyleborderwidthsliderdiy">%</label> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">边框样式</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-tips="点边框类型设置" data-width="50" name="scattersingleitemstyleborderlinetype" id="scattersingleitemstyleborderlinetype" data-bigclass="scattersingle" data-attr="itemstyle" data-func="borderlinetype"> <option value="solid" selected="selected">实线</option> <option value="dashed">虚线</option> <option value="dotted">点线</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">边框颜色</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <input data-tips="点边框颜色" class="luckysheet-datavisual-config-colorOpacity" id="scattersingleitemstyleborderlinecolor" type="text" data-bigclass="scattersingle" data-attr="itemstyle" data-func="borderlinecolor" /> </div> </div> <div class="luckysheet-datavisual-content-rowsplit-sub"></div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;"><i class="fa fa-th-large" aria-hidden="true"></i> 文字标签</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <label data-tips="显示数据点的标签" data-bigclass="scattersingle" data-attr="label" data-func="labelshow" for="scattersinglelabellabelshow">显示</label> <input type="radio" checked="checked" value="1" name="scattersinglelabellabelshow" id="scattersinglelabellabelshow" data-bigclass="scattersingle" data-attr="label" data-func="labelshow"> <label data-tips="隐藏数据点的标签" data-bigclass="scattersingle" data-attr="label" data-func="labelshow" for="scattersinglelabellabelshow1">隐藏</label> <input type="radio" value="0" name="scattersinglelabellabelshow" id="scattersinglelabellabelshow1" data-bigclass="scattersingle" data-attr="label" data-func="labelshow"> </div> </div> <div class="luckysheet-datavisual-content-row" style="height:auto;line-height: initial;margin-left:auto;" showfor="scattersinglelabellabelshow1" hidefor="scattersinglelabellabelshow"> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:40%;">数值比例</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:50%;"> <select data-tips="刻度数值放大比例" name="scattersinglelabelformatratio" id="scattersinglelabelformatratio" data-bigclass="scattersingle" data-attr="label" data-func="formatratio"> <option value="0.01">乘以100</option> <option value="0.1">乘以10</option> <option value="1" selected="selected">默认</option> <option value="10">除以10</option> <option value="100">除以100</option> <option value="1000">除以1000</option> <option value="10000">除以1万</option> <option value="100000">除以10万</option> <option value="1000000">除以一百万</option> <option value="10000000">除以一千万</option> <option value="100000000">除以一亿</option> <option value="1000000000">除以十亿</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:40%;white-space: nowrap;">小数位数</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:50%;"> <select data-tips="数值小数点位数" name="scattersinglelabelfloatlen" id="scattersinglelabelfloatlen" data-bigclass="scattersingle" data-attr="label" data-func="floatlen"> <option value="auto" selected="selected">自动显示</option> <option value="0">整数</option> <option value="1">1位小数</option> <option value="2">2位小数</option> <option value="3">3位小数</option> <option value="4">4位小数</option> <option value="5">5位小数</option> <option value="6">6位小数</option> <option value="7">7位小数</option> <option value="8">8位小数</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row"> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:20%;">标签格式</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:70%;"> <select data-sliderdiy="scattersinglelabelcontentformatslider" data-tips="标签显示格式" name="scattersinglelabelcontentformat" id="scattersinglelabelcontentformat" data-bigclass="scattersingle" data-attr="label" data-func="contentformat"> <option value="default" selected="selected">默认</option> <option value="1">仅数据名</option> <option value="2">数据名+2维数值</option> <option value="5">数据名+全部数值</option> <option value="diy">自定义</option> </select> </div> </div> <div style="display:none;"> <div class="luckysheet-datavisual-content-row" id="scattersinglelabelcontentformatslider"> <div style="text-align:center; width:60px; display:inline-block;">数据名称</div> <label data-tips="是否显示数据名" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelshow" for="scattersinglelabeldatalabelshow" style="font-weight:bold;"><i class="fa fa-eye" aria-hidden="true"></i></label> <input type="checkbox" checked="checked" name="scattersinglelabeldatalabelshow" id="scattersinglelabeldatalabelshow" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelshow"> <input data-tips="显示在数据名前部文字" placeholder="前缀" id="scattersinglelabeldatalabelprefix" type="text" class="luckysheet-datavisual-config-input" style="width:60px;height:19px;" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelprefix" /> <input data-tips="显示在数据名尾部文字" placeholder="后缀" id="scattersinglelabeldatalabelsuffix" type="text" class="luckysheet-datavisual-config-input" style="width:60px;height:19px;" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelsuffix" /> <label data-tips="是否在数据名后换行" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelline" for="scattersinglelabeldatalabelline" style="font-weight:bold;">换行</label> <input type="checkbox" checked="checked" name="scattersinglelabeldatalabelline" id="scattersinglelabeldatalabelline" data-bigclass="scattersingle" data-attr="label" data-func="scattersingledatalabelline"> </div> </div> <div class="luckysheet-datavisual-content-row" > <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x" style="width:10%;white-space:nowrap;">标签位置</div> <div class="luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x" style="width:80%;"> <select data-sliderdiy="scattersinglelabellabelplaceslider" data-tips="标签距离图形位置" data-width="70" name="scattersinglelabellabelplace" id="scattersinglelabellabelplace" data-bigclass="scattersingle" data-attr="label" data-func="labelplace"> <option value="top" selected="selected">顶端</option> <option value="left">左侧</option> <option value="right">右侧</option> <option value="bottom">底部</option> <option value="inside">内部居中</option> <option value="diy">自定义</option> <option value="insideLeft">内部左侧</option> <option value="insideRight">内部右侧</option> <option value="insideTop">内部顶端</option> <option value="insideBottom">内部底端</option> <option value="insideTopLeft">内部左上</option> <option value="insideBottomLeft">内部左下</option> <option value="insideTopRight">内部右上</option> <option value="insideBottomRight">内部右下</option> </select> </div> </div> <div class="luckysheet-datavisual-content-row" style="display:none;height:65px;"> <div data-tips="滑动修改点文本水平位置" id="scattersinglelabellabelplaceslider" data-bigclass="scattersingle" data-attr="label" data-func="labelplacediy" class="luckysheet-datavisual-config-slider" style="width:70%;" data-min="-100" data-max="100" data-step="1"></div> <input data-tips="自定义点文本水平位置" data-sliderid="scattersinglelabellabelplaceslider" id="scattersinglelabellabelplacesliderdiy" type="text" class="luckysheet-datavisual-config-input" data-bigclass="scattersingle" data-attr="label" data-func="labelplacediy" placeholder="请输入" style="width:10%;margin-left:10px;text-align:center;margin-right: 2px;" /><label for="scattersinglelabellabelplacesliderdiy">px</label> <br /> <div data-tips="滑动修改点文本垂直位置" id="scattersinglelabellabelplaceslider1" data-bigclass="scattersingle" data-attr="label" data-func="labelplacediy" class="luckysheet-datavisual-config-slider" style="width:70%;" data-min="-100" data-max="100" data-step="1"></div> <input data-tips="自定义点文本垂直位置" data-sliderid="scattersinglelabellabelplaceslider1" id="scattersinglelabellabelplaceslider1diy" type="text" class="luckysheet-datavisual-config-input" data-bigclass="scattersingle" data-attr="label" data-func="labelplacediy" placeholder="请输入" style="width:10%;margin-left:10px;text-align:center;margin-right: 2px;" /><label for="scattersinglelabellabelplaceslider1diy">px</label> </div> <div class="luckysheet-datavisual-content-row"> <label data-tips="加粗" data-bigclass="scattersingle" data-attr="label" data-func="labelbold" for="scattersinglelabellabelbold" style="font-weight:bold;"><i class="fa fa-bold" aria-hidden="true"></i></label> <input type="checkbox" name="scattersinglelabellabelbold" id="scattersinglelabellabelbold" data-bigclass="scattersingle" data-attr="label" data-func="labelbold"> <label data-tips="斜体" data-bigclass="scattersingle" data-attr="label" data-func="labelitalic" for="scattersinglelabellabelitalic" class="luckysheet-datavisual-content-column-italic"><i class="fa fa-italic" aria-hidden="true"></i></label> <input type="checkbox" name="scattersinglelabellabelitalic" id="scattersinglelabellabelitalic" data-bigclass="scattersingle" data-attr="label" data-func="labelitalic"> <select data-sliderdiy="scattersinglelabellabelfontsizeslider" data-width="50" data-tips="字体大小" name="scattersinglelabellabelfontsize" id="scattersinglelabellabelfontsize" data-bigclass="scattersingle" data-attr="label" data-func="labelfontsize"> <option value="12">12px</option> <option value="14">14px</option> <option value="16">16px</option> <option value="18">18px</option> <option value="20">20px</option> <option value="22">22px</option> <option value="24">24px</option> <option value="30">30px</option> <option value="36">36px</option> <option value="diy">自定义</option> </select> <input data-tips="字体颜色" class="luckysheet-datavisual-config-color" id="scattersinglelinelabelcolor" type="text" data-bigclass="scattersingle" data-attr="label" data-func="labelcolor" /> </div> <div class="luckysheet-datavisual-content-row" style="display:none;"> <div data-tips="滑动修改字体大小" id="scattersinglelabellabelfontsizeslider" data-bigclass="scattersingle" data-attr="label" data-func="labelfontsize" class="luckysheet-datavisual-config-slider" style="width:70%;" data-min="12" data-max="100" data-step="1"></div> <input data-tips="自定义字体大小" data-sliderid="scattersinglelabellabelfontsizeslider" id="scattersinglelabellabelfontsizesliderdiy" type="text" class="luckysheet-datavisual-config-input" data-bigclass="scattersingle" data-attr="label" data-func="labelfontsize" placeholder="请输入" style="width:10%;margin-left:10px;text-align:center;margin-right: 2px;" /><label for="scattersinglelabellabelfontsizesliderdiy">px</label> </div> </div> </div> </div> </div> <div class="luckysheet-chart-point-config-chart"> <div id="luckysheet-chart-point-config-chart-c" class="luckysheet-chart-point-config-chart-c"> </div> </div> </div>', botton: '<button class="btn btn-danger luckysheet-model-save-btn">&nbsp;&nbsp;保存设置&nbsp;&nbsp;</button><button class="btn btn-default luckysheet-model-close-btn">&nbsp;&nbsp;取消&nbsp;&nbsp;</button>', 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('<div id="luckysheet-tooltip-up" class="jfk-tooltip" role="tooltip" aria-hidden="true" style="left: 505px; top: 410px;"><div class="jfk-tooltip-contentId">组合图表</div><div class="jfk-tooltip-arrow jfk-tooltip-arrowup" style="left: 35.5px;"><div class="jfk-tooltip-arrowimplbefore"></div><div class="jfk-tooltip-arrowimplafter"></div></div></div>'), 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 = '<div id="luckysheetpopover" class="luckysheetpopover"><div class="luckysheetpopover-content">' + s.start + '</div><div class="luckysheetpopover-btn">' + n + "</div></div>"; $("#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 '<div class="ruleTypeBox">\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>'.concat(e.ruleTypeItem1, '</span>\n </div>\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>').concat(e.ruleTypeItem2, '</span>\n </div>\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>').concat(e.ruleTypeItem3, '</span>\n </div>\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>').concat(e.ruleTypeItem4, '</span>\n </div>\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>').concat(e.ruleTypeItem5, '</span>\n </div>\n <div class="ruleTypeItem">\n <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>\n <span>').concat(e.ruleTypeItem6, "</span>\n </div>\n </div>") }, textCellColorHtml: function () { var e = gn().conditionformat; return '<div id="textCellColor">\n <div class="colorbox">\n <input id="checkTextColor" type="checkbox" checked="checked">\n <label for="checkTextColor">'.concat(e.textColor, '</label>\n <input id="textcolorshow" data-tips="').concat(e.textColor, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#9c0006" style="display: none;">\n </div>\n <div class="colorbox">\n <input id="checkCellColor" type="checkbox" checked="checked">\n <label for="checkCellColor">').concat(e.cellColor, '</label>\n <input id="cellcolorshow" data-tips="').concat(e.cellColor, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#ffc7ce" style="display: none;">\n </div>\n </div>') }, 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: '<input readonly="readonly" placeholder="'.concat(a.pleaseSelectCell, '" value="').concat(t, '"/>'), botton: '<button id="luckysheet-singleRange-dialog-confirm" class="btn btn-primary" data-source="'.concat(e, '">').concat(a.confirm, '</button>\n <button id="luckysheet-singleRange-dialog-close" class="btn btn-default" data-source="').concat(e, '">').concat(a.cancel, "</button>"), 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: '<input readonly="readonly" placeholder="'.concat(a.pleaseSelectRange, '" value="').concat(t, '"/>'), botton: '<button id="luckysheet-multiRange-dialog-confirm" class="btn btn-primary" data-item="'.concat(e, '">').concat(a.confirm, '</button>\n <button id="luckysheet-multiRange-dialog-close" class="btn btn-default">').concat(a.cancel, "</button>"), 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: '<button id="luckysheet-conditionformat-dialog-confirm" class="btn btn-primary">'.concat(a.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(a.cancel, "</button>"), 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 = '<div class="box">\n <div style="margin-bottom: 10px;">'.concat(e.pleaseSelectIcon, '</div>\n <div class="title">').concat(e.direction, '</div>\n <div class="list">\n <div class="left">\n <div class="item" data-len="3" data-leftMin="0" data-top="0" title="').concat(e.threeWayArrow, "(").concat(e.multicolor, ')"><div style="background-position:0 0;"></div></div>\n <div class="item" data-len="3" data-leftMin="0" data-top="1" title="').concat(e.threeTriangles, '"><div style="background-position:0 -20px;"></div></div>\n <div class="item" data-len="4" data-leftMin="0" data-top="2" title="').concat(e.fourWayArrow, "(").concat(e.multicolor, ')"><div style="background-position:0 -40px;"></div></div>\n <div class="item" data-len="5" data-leftMin="0" data-top="3" title="').concat(e.fiveWayArrow, "(").concat(e.multicolor, ')"><div style="background-position:0 -60px;"></div></div>\n </div>\n <div class="right">\n <div class="item" data-len="3" data-leftMin="5" data-top="0" title="').concat(e.threeWayArrow, "(").concat(e.grayColor, ')"><div style="background-position:-131px 0;"></div></div>\n <div class="item" data-len="4" data-leftMin="5" data-top="1" title="').concat(e.fourWayArrow, "(").concat(e.grayColor, ')"><div style="background-position:-131px -20px;"></div></div>\n <div class="item" data-len="5" data-leftMin="5" data-top="2" title="').concat(e.fiveWayArrow, "(").concat(e.grayColor, ')"><div style="background-position:-131px -40px;"></div></div>\n </div>\n <div style="clear:both;"></div>\n </div>\n <div class="title">').concat(e.shape, '</div>\n <div class="list">\n <div class="left">\n <div class="item" data-len="3" data-leftMin="0" data-top="4" title="').concat(e.threeColorTrafficLight, "(").concat(e.rimless, ')"><div style="background-position:0 -80px;"></div></div>\n <div class="item" data-len="3" data-leftMin="0" data-top="5" title="').concat(e.threeSigns, '"><div style="background-position:0 -100px;"></div></div>\n <div class="item" data-len="4" data-leftMin="0" data-top="6" title="').concat(e.greenRedBlackGradient, '"><div style="background-position:0 -120px;"></div></div>\n </div>\n <div class="right">\n <div class="item" data-len="3" data-leftMin="5" data-top="4" title="').concat(e.threeColorTrafficLight, "(").concat(e.bordered, ')"><div style="background-position:-131px -80px;"></div></div>\n <div class="item" data-len="4" data-leftMin="5" data-top="5" title="').concat(e.fourColorTrafficLight, '"><div style="background-position:-131px -100px;"></div></div>\n </div>\n <div style="clear:both;"></div>\n </div>\n <div class="title">').concat(e.mark, '</div>\n <div class="list">\n <div class="left">\n <div class="item" data-len="3" data-leftMin="0" data-top="7" title="').concat(e.threeSymbols, "(").concat(e.circled, ')"><div style="background-position:0 -140px;"></div></div>\n <div class="item" data-len="3" data-leftMin="0" data-top="8" title="').concat(e.tricolorFlag, '"><div style="background-position:0 -160px;"></div></div>\n </div>\n <div class="right">\n <div class="item" data-len="3" data-leftMin="5" data-top="7" title="').concat(e.threeSymbols, "(").concat(e.noCircle, ')"><div style="background-position:-131px -140px;"></div></div>\n </div>\n <div style="clear:both;"></div>\n </div>\n <div class="title">').concat(e.grade, '</div>\n <div class="list">\n <div class="left">\n <div class="item" data-len="3" data-leftMin="0" data-top="9" title="').concat(e.threeStars, '"><div style="background-position:0 -180px;"></div></div>\n <div class="item" data-len="5" data-leftMin="0" data-top="10" title="').concat(e.fiveQuadrantDiagram, '"><div style="background-position:0 -200px;"></div></div>\n <div class="item" data-len="5" data-leftMin="0" data-top="11" title="').concat(e.fiveBoxes, '"><div style="background-position:0 -220px;"></div></div>\n </div>\n <div class="right">\n <div class="item" data-len="4" data-leftMin="5" data-top="9" title="').concat(e.grade4, '"><div style="background-position:-131px -180px;"></div></div>\n <div class="item" data-len="5" data-leftMin="5" data-top="10" title="').concat(e.grade5, '"><div style="background-position:-131px -200px;"></div></div>\n </div>\n <div style="clear:both;"></div>\n </div>\n </div>'); $("body").append(_m(bn, { id: "luckysheet-CFicons-dialog", addclass: "luckysheet-CFicons-dialog", title: e.icons, content: t, botton: '<button class="btn btn-default luckysheet-model-close-btn">'.concat(e.close, "</button>"), 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 += '<option value="'.concat(ga.luckysheetfile[a].index, '" selected="selected">\n ').concat(e.currentSheet, "").concat(ga.luckysheetfile[a].name, "\n </option>") : t += '<option value="'.concat(ga.luckysheetfile[a].index, '">\n ').concat(e.sheet, "").concat(ga.luckysheetfile[a].name, "\n </option>"); var r = '<div class="chooseSheet">\n <label>'.concat(e.showRules, "</label>\n <select>").concat(t, '</select>\n </div>\n <div class="ruleBox">\n <div class="ruleBtn">\n <button id="newConditionRule" class="btn btn-default">').concat(e.newRule, '</button>\n <button id="editorConditionRule" class="btn btn-default">').concat(e.editRule, '</button>\n <button id="deleteConditionRule" class="btn btn-default">').concat(e.deleteRule, '</button>\n </div>\n <div class="ruleList">\n <div class="listTitle">\n <span>').concat(e.rule, "</span>\n <span>").concat(e.format, "</span>\n <span>").concat(e.applyRange, '</span>\n </div>\n <div class="listBox"></div>\n </div>\n </div>'); $("body").append(_m(bn, { id: "luckysheet-administerRule-dialog", addclass: "luckysheet-administerRule-dialog", title: e.conditionformatManageRules, content: r, botton: '<button id="luckysheet-administerRule-dialog-confirm" class="btn btn-primary">'.concat(e.confirm, '</button>\n <button id="luckysheet-administerRule-dialog-close" class="btn btn-default">').concat(e.close, "</button>"), 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 = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>') : "colorGradation" == n ? (o = a.colorGradation, s = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>') : "icons" == n ? (o = a.icons, s = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>') : (o = this.getConditionRuleName(t[r].conditionName, t[r].conditionRange, t[r].conditionValue), null != l.textColor && (s += '<span class="colorbox" title="' + a.textColor + '" style="background-color:' + l.textColor + '"></span>'), null != l.cellColor && (s += '<span class="colorbox" title="' + a.cellColor + '" style="background-color:' + l.cellColor + '"></span>')); 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 = '<div class="item" data-item="' + r + '"><div class="ruleName" title="' + o + '">' + o + '</div><div class="format">' + s + '</div><div class="ruleRange"><input class="formulaInputFocus" readonly="true" value="' + c.join(",") + '"/><i class="fa fa-table" aria-hidden="true" title="' + a.selectRange + '"></i></div></div>'; $("#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 = '<div><div class="boxTitle">' + t.chooseRuleType + "</div>" + this.ruleTypeHtml() + '<div class="boxTitle">' + t.editRuleDescription + '</div><div class="ruleExplainBox">' + a + "</div></div>"; $("body").append(_m(bn, { id: "luckysheet-newConditionRule-dialog", addclass: "luckysheet-newEditorRule-dialog", title: t.newFormatRule, content: r, botton: '<button id="luckysheet-newConditionRule-dialog-confirm" class="btn btn-primary" data-source="'.concat(e, '">').concat(t.confirm, '</button>\n <button id="luckysheet-newConditionRule-dialog-close" class="btn btn-default" data-source="').concat(e, '">').concat(t.cancel, "</button>"), 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 = '<div><div class="boxTitle">' + e.chooseRuleType + "</div>" + this.ruleTypeHtml() + '<div class="boxTitle">' + e.editRuleDescription + '</div><div class="ruleExplainBox">' + o + "</div></div>"; $("body").append(_m(bn, { id: "luckysheet-editorConditionRule-dialog", addclass: "luckysheet-newEditorRule-dialog", title: e.editFormatRule, content: s, botton: '<button id="luckysheet-editorConditionRule-dialog-confirm" class="btn btn-primary">'.concat(e.confirm, '</button>\n <button id="luckysheet-editorConditionRule-dialog-close" class="btn btn-default">').concat(e.cancel, "</button>"), 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: '<button id="luckysheet-conditionformat-info-dialog-close" class="btn btn-default">'.concat(gn().conditionformat.close, "</button>"), 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 = '<div class="title">'.concat(a.ruleTypeItem1, '</div>\n <div style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.formatStyle, '</label>\n <select id="type1">\n <option value="dataBar">').concat(a.dataBar, '</option>\n <option value="colorGradation">').concat(a.colorGradation, '</option>\n <option value="icons">').concat(a.icons, '</option>\n </select>\n </div>\n <div>\n <div class="type1Box dataBarBox">\n <div style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.fillType, '</label>\n <select id="type2">\n <option value="gradient">').concat(a.gradient, '</option>\n <option value="solid">').concat(a.solid, '</option>\n </select>\n </div>\n <div style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.color, '</label>\n <input data-tips="').concat(a.dataBarColor, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#638ec6" style="display: none;"> \n </div>\n </div>\n <div class="type1Box colorGradationBox" style="display: none;">\n <div style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.fillType, '</label>\n <select id="type2">\n <option value="threeColor">').concat(a.tricolor, '</option>\n <option value="twoColor">').concat(a.twocolor, '</option>\n </select>\n </div>\n <div class="maxVal" style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.maxValue, '</label>\n <input data-tips="').concat(a.maxValue, " ").concat(a.color, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(99, 190, 123)" style="display: none;">\n </div>\n <div class="midVal" style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.medianValue, '</label>\n <input data-tips="').concat(a.medianValue, " ").concat(a.color, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(255, 235, 132)" style="display: none;">\n </div>\n <div class="minVal" style="height: 30px;margin-bottom: 5px;">\n <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">').concat(a.minValue, '</label>\n <input data-tips="').concat(a.minValue, " ").concat(a.color, '" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(248, 105, 107)" style="display: none;">\n </div>\n </div>\n <div class="type1Box iconsBox" style="display: none;">\n <label>').concat(a.fillType, '</label>\n <div class="showbox">\n <div class="model" data-len="3" data-leftmin="0" data-top="0" title="').concat(a.threeWayArrow, "(").concat(a.multicolor, ')" style="background-position: 0 0;"></div>\n <span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s" style="margin-top: 2px;"></span>\n </div>\n <ul>\n <li><div data-len="3" data-leftmin="0" data-top="0" title="').concat(a.threeWayArrow, "(").concat(a.multicolor, ')" style="background-position: 0 0;"></div></li>\n <li><div data-len="3" data-leftmin="5" data-top="0" title="').concat(a.threeWayArrow, "(").concat(a.grayColor, ')" style="background-position: -131px 0;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="1" title="').concat(a.threeTriangles, '" style="background-position: 0 -20px;"></div></li>\n <li><div data-len="4" data-leftmin="0" data-top="2" title="').concat(a.fourWayArrow, "(").concat(a.multicolor, ')" style="background-position: 0 -40px;"></div></li>\n <li><div data-len="4" data-leftmin="5" data-top="1" title="').concat(a.fourWayArrow, "(").concat(a.grayColor, ')" style="background-position: -131px -20px;"></div></li>\n <li><div data-len="5" data-leftmin="0" data-top="3" title="').concat(a.fiveWayArrow, "(").concat(a.multicolor, ')" style="background-position: 0 -60px;"></div></li>\n <li><div data-len="5" data-leftmin="5" data-top="2" title="').concat(a.fiveWayArrow, "(").concat(a.grayColor, ')" style="background-position: -131px -40px;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="4" title="').concat(a.threeColorTrafficLight, "(").concat(a.rimless, ')" style="background-position: 0 -80px;"></div></li>\n <li><div data-len="3" data-leftmin="5" data-top="4" title="').concat(a.threeColorTrafficLight, "(").concat(a.bordered, ')" style="background-position: -131px -80px;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="5" title="').concat(a.threeSigns, '" style="background-position: 0 -100px;"></div></li>\n <li><div data-len="4" data-leftmin="5" data-top="5" title="').concat(a.fourColorTrafficLight, '" style="background-position: -131px -100px;"></div></li>\n <li><div data-len="4" data-leftmin="0" data-top="6" title="').concat(a.greenRedBlackGradient, '" style="background-position: 0 -120px;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="7" title="').concat(a.threeSymbols, "(").concat(a.circled, ')" style="background-position: 0 -140px;"></div></li>\n <li><div data-len="3" data-leftmin="5" data-top="7" title="').concat(a.threeSymbols, "(").concat(a.noCircle, ')" style="background-position: -131px -140px;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="8" title="').concat(a.tricolorFlag, '" style="background-position: 0 -160px;"></div></li>\n <li><div data-len="3" data-leftmin="0" data-top="9" title="').concat(a.threeStars, '" style="background-position: 0 -180px;"></div></li>\n <li><div data-len="5" data-leftmin="0" data-top="10" title="').concat(a.fiveQuadrantDiagram, '" style="background-position: 0 -200px;"></div></li>\n <li><div data-len="5" data-leftmin="0" data-top="11" title="').concat(a.fiveBoxes, '" style="background-position: 0 -220px;"></div></li>\n <li><div data-len="4" data-leftmin="5" data-top="9" title="').concat(a.grade4, '" style="background-position: -131px -180px;"></div></li>\n <li><div data-len="5" data-leftmin="5" data-top="10" title="').concat(a.grade5, '" style="background-position: -131px -200px;"></div></li>\n </ul>\n </div>\n </div>'); break; case 1: t = '<div class="title">'.concat(a.ruleTypeItem2_title, '</div>\n <div style="height: 30px;margin-bottom: 10px;">\n <select id="type1">\n <option value="number">').concat(a.cellValue, '</option>\n <option value="text">').concat(a.specificText, '</option>\n <option value="date">').concat(a.occurrence, '</option>\n </select>\n <div>\n <div class="type1Box numberBox">\n <select id="type2">\n <option value="greaterThan">').concat(a.greaterThan, '</option>\n <option value="lessThan">').concat(a.lessThan, '</option>\n <option value="betweenness">').concat(a.between, '</option>\n <option value="equal">').concat(a.equal, '</option>\n </select>\n <div class="inpbox range" id="conditionVal">\n <input class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(a.selectCell, '"></i>\n </div>\n <span class="txt" style="display: none;">').concat(a.in, '</span>\n <div class="inpbox range" id="conditionVal2" style="display: none;">\n <input class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(a.selectDataRange, '"></i>\n </div>\n </div>\n <div class="type1Box textBox" style="display: none;">\n <select id="type2">\n <option value="">').concat(a.contain, '</option>\n </select>\n <div class="inpbox range" id="conditionVal">\n <input class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(a.selectCell, '"></i>\n </div>\n </div>\n <div class="type1Box dateBox" style="display: none;">\n <div style="width: 162px;" class="inpbox">\n <input style="width: 150px;" id="daterange-btn" readonly="readonly" placeholder="').concat(a.pleaseSelectADate, '"/>\n </div>\n </div>\n </div>\n </div>\n <div class="title">').concat(a.setFormat, ": </div>").concat(r); break; case 2: t = '<div class="title">'.concat(a.ruleTypeItem3_title, '</div>\n <div style="height: 30px;margin-bottom: 10px;">\n <select id="type1">\n <option value="top">').concat(a.top, '</option>\n <option value="last">').concat(a.last, '</option>\n </select>\n <div class="inpbox" id="conditionVal">\n <input class="formulaInputFocus" type="number" value="10"/>\n </div>\n <input id="isPercent" type="checkbox"/>\n <label for="isPercent" class="txt">').concat(a.selectRange_percent, '</label>\n </div>\n <div class="title">').concat(a.setFormat, "</div>").concat(r); break; case 3: t = '<div class="title">'.concat(a.ruleTypeItem4_title, '</div>\n <div style="height: 30px;margin-bottom: 10px;">\n <select id="type1">\n <option value="AboveAverage">').concat(a.above, '</option>\n <option value="SubAverage">').concat(a.below, '</option>\n </select>\n <span class="txt">').concat(a.selectRange_average, '</span>\n </div>\n <div class="title">').concat(a.setFormat, "</div>").concat(r); break; case 4: t = '<div class="title">'.concat(a.all, '</div>\n <div style="height: 30px;margin-bottom: 10px;">\n <select id="type1">\n <option value="0">').concat(a.duplicateValue, '</option>\n <option value="1">').concat(a.uniqueValue, '</option>\n </select>\n <span class="txt">').concat(a.selectRange_value, '</span>\n </div>\n <div class="title">').concat(a.setFormat, "</div>").concat(r); break; case 5: t = '<div class="title">'.concat(a.ruleTypeItem2_title, '</div>\n <div style="height: 30px;margin-bottom: 10px;">\n <div class="inpbox range" id="formulaConditionVal" style="width: 250px;">\n <input class="formulaInputFocus" style="width: 200px;"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(a.selectCell, '"></i>\n </div>\n </div>\n <div class="title">').concat(a.setFormat, ": </div>").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 += "<tr>"; for (var w = 0; w < r.length; w++) { var _ = r[w]; if (null == ga.config.colhidden || null == ga.config.colhidden[_]) { var C = '<td ${span} style="${style}">'; 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 += '<colgroup width="72px"></colgroup>' : b += '<colgroup width="' + ga.config.columnlen[_.toString()] + 'px"></colgroup>'), _ == 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 += '<colgroup width="72px"></colgroup>' : b += '<colgroup width="' + ga.config.columnlen[_.toString()] + 'px"></colgroup>'), _ == 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 += "</td>" } } v += "</tr>" } } if (v = '<table data-type="luckysheet_copy_action_table">' + b + v + "</table>", 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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对多重选择区域执行此操作,请选择单个区域,然后再试")), "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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对合并单元格做部分更改")); 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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对合并单元格做部分更改")); 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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对合并单元格做部分更改"); 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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对合并单元格做部分更改"); 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('<i class="fa fa-exclamation-triangle"></i>提示', "不能对合并单元格做部分更改")); 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 ? '<i style="font-size:16px;color:#ff6a00;" class="fa fa-taxi" aria-hidden="true"></i> Lucky' : fa.userInfo; return '<div class="luckysheet">\n <canvas id="luckysheetTableContentF" style="display:none;" class="luckysheetTableContent"></canvas> \n <div class="luckysheet-work-area luckysheet-noselected-text"> \n <div id ="luckysheet_info_detail" class="luckysheet_info_detail"> \n <div data-tips="'.concat(t.return, '" id="luckysheet_info_detail_title" class="luckysheet_info_detail_back"> \n <i style="color:#444D5A;" class="fa fa-angle-left fa-2x" aria-hidden="true"></i> \n </div> \n <div class="luckysheet-share-logo" title="${logotitle}"></div>\n <div class="sheet-name"> \n <input data-tips="').concat(t.tips, '" id="luckysheet_info_detail_input" class="luckysheet_info_detail_input luckysheet-mousedown-cancel" value="').concat(t.noName, '" tabindex="0" dir="ltr" aria-label="').concat(t.rename, '" style="visibility: visible; width: 149px;" data-tooltip="').concat(t.rename, '"> \n </div> \n <div id="luckysheet_info_detail_update" class="luckysheet_info_detail_update"> ').concat(t.detailUpdate, ' </div> \n <div id="luckysheet_info_detail_save" class="luckysheet_info_detail_save"> ').concat(t.wait, " </div>\n \n ${functionButton}\n \n ").concat("string" === Cm(r) ? '<div class="luckysheet_info_detail_user">\n <span id="luckysheet_info_detail_user">'.concat(r, "</span></div>") : "", "\n\n ").concat("object" === Cm(r) ? '<div class="luckysheet_info_detail_user"> \n <img src="'.concat(r.userImage, '" id="luckysheet_info_detail_user_img">\n <span id="luckysheet_info_detail_user">').concat(r.userName, "</span>\n </div>") : "", '\n \n </div> \n <div id="luckysheet-wa-editor" class="luckysheet-wa-editor toolbar"> ${menu} </div> \n <div id="luckysheet-wa-calculate" class="luckysheet-wa-calculate"> \n <div class="luckysheet-wa-calculate-size" id="luckysheet-wa-calculate-size"></div> \n <div class="luckysheet-wa-calculate-help"> \n <div class="luckysheet-wa-calculate-help-box"> \n <div spellcheck="false" aria-hidden="false" id="luckysheet-helpbox">\n <div id="luckysheet-helpbox-cell" class="luckysheet-helpbox-cell-input luckysheet-mousedown-cancel" tabindex="0" contenteditable="true" dir="ltr" aria-autocomplete="list"></div>\n </div> \n </div> \n <div class="luckysheet-wa-calculate-help-tool">\n <i class="fa fa-caret-down" aria-hidden="true" style="margin-top: 7px;"></i>\n </div> \n </div> \n <div id="luckysheet-wa-functionbox-cancel" class="luckysheet-wa-functionbox">\n <span><i class="iconfont luckysheet-iconfont-qingchu" aria-hidden="true"></i></span>\n </div> \n <div id="luckysheet-wa-functionbox-confirm" class="luckysheet-wa-functionbox">\n <span><i class="iconfont luckysheet-iconfont-yunhang" aria-hidden="true"></i></span>\n </div> \n <div id="luckysheet-wa-functionbox-fx" class="luckysheet-wa-functionbox">\n <span><i class="iconfont luckysheet-iconfont-hanshu" aria-hidden="true" style="color:#333"></i></span> \n </div> \n <div id="luckysheet-functionbox-container" class="luckysheet-mousedown-cancel">\n <div class="luckysheet-mousedown-cancel" dir="ltr">\n <div spellcheck="false" aria-hidden="false" id="luckysheet-functionbox">\n <div id="luckysheet-functionbox-cell" class="luckysheet-functionbox-cell-input luckysheet-mousedown-cancel" tabindex="0" contenteditable="true" dir="ltr" aria-autocomplete="list" aria-label="D4"></div>\n </div>\n </div>\n </div> \n </div> \n </div> \n <div class="luckysheet-grid-container luckysheet-scrollbars-enabled"> \n <div class="luckysheet-grid-window"> \n <div class="luckysheet-help-sub"></div> \n <div class="luckysheet-grid-window-1" id="luckysheet-grid-window-1">\n <canvas id="luckysheetTableContent" class="luckysheetTableContent"></canvas> \n <table class="luckysheet-grid-window-2" cellspacing="0" cellpadding="0" dir="ltr" tabindex="-1" > \n <tbody> \n <tr> \n <td valign="top" class="luckysheet-paneswrapper"> \n <div class="luckysheet-left-top" id="luckysheet-left-top"> </div> \n </td> \n <td valign="top" class="luckysheet-paneswrapper"> \n <div id="luckysheet-cols-h-c" class="luckysheet-cols-h-c">\n <div class="luckysheet-cols-change-size" id="luckysheet-cols-change-size"></div> \n <div class="luckysheet-cols-menu-btn luckysheet-mousedown-cancel" id="luckysheet-cols-menu-btn"><i class="fa fa-caret-down luckysheet-mousedown-cancel" aria-hidden="true"></i></div> \n <div class="luckysheet-cols-h-hover" id="luckysheet-cols-h-hover"></div> \n <div id="luckysheet-cols-h-selected"></div> \n <div class="luckysheet-grdusedrange"></div> \n <div class="luckysheet-grdblkflowpush"></div> ${columnHeader}\n </div>\n </td>\n </tr>\n <tr>\n <td valign="top" class="luckysheet-paneswrapper"> \n <div class="luckysheet-rows-h" id="luckysheet-rows-h"> \n <div class="luckysheet-rows-change-size" id="luckysheet-rows-change-size"></div> \n <div class="luckysheet-rows-h-hover" id="luckysheet-rows-h-hover"></div> \n <div id="luckysheet-rows-h-selected"></div> \n <div class="luckysheet-grdusedrange"></div> \n <div class="luckysheet-grdblkflowpush"></div> ${rowHeader}\n </div> \n </td> \n <td valign="top" class="luckysheet-paneswrapper">\n <div class="luckysheet-cell-loading" id="luckysheet-cell-loading">\n <div class="luckysheet-cell-loading-inner">\n <i class="fa fa-circle-o-notch fa-spin"></i>\n <span></span>\n </div>\n </div> \n <div class="luckysheet-cell-freezen"></div> \n <div class="luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-x" id="luckysheet-scrollbar-x"><div></div></div> \n <div class="luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-y" id="luckysheet-scrollbar-y"><div></div></div> \n <div class="luckysheet-cell-main " id="luckysheet-cell-main">\n <div id="luckysheet-formula-functionrange"></div> \n <div id="luckysheet-formula-functionrange-select" class="luckysheet-selection-copy luckysheet-formula-functionrange-select">\n <div class="luckysheet-selection-copy-top luckysheet-copy"></div>\n <div class="luckysheet-selection-copy-right luckysheet-copy"></div>\n <div class="luckysheet-selection-copy-bottom luckysheet-copy"></div>\n <div class="luckysheet-selection-copy-left luckysheet-copy"></div>\n <div class="luckysheet-selection-copy-hc"></div>\n </div> \n <div class="luckysheet-row-count-show luckysheet-count-show" id="luckysheet-row-count-show"></div>\n <div class="luckysheet-column-count-show luckysheet-count-show" id="luckysheet-column-count-show"></div>\n <div class="luckysheet-change-size-line" id="luckysheet-change-size-line"></div> \n <div class="luckysheet-cell-selected-focus" id="luckysheet-cell-selected-focus"></div> \n <div id="luckysheet-selection-copy"></div> \n <div id="luckysheet-chart-rangeShow"></div>\n <div class="luckysheet-cell-selected-extend" id="luckysheet-cell-selected-extend"></div> \n <div class="luckysheet-cell-selected-move" id="luckysheet-cell-selected-move"></div> \n <div id="luckysheet-cell-selected-boxs">\n <div id="luckysheet-cell-selected" class="luckysheet-cell-selected">\n <div class="luckysheet-cs-inner-border"></div>\n <div class="luckysheet-cs-fillhandle"></div>\n <div class="luckysheet-cs-inner-border"></div>\n <div class="luckysheet-cs-draghandle-top luckysheet-cs-draghandle"></div>\n <div class="luckysheet-cs-draghandle-bottom luckysheet-cs-draghandle"></div>\n <div class="luckysheet-cs-draghandle-left luckysheet-cs-draghandle"></div>\n <div class="luckysheet-cs-draghandle-right luckysheet-cs-draghandle"></div>\n <div class="luckysheet-cs-touchhandle luckysheet-cs-touchhandle-lt"><div class="luckysheet-cs-touchhandle-btn"></div></div>\n <div class="luckysheet-cs-touchhandle luckysheet-cs-touchhandle-rb"><div class="luckysheet-cs-touchhandle-btn"></div></div>\n </div>\n </div>\n <div id="luckysheet-postil-showBoxs"></div>\n <div id="luckysheet-multipleRange-show"></div> \n <div id="luckysheet-dynamicArray-hightShow"></div> \n <div id="luckysheet-image-showBoxs">\n <div id="luckysheet-modal-dialog-activeImage" class="luckysheet-modal-dialog" style="display:none;padding:0;position:absolute;z-index:300;">\n <div class="luckysheet-modal-dialog-border" style="position:absolute;"></div> \n <div class="luckysheet-modal-dialog-content"></div> \n <div class="luckysheet-modal-dialog-resize">\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt" data-type="lt"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt" data-type="mt"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm" data-type="lm"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm" data-type="rm"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt" data-type="rt"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb" data-type="lb"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb" data-type="mb"></div>\n <div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb" data-type="rb"></div>\n </div>\n <div class="luckysheet-modal-dialog-controll">\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-crop" role="button" tabindex="0" aria-label="裁剪" title="裁剪">\n <i class="fa fa-pencil" aria-hidden="true"></i>\n </span>\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-restore" role="button" tabindex="0" aria-label="恢复原图" title="恢复原图">\n <i class="fa fa-window-maximize" aria-hidden="true"></i>\n </span>\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-del" role="button" tabindex="0" aria-label="删除" title="删除">\n <i class="fa fa-trash" aria-hidden="true"></i>\n </span>\n </div>\n </div>\n <div id="luckysheet-modal-dialog-cropping" class="luckysheet-modal-dialog" style="display:none;padding:0;position:absolute;z-index:300;">\n <div class="cropping-mask"></div>\n <div class="cropping-content"></div>\n <div class="luckysheet-modal-dialog-border" style="position:absolute;"></div>\n <div class="luckysheet-modal-dialog-resize">\n <div class="resize-item lt" data-type="lt"></div> \n <div class="resize-item mt" data-type="mt"></div> \n <div class="resize-item lm" data-type="lm"></div> \n <div class="resize-item rm" data-type="rm"></div> \n <div class="resize-item rt" data-type="rt"></div> \n <div class="resize-item lb" data-type="lb"></div> \n <div class="resize-item mb" data-type="mb"></div> \n <div class="resize-item rb" data-type="rb"></div>\n </div>\n <div class="luckysheet-modal-dialog-controll">\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-crop" role="button" tabindex="0" aria-label="裁剪" title="裁剪">\n <i class="fa fa-pencil" aria-hidden="true"></i>\n </span>\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-restore" role="button" tabindex="0" aria-label="恢复原图" title="恢复原图">\n <i class="fa fa-window-maximize" aria-hidden="true"></i>\n </span>\n <span class="luckysheet-modal-controll-btn luckysheet-modal-controll-del" role="button" tabindex="0" aria-label="删除" title="删除">\n <i class="fa fa-trash" aria-hidden="true"></i>\n </span>\n </div>\n </div>\n <div class="img-list"></div>\n <div class="cell-date-picker">\n <input id="cellDatePickerBtn" class="formulaInputFocus" readonly="readonly"/>\n </div>\n </div>\n <div id="luckysheet-dataVerification-dropdown-btn"></div>\n <div id="luckysheet-dataVerification-dropdown-List" class="luckysheet-mousedown-cancel"></div>\n <div id="luckysheet-dataVerification-showHintBox" class="luckysheet-mousedown-cancel"></div>\n <div class="luckysheet-cell-copy"></div> \n <div class="luckysheet-grdblkflowpush"></div> ${flow} \n </div> \n </td> \n </tr> \n </tbody> \n </table> \n </div> \n <div class="luckysheet-sheet-area luckysheet-noselected-text" id="luckysheet-sheet-area">\n <div id="luckysheet-sheets-add" class="luckysheet-sheets-add lucky-button-custom"><i class="iconfont luckysheet-iconfont-jia1"></i></div>\n <div id="luckysheet-sheets-m" class="luckysheet-sheets-m lucky-button-custom"><i class="iconfont luckysheet-iconfont-caidan2"></i></div>\n <div class="luckysheet-sheet-container" id="luckysheet-sheet-container">\n <div class="docs-sheet-fade docs-sheet-fade-left" style="display: none;">\n <div class="docs-sheet-fade3"></div>\n <div class="docs-sheet-fade2"></div>\n <div class="docs-sheet-fade1"></div>\n </div>\n <div class="docs-sheet-fade docs-sheet-fade-right" style="display: none;">\n <div class="docs-sheet-fade1"></div>\n <div class="docs-sheet-fade2"></div>\n <div class="docs-sheet-fade3"></div>\n </div>\n <div class="luckysheet-sheet-container-c" id="luckysheet-sheet-container-c"></div>\n </div>\n <div id="luckysheet-sheets-leftscroll" class="luckysheet-sheets-scroll lucky-button-custom"><i class="fa fa-caret-left"></i></div>\n <div id="luckysheet-sheets-rightscroll" class="luckysheet-sheets-scroll lucky-button-custom"><i class="fa fa-caret-right"></i></div>\n </div> \n </div> \n <div class="luckysheet-stat-area"> \n <div class="luckysheet-sta-c">\n <div class="luckysheet-zoom-content" id="luckysheet-zoom-content">\n <div class="luckysheet-zoom-minus" id="luckysheet-zoom-minus">\n <div class="luckysheet-zoom-minus-icon"></div>\n </div>\n <div class="luckysheet-zoom-slider" id="luckysheet-zoom-slider">\n <div class="luckysheet-zoom-line"></div>\n <div class="luckysheet-zoom-cursor" id="luckysheet-zoom-cursor"></div>\n <div class="luckysheet-zoom-hundred"></div>\n </div>\n <div class="luckysheet-zoom-plus" id="luckysheet-zoom-plus">\n <div class="luckysheet-zoom-plus-icon"></div>\n </div>\n <div class="luckysheet-zoom-ratioText" id="luckysheet-zoom-ratioText">100%</div>\n </div>\n <div class="luckysheet-print-viewList">\n <div type="viewNormal" class="luckysheet-print-viewBtn luckysheet-print-viewNormal luckysheet-print-viewBtn-active" title="').concat(a.normalBtn, '"><i class="icon iconfont luckysheet-iconfont-putong"></i></div>\n <div type="viewLayout" class="luckysheet-print-viewBtn luckysheet-print-viewLayout" title="').concat(a.layoutBtn, '"><i class="icon iconfont luckysheet-iconfont-yemianbuju"></i></div>\n <div type="viewPage" class="luckysheet-print-viewBtn luckysheet-print-viewPage" title="').concat(a.pageBtn, '"><i class="icon iconfont luckysheet-iconfont-fenyeyulan"></i></div>\n </div>\n <div class="luckysheet-sta-content" id="luckysheet-sta-content"></div> \n \x3c!--<div class="luckysheet-bottom-content" id="luckysheet-bottom-content-show"></div> --\x3e\n </div> \n </div> \n </div>\n <div id="luckysheet-copy-content" contenteditable="true"></div>\n <input id="luckysheet-copy-btn" type="button" data-clipboard-target="luckysheet-copy-content">\n <div id="testdpidiv" style="height: 1in; left: -100%; position: absolute; top: -100%; width: 1in;"></div>\n </div>') }(); s = _m(s, { logotitle: n }), s = _m(s, { menu: (l = gn().toolbar, i = gn().fontarray, o = gn().defaultFmt, '<div class="luckysheet-toolbar-left-theme">\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="'.concat(l.undo, '"\n id="luckysheet-icon-undo" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-undo iconfont luckysheet-iconfont-qianjin"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.redo, '"\n id="luckysheet-icon-redo" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-redo iconfont luckysheet-iconfont-houtui"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.paintFormat, '"\n id="luckysheet-icon-paintformat" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-geshishua"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n \x3c!--<div class="luckysheet-toolbar-separator luckysheet-inline-block"\n style="user-select: none;"> </div> <div class="luckysheet-toolbar-zoom-combobox luckysheet-toolbar-combo-button luckysheet-inline-block" data-tips="缩放" id="luckysheet-icon-zoom" style="user-select: none;"> <div class="luckysheet-toolbar-combo-button-outer-box luckysheet-inline-block" style="user-select: none;"> <div class="luckysheet-toolbar-combo-button-inner-box luckysheet-inline-block" style="user-select: none;"> <div aria-posinset="4" aria-setsize="7" class="luckysheet-inline-block luckysheet-toolbar-combo-button-caption" style="user-select: none;"> <input aria-label="缩放比例" class="luckysheet-toolbar-combo-button-input luckysheet-toolbar-textinput luckysheet-mousedown-cancel" role="combobox" style="user-select: none;" tabindex="-1" type="text" value="100%"/> </div> <div class="luckysheet-toolbar-combo-button-dropdown luckysheet-inline-block " style="user-select: none;"> </div> </div> </div> </div> --\x3e\n <div id="toolbar-separator-paint-format" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.currencyFormat, '"\n id="luckysheet-icon-currency" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-jine"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.percentageFormat, '"\n id="luckysheet-icon-percent" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img iconfont luckysheet-iconfont-baifenhao"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.numberDecrease, '"\n id="luckysheet-icon-fmt-decimal-decrease" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block toolbar-decimal-icon"\n style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-decrease iconfont luckysheet-iconfont-jianxiaoxiaoshuwei"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.numberIncrease, '"\n id="luckysheet-icon-fmt-decimal-increase" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block toolbar-decimal-icon"\n style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-increase iconfont luckysheet-iconfont-zengjiaxiaoshuwei"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.moreFormats, '"\n id="luckysheet-icon-fmt-other" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n ').concat(o[0].text, '\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div id="toolbar-separator-more-format" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.font, '" id="luckysheet-icon-font-family" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n ').concat(i[0], '\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n\n <div id="toolbar-separator-font-family" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-zoom-combobox luckysheet-toolbar-combo-button luckysheet-inline-block"\n data-tips="').concat(l.fontSize, '" id="luckysheet-icon-font-size" style="user-select: none;">\n <div class="luckysheet-toolbar-combo-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-combo-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div aria-posinset="4" aria-setsize="7" class="luckysheet-inline-block luckysheet-toolbar-combo-button-caption"\n style="user-select: none;">\n <input aria-label="').concat(l.fontSize, '" class="luckysheet-toolbar-combo-button-input luckysheet-toolbar-textinput"\n role="combobox" style="user-select: none;" tabindex="-1" type="text" value="10"\n />\n </div>\n <div class="luckysheet-toolbar-combo-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div id="toolbar-separator-font-size" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.bold, '"\n id="luckysheet-icon-bold" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-bold iconfont luckysheet-iconfont-jiacu"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.italic, '"\n id="luckysheet-icon-italic" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-italic iconfont luckysheet-iconfont-wenbenqingxie1"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.strikethrough, '"\n id="luckysheet-icon-strikethrough" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-strikethrough iconfont luckysheet-iconfont-wenbenshanchuxian"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button luckysheet-inline-block" data-tips="').concat(l.underline, '"\n id="luckysheet-icon-underline" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-underline iconfont luckysheet-iconfont-wenbenxiahuaxian"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-text-color"\n data-tips="').concat(l.textColor, '" id="luckysheet-icon-text-color" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-color-menu-button-indicator" style="border-bottom-color: rgb(0, 0, 0); user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div class="text-color-bar" style="background-color:').concat(fa.defaultTextColor, '"></div>\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color iconfont luckysheet-iconfont-wenbenyanse"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.chooseColor, '..." id="luckysheet-icon-text-color-menu" role="button"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div id="toolbar-separator-text-color" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-cell-color"\n data-tips="').concat(l.fillColor, '" id="luckysheet-icon-cell-color" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-color-menu-button-indicator" style="border-bottom-color: rgb(255, 255, 255); user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div class="text-color-bar" style="background-color:').concat(fa.defaultCellColor, '"></div>\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color iconfont luckysheet-iconfont-tianchong"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.chooseColor, '..." id="luckysheet-icon-cell-color-menu" role="button"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-border-all"\n data-tips="').concat(l.border, '" id="luckysheet-icon-border-all" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont luckysheet-iconfont-quanjiabiankuang"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.borderStyle, '..." id="luckysheet-icon-border-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-merge-button"\n data-tips="').concat(l.mergeCell, '" id="luckysheet-icon-merge-button" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-merge iconfont luckysheet-iconfont-hebing"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.chooseMergeType, '..." id="luckysheet-icon-merge-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div id="toolbar-separator-merge-cell" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-align"\n data-tips="').concat(l.horizontalAlign, '" id="luckysheet-icon-align" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont luckysheet-iconfont-wenbenzuoduiqi"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.alignment, '..." id="luckysheet-icon-align-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-valign"\n data-tips="').concat(l.verticalAlign, '" id="luckysheet-icon-valign" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont luckysheet-iconfont-dibuduiqi"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.alignment, '..." id="luckysheet-icon-valign-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-textwrap"\n data-tips="').concat(l.textWrap, '" id="luckysheet-icon-textwrap" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont luckysheet-iconfont-jieduan"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.textWrapMode, '..." id="luckysheet-icon-textwrap-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-rotation"\n data-tips="').concat(l.textRotate, '" id="luckysheet-icon-rotation" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wuxuanzhuang"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.textRotateMode, '..." id="luckysheet-icon-rotation-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div id="toolbar-separator-text-rotate" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.insertImage, '" id="luckysheet-insertImg-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-tupian"\n style="user-select: none;">\n <input id="luckysheet-imgUpload" type="file" accept="image/*" style="display:none;"></input>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.insertLink, '" id="luckysheet-insertLink-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-lianjie"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.chart, '" id="luckysheet-chart-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-tubiao"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div> \n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.postil, '"\n id="luckysheet-icon-postil" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon-img-container luckysheet-toolbar-menu-button-caption luckysheet-inline-block iconfont luckysheet-iconfont-zhushi"\n style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.pivotTable, '" id="luckysheet-pivot-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-shujutoushi"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div> \n <div id="toolbar-separator-pivot-table" class="luckysheet-toolbar-separator luckysheet-inline-block" style="user-select: none;">\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-function"\n data-tips="').concat(l.autoSum, '" id="luckysheet-icon-function" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont luckysheet-iconfont-jisuan"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n ').concat(l.sum, '\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.moreFunction, '..." id="luckysheet-icon-function-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-freezen-btn-horizontal"\n data-tips="').concat(l.freezeTopRow, '" id="luckysheet-freezen-btn-horizontal" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n \n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-dongjie1"\n style="user-select: none;">\n </div>\n </div>\n </div>\n \n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block"\n data-tips="').concat(l.moreOptions, '..." id="luckysheet-icon-freezen-menu" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.sortAndFilter, '"\n id="luckysheet-icon-autofilter" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-shaixuan"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;margin-left: 0px;margin-right: 4px;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.conditionalFormat, '"\n id="luckysheet-icon-conditionformat" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n \n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-geshitiaojian"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.dataVerification, '" id="luckysheet-dataVerification-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-shujuyanzheng"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.splitColumn, '" id="luckysheet-splitColumn-btn-title" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wenbenfenge"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.screenshot, '" id="luckysheet-chart-btn-screenshot" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-jieping"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.findAndReplace, '"\n id="luckysheet-icon-seachmore" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-sousuo"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;margin-left: 0px;margin-right: 4px;">\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block"\n data-tips="').concat(l.protection, '" id="luckysheet-icon-protection" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-biaogesuoding"\n style="user-select: none;">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block" data-tips="').concat(l.print, '"\n id="luckysheet-icon-print" role="button" style="user-select: none;">\n <div class="luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block"\n style="user-select: none;">\n <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"\n style="user-select: none;">\n\n <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">\n <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont luckysheet-iconfont-dayin"\n style="user-select: none;">\n </div>\n </div>\n <div class="luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont luckysheet-iconfont-xiayige"\n style="user-select: none;margin-left: 0px;margin-right: 4px;">\n </div>\n </div>\n </div>\n </div>\n ')) }); var c = '<div id="luckysheet-cell-flow_${index}" class="luckysheet-cell-flow luckysheetsheetchange" style="width:${width}px;"><div class="luckysheet-cell-flow-clip"><div class="luckysheet-grdblkpush"></div>${flow}</div></div>'; null == ga.config && (ga.config = {}), So(t, e); var u = gn().info, d = '<button id="luckysheet-bottom-add-row" class="btn btn-default">' + u.add + '</button><input id="luckysheet-bottom-add-row-input" type="text" class="luckysheet-datavisual-config-input luckysheet-mousedown-cancel" placeholder="100"><span style="font-size: 14px;">' + u.row + '</span><span style="font-size: 14px;color: #9c9c9c;">(' + u.addLast + ")</span>", h = ' <button id="luckysheet-bottom-bottom-top" class="btn btn-default" style="">' + u.backTop + "</button>", m = _m(u.pageInfo, { total: fa.total ? fa.total : "", totalPage: fa.pageInfo.totalPage ? fa.pageInfo.totalPage : "", currentPage: fa.pageInfo.currentPage ? fa.pageInfo.currentPage : "" }), p = ' <span id="luckysheet-bottom-page-info" style="font-size: 14px;color: #f34141;">' + m + '</span> <button id="luckysheet-bottom-page-next" class="btn btn-danger" style="">下一页</button>', f = ' <span id="luckysheet-bottom-page-info" style="font-size: 14px;color: #f34141;">' + m + "</span>", g = ""; fa.enableAddRow && (g += d), fa.enablePage && (1 == parseInt(fa.pageInfo.totalPage) ? g += f : g += p), fa.enableAddBackTop && (g += h); var v = _m('<div id="luckysheetcoltable_0" class="luckysheet-cell-flow-col"> <div id ="luckysheet-sheettable_0" class="luckysheet-cell-sheettable" style="height:${height}px;width:${width}px;"></div><div id="luckysheet-bottom-controll-row" class="luckysheet-bottom-controll-row"> ' + g + " </div> </div>", { height: ga.rh_height, width: ga.ch_width - 1 }), y = _m('<div class="luckysheet-cols-h-cells luckysheetsheetchange" id="luckysheet-cols-h-cells_${index}" style="width:${width}px;"> <div class="luckysheet-cols-h-cells-c"> <div class="luckysheet-grdblkpush"></div>${column}</div></div>', { width: ga.ch_width, index: 0, column: "" }); c = _m(c, { width: ga.ch_width, flow: v, index: 0 }), s = _m(s, { flow: c, rowHeader: "<div style='height:" + ga.rh_height + "px' id='luckysheetrowHeader_0' class='luckysheetsheetchange'></div>", 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('<div class="luckysheet-modal-dialog-mask" id="luckysheet-modal-dialog-mask"></div>'), $("body").append(""), $("body").append(vn()), $("body").append('<div dir="ltr"><div class="luckysheet-input-box-index" id="luckysheet-input-box-index"></div><div id="luckysheet-input-box" spellcheck="false" aria-hidden="false" class="luckysheet-input-box"><div class="luckysheet-cell-input editable" tabindex="0" role="combobox" contenteditable="true" id="luckysheet-rich-text-editor" dir="ltr" g_editable="true" aria-autocomplete="list"></div></div></div>'), $("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('<div id="${id}"class="luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}"tabindex="0"role="dialog"aria-labelledby=":41e"dir="ltr"><div class="luckysheet-modal-dialog-resize"><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt"data-type="lt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt"data-type="mt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm"data-type="lm"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm"data-type="rm"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt"data-type="rt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb"data-type="lb"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb"data-type="mb"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb"data-type="rb"></div></div><div class="luckysheet-modal-dialog-controll"><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-update"role="button"tabindex="0"aria-label="修改图表"title="修改图表"><i class="fa fa-pencil"aria-hidden="true"></i></span><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-max"role="butluckysheet_chartIns_indexton"tabindex="0"aria-label="最大化"title="最大化"><i class="fa fa-window-maximize"aria-hidden="true"></i></span><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-del"role="button"tabindex="0"aria-label="删除"title="删除"><i class="fa fa-trash"aria-hidden="true"></i></span></div><div class="luckysheet-modal-dialog-content">${content}</div></div>', { 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('<div id="${id}"class="luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}"tabindex="0"role="dialog"aria-labelledby=":41e"dir="ltr"><div class="luckysheet-modal-dialog-resize"><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt"data-type="lt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt"data-type="mt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm"data-type="lm"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm"data-type="rm"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt"data-type="rt"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb"data-type="lb"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb"data-type="mb"></div><div class="luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb"data-type="rb"></div></div><div class="luckysheet-modal-dialog-controll"><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-update"role="button"tabindex="0"aria-label="修改图表"title="修改图表"><i class="fa fa-pencil"aria-hidden="true"></i></span><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-max"role="butluckysheet_chartIns_indexton"tabindex="0"aria-label="最大化"title="最大化"><i class="fa fa-window-maximize"aria-hidden="true"></i></span><span class="luckysheet-modal-controll-btn luckysheet-modal-controll-del"role="button"tabindex="0"aria-label="删除"title="删除"><i class="fa fa-trash"aria-hidden="true"></i></span></div><div class="luckysheet-modal-dialog-content">${content}</div></div>', { 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('<div id="luckysheet-datavisual-selection-set-' + r + '" class="luckysheet-datavisual-selection-set"></div>'), 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 = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ga.luckysheetfile[t].color + ';"></div>'), 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("<div " + a + ' id="luckysheet-datavisual-selection-set-' + r + '" class="luckysheet-datavisual-selection-set"></div>') } $("#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 = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + l.color + ';"></div>'); 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('<div id="luckysheet-datavisual-selection-set-' + r + '" class="luckysheet-datavisual-selection-set"></div>'), 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 = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + e.color + ';"></div>'), $("#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('<div id="luckysheet-datavisual-selection-set-' + e.index + '" class="luckysheet-datavisual-selection-set"></div>'), 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: '<div id="luckysheet-formula-functionrange-highlight-${id}" rangeindex="${id}" class="luckysheet-selection-highlight luckysheet-formula-functionrange-highlight"><div data-type="top" class="luckysheet-selection-copy-top luckysheet-copy"></div><div data-type="right" class="luckysheet-selection-copy-right luckysheet-copy"></div><div data-type="bottom" class="luckysheet-selection-copy-bottom luckysheet-copy"></div><div data-type="left" class="luckysheet-selection-copy-left luckysheet-copy"></div><div class="luckysheet-selection-copy-hc"></div><div data-type="lt" class="luckysheet-selection-highlight-topleft luckysheet-highlight"></div><div data-type="rt" class="luckysheet-selection-highlight-topright luckysheet-highlight"></div><div data-type="lb" class="luckysheet-selection-highlight-bottomleft luckysheet-highlight"></div><div data-type="rb" class="luckysheet-selection-highlight-bottomright luckysheet-highlight"></div></div>', 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: '<div id="luckysheet-formula-search-c" class="luckysheet-formula-search-c"></div>', helpHTML: '<div id="luckysheet-formula-help-c" class="luckysheet-formula-help-c"> <div class="luckysheet-formula-help-close" title="${helpClose}"><i class="fa fa-times" aria-hidden="true"></i></div> <div class="luckysheet-formula-help-collapse" title="${helpCollapse}"><i class="fa fa-angle-up" aria-hidden="true"></i></div> <div class="luckysheet-formula-help-title"><div class="luckysheet-formula-help-title-formula"> <span class="luckysheet-arguments-help-function-name">SUM</span> <span class="luckysheet-arguments-paren">(</span> <span class="luckysheet-arguments-parameter-holder"> <span class="luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active" dir="auto">A2:A100</span>, <span class="luckysheet-arguments-help-parameter" dir="auto">101</span> </span> <span class="luckysheet-arguments-paren">)</span> </div></div> <div class="luckysheet-formula-help-content"> <div class="luckysheet-formula-help-content-example"> <div class="luckysheet-arguments-help-section-title">${helpExample}</div> <div class="luckysheet-arguments-help-formula"> <span class="luckysheet-arguments-help-function-name">SUM</span> <span class="luckysheet-arguments-paren">(</span> <span class="luckysheet-arguments-parameter-holder"> <span class="luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active" dir="auto">A2:A100</span>, <span class="luckysheet-arguments-help-parameter" dir="auto">101</span> </span> <span class="luckysheet-arguments-paren">)</span> </div> </div> <div class="luckysheet-formula-help-content-detail"> <div class="luckysheet-arguments-help-section"> <div class="luckysheet-arguments-help-section-title luckysheet-arguments-help-parameter-name">${helpAbstract}</div> <span class="luckysheet-arguments-help-parameter-content">${helpAbstract}</span> </div> </div> <div class="luckysheet-formula-help-content-param"> ${param} </div> </div> <div class="luckysheet-formula-help-foot"></div></div>', 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('<span dir="auto" class="luckysheet-formula-text-color">(</span>'), 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 = '<div data-func="${n}" class="luckysheet-formula-search-item ${class}"><div class="luckysheet-formula-search-func">${n}</div><div class="luckysheet-formula-search-detail">${a}</div></div>', 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 += '<span class="luckysheet-arguments-help-argument-info">...-' + n.allowRepeatText + "</span>"), "o" == c.require && (u = "[" + u + "]", d += '<span class="luckysheet-arguments-help-argument-info">-[' + n.allowOptionText + "]</span>"), l += '<span class="luckysheet-arguments-help-parameter" dir="auto">' + u + "</span>, ", i += '<span class="luckysheet-arguments-help-parameter" dir="auto">' + c.example + "</span>, ", o += _m('<div class="luckysheet-arguments-help-section"><div class="luckysheet-arguments-help-section-title">${param}</div><span class="luckysheet-arguments-help-parameter-content">${content}</span></div>', { 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('<i class="fa fa-angle-up" aria-hidden="true"></i>') : $(this).html('<i class="fa fa-angle-down" aria-hidden="true"></i>') })); 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) && "<span" == o.substr(0, 5), p = !1; if (!m && i && i.length > 0) { var f = i.replace(/\r\n/g, "_x000D_").replace(/&#13;&#10;/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 = '<span class="luckysheet-formula-functionrange-cell" rangeindex="' + this.functionHTMLIndex + '" dir="auto" style="color:' + Cn[this.functionHTMLIndex] + ';">' + r + "</span>"; $(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 = /<span.*?>/g, r = e.replace(a, ""), n = t.replace(a, ""); r = r.split("</span>"), n = n.split("</span>"), 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") && "<span" == n.html().substr(0, 5) || n.html(e)) }), 1) } }, functionHTMLGenerate: function (e) { return 0 == e.length || "=" != e.substr(0, 1) ? e : (this.functionHTMLIndex = 0, '<span dir="auto" class="luckysheet-formula-text-color">=</span>' + 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 += '<span dir="auto" class="luckysheet-formula-text-func">' + i + '</span><span dir="auto" class="luckysheet-formula-text-lpar">(</span>' : o += '<span dir="auto" class="luckysheet-formula-text-lpar">(</span>', i = ""; else if (")" == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) s.bracket -= 1, o += this.functionHTML(i) + '<span dir="auto" class="luckysheet-formula-text-rpar">)</span>', 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 + '"</span>' : o += '"</span>', s.dquote -= 1, i = "") : (s.dquote += 1, i.length > 0 ? o += this.functionHTML(i) + '<span dir="auto" class="luckysheet-formula-text-string">"' : o += '<span dir="auto" class="luckysheet-formula-text-string">"', 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) + '<span dir="auto" class="luckysheet-formula-text-comma">,</span>', i = ""; else if ("&" == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) i.length > 0 ? (o += this.functionHTML(i) + '<span dir="auto" class="luckysheet-formula-text-calc">&</span>', i = "") : o += '<span dir="auto" class="luckysheet-formula-text-calc">&</span>'; 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) + '<span dir="auto" class="luckysheet-formula-text-calc">' + c + u + "</span>", i = "") : o += '<span dir="auto" class="luckysheet-formula-text-calc">' + c + u + "</span>", l++) : /[^0-9]/.test(u) || "-" != c || "(" != h && null != h && "," != h && " " != h && !(h in this.operatorjson) ? i.length > 0 ? (o += this.functionHTML(i) + '<span dir="auto" class="luckysheet-formula-text-calc">' + c + "</span>", i = "") : o += '<span dir="auto" class="luckysheet-formula-text-calc">' + c + "</span>" : i += c } else i += c; if (l == n.length - 1) if (this.iscelldata($.trim(i))) o += '<span class="luckysheet-formula-functionrange-cell" rangeindex="' + this.functionHTMLIndex + '" dir="auto" style="color:' + Cn[this.functionHTMLIndex] + ';">' + i + "</span>", this.functionHTMLIndex++; else if (s.dquote > 0) o += i + "</span>"; else if (-1 == i.indexOf("</span>") && i.length > 0) { var m = /{.*?}/; if (m.test($.trim(i))) { var p = m.exec(i)[0], f = i.search(m), g = ""; f > 0 && (g += '<span dir="auto" class="luckysheet-formula-text-color">' + i.substr(0, f) + "</span>"), g += '<span dir="auto" style="color:#959a05" class="luckysheet-formula-text-array">' + p + "</span>", f + p.length < i.length && (g += '<span dir="auto" class="luckysheet-formula-text-color">' + i.substr(f + p.length, i.length) + "</span>"), o += g } else o += '<span dir="auto" class="luckysheet-formula-text-color">' + i + "</span>" } 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('<div class="luckysheet-cell-selected" style="left: ' + ga.luckysheet_select_save[e].left_move + "px; width: " + ga.luckysheet_select_save[e].width_move + "px; top: " + ga.luckysheet_select_save[e].top_move + "px; height: " + ga.luckysheet_select_save[e].height_move + 'px; border: 1px solid rgba(1, 136, 251, 0.15); display: block;"></div>'), 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('<div class="luckysheet-rows-h-selected" style="top: ' + m + "px; height: " + (h - m - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>') } $("#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('<div class="luckysheet-cols-h-selected" style="left: ' + y + "px; width: " + (v - y - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);"></div>') } }(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 = '<div class="luckysheet-selection-copy" style="display: block; left: ' + c + "px; width: " + (s - c - 1) + "px; top: " + o + "px; height: " + (i - o - 1) + 'px;"><div class="luckysheet-selection-copy-top luckysheet-copy"></div><div class="luckysheet-selection-copy-right luckysheet-copy"></div><div class="luckysheet-selection-copy-bottom luckysheet-copy"></div><div class="luckysheet-selection-copy-left luckysheet-copy"></div><div class="luckysheet-selection-copy-hc"></div></div>'; $("#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("<div>" + i.toString().split("").join("</div><div>") + "</div><div>" + h.row + "</div>") } 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 += '<div class="listItem"><div class="name">' + s + '</div><div class="value">' + this.moneyFmtList[o].value + '</div><input type="hidden" value="' + c + '"/></div>' } l = '<div class="box" id="morecurrency"><div class="decimal"><label>' + a.decimalPlaces + '</label><input type="number" class="formulaInputFocus" value="2" min="0" max="9"/></div><div class="listbox">' + i + "</div></div>" } else if ("moredatetime" == e) { n = a.titleDateTime; for (var u = "", d = 0; d < this.dateFmtList.length; d++) { u += '<div class="listItem"><div class="name">' + this.dateFmtList[d].name + '</div><div class="value">' + this.dateFmtList[d].value + "</div></div>" } l = '<div class="box" id="moredatetime"><div class="listbox">' + u + "</div></div>" } else if ("moredigit" == e) { n = a.titleNumber; for (var h = "", m = 0; m < this.numFmtList.length; m++) { h += '<div class="listItem"><div class="name">' + this.numFmtList[m].name + '</div><div class="value">' + this.numFmtList[m].value + "</div></div>" } l = '<div class="box" id="moredigit"><div class="listbox">' + h + "</div></div>" } $("body").append(_m(bn, { id: "luckysheet-moreFormat-dialog", addclass: "luckysheet-moreFormat-dialog", title: n, content: l, botton: '<button id="luckysheet-moreFormat-dialog-confirm" class="btn btn-primary">' + r.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + r.cancel + "</button>", 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 = '<div class="tabBox"><span id="searchTab">' + a.find + '</span><span id="replaceTab">' + a.replace + '</span></div><div class="ctBox"><div class="inputBox"><div class="textboxs" id="searchInput">' + a.findTextbox + '<input class="formulaInputFocus" spellcheck="false" value=""/></div><div class="textboxs" id="replaceInput">' + a.replaceTextbox + '<input class="formulaInputFocus" spellcheck="false" value=""/></div><div class="checkboxs"><div id="regCheck"><input type="checkbox"/><span>' + a.regexTextbox + '</span></div><div id="wordCheck"><input type="checkbox"/><span>' + a.wholeTextbox + '</span></div><div id="caseCheck"><input type="checkbox"/><span>' + a.distinguishTextbox + '</span></div></div></div><div class="btnBox"><button id="replaceAllBtn" class="btn btn-default">' + a.allReplaceBtn + '</button><button id="replaceBtn" class="btn btn-default">' + a.replaceBtn + '</button><button id="searchAllBtn" class="btn btn-default">' + a.allFindBtn + '</button><button id="searchNextBtn" class="btn btn-default">' + a.findBtn + "</button></div></div>"; $("body").append(_m(bn, { id: "luckysheet-search-replace", addclass: "luckysheet-search-replace", title: "", content: n, botton: '<button class="btn btn-default luckysheet-model-close-btn">' + r.close + "</button>", 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 += '<div class="boxItem" data-row="' + r[l].r + '" data-col="' + r[l].c + '" data-sheetIndex="' + ga.currentSheetIndex + '"><span>' + ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "</span><span>" + Im(r[l].c) + (r[l].r + 1) + "</span><span>" + i + "</span></div>" : n += '<div class="boxItem" data-row="' + r[l].r + '" data-col="' + r[l].c + '" data-sheetIndex="' + ga.currentSheetIndex + '"><span>' + ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "</span><span>" + Im(r[l].c) + (r[l].r + 1) + '</span><span title="' + i + '">' + i + "</span></div>" } $('<div id="searchAllbox"><div class="boxTitle"><span>' + e.searchTargetSheet + "</span><span>" + e.searchTargetCell + "</span><span>" + e.searchTargetValue + '</span></div><div class="boxMain">' + n + "</div></div>").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 = '<div class="listbox"><div class="listItem"><input type="radio" name="locationType" checked="checked" id="locationConstant"><label for="locationConstant">' + t.locationConstant + '</label><div class="subbox"><div class="subItem"><input type="checkbox" checked="checked" class="date" id="locationConstantDate"><label for="locationConstantDate">' + t.locationDate + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="number" id="locationConstantNumber"><label for="locationConstantNumber">' + t.locationDigital + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="string" id="locationConstantString"><label for="locationConstantString">' + t.locationString + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="boolean" id="locationConstantBoolean"><label for="locationConstantBoolean">' + t.locationBool + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="error" id="locationConstantError"><label for="locationConstantError">' + t.locationBool + '</label></div></div></div><div class="listItem"><input type="radio" name="locationType" id="locationFormula"><label for="locationFormula">' + t.locationFormula + '</label><div class="subbox"><div class="subItem"><input type="checkbox" checked="checked" class="date" id="locationFormulaDate" disabled="true"><label for="locationFormulaDate" style="color: #666">' + t.locationDate + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="number" id="locationFormulaNumber" disabled="true"><label for="locationFormulaNumber" style="color: #666">' + t.locationDigital + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="string" id="locationFormulaString" disabled="true"><label for="locationFormulaString" style="color: #666">' + t.locationString + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="boolean" id="locationFormulaBoolean" disabled="true"><label for="locationFormulaBoolean" style="color: #666">' + t.locationBool + '</label></div><div class="subItem"><input type="checkbox" checked="checked" class="error" id="locationFormulaError" disabled="true"><label for="locationFormulaError" style="color: #666">' + t.locationError + '</label></div></div></div><div class="listItem"><input type="radio" name="locationType" id="locationNull"><label for="locationNull">' + t.locationNull + '</label></div><div class="listItem"><input type="radio" name="locationType" id="locationCF"><label for="locationCF">' + t.locationCondition + '</label></div><div class="listItem"><input type="radio" name="locationType" id="locationStepRow"><label for="locationStepRow">' + t.locationRowSpan + '</label></div><div class="listItem"><input type="radio" name="locationType" id="locationStepColumn"><label for="locationStepColumn">' + t.locationColumnSpan + "</label></div></div>"; $("body").append(_m(bn, { id: "luckysheet-locationCell-dialog", addclass: "luckysheet-locationCell-dialog", title: t.location, content: r, botton: '<button id="luckysheet-locationCell-dialog-confirm" class="btn btn-primary">' + a.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + a.cancel + "</button>", 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: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>", noCalendar: !1, now: new Date, onChange: [], onClose: [], onDayCreate: [], onDestroy: [], onKeyDown: [], onMonthChange: [], onOpen: [], onParseConfig: [], onReady: [], onValueUpdate: [], onYearChange: [], onPreCalendarPosition: [], plugins: [], position: "auto", positionElement: void 0, prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>", 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", "<span class='flatpickr-day'>" + y.config.getWeek(t) + "</span>"), 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 <span class='flatpickr-weekday'>\n " + a.join("</span><span class='flatpickr-weekday'>") + "\n </span>\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('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + t.oldcolor + ';"></div>'), 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('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + e.color + ';"></div>'), 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) || "<span" == a.toString().substr(0, 5) ? m = Ih.updatecell(e, t, a, !1).data : (Ih.delFunctionGroup(e, t), Cs(e, t, m, a)); setTimeout((function () { Nc.createHookFunction("cellUpdated", e, t, JSON.parse(l), ga.flowdata[e][t], u) }), 0), h.index == ga.currentSheetIndex && u ? id(m, [{ row: [e, e], column: [t, t] }]) : h.data = m, d && "function" == typeof d && d(m) } } function Kh(e, t, a, r) { var n = arguments.length > 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('<div id="luckysheet-bottom-pager" style="font-size: 14px; margin-left: 10px; display: inline-block;"></div>'), $("#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 += "<tr>"; for (var Y = 0; Y < M.length; Y++) { var X = M[Y]; if (null == s.colhidden || null == s.colhidden[X]) { var K = '<td ${span} style="${style}">'; if (null != H[W] && null != H[W][X]) { var Z = "", Q = ""; W == E[0] && (null == s.columnlen || null == s.columnlen[X.toString()] ? j += '<colgroup width="72px"></colgroup>' : j += '<colgroup width="' + s.columnlen[X.toString()] + 'px"></colgroup>'), 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 += '<colgroup width="72px"></colgroup>' : j += '<colgroup width="' + s.columnlen[X.toString()] + 'px"></colgroup>'), 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 += "</td>" } } U += "</tr>" } } return U = '<table data-type="luckysheet_copy_action_table">' + j + U + "</table>" }, 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('<div id="luckysheet-datavisual-selection-set-' + s + '" class="luckysheet-datavisual-selection-set"></div>'), 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 = '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + c.color + ';"></div>'); 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('<div id="luckysheet-datavisual-selection-set-' + s + '" class="luckysheet-datavisual-selection-set"></div>'), 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('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + e + ';"></div>'), 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 = $("<canvas>").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('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo1) } else if ("checkbox" == r) { if (0 == o.length || 0 == c.length) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', 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('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo3); if ("bw" == l || "nb" == l) { if (!ba(c)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo3); if (Number(c) < Number(o)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', 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('<i class="fa fa-exclamation-triangle"></i>', 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('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo3); if ("bw" == l || "nb" == l) { if (!ba(c)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo3); if (Number(c) < Number(o)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', 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('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo6); if ("bw" == l || "nb" == l) { if (!ds(c)) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', T.tooltipInfo6); if (hs(o, c) > 0) return void fd.info('<i class="fa fa-exclamation-triangle"></i>', 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 += "<span index='" + i + "' style='" + es(o) + "'>" + o.v + "</span>" } 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 = "<br/>"), !pu(d, h, ga.currentSheetIndex) && w.length > 0 && '<span dir="auto" class="luckysheet-formula-text-color">=</span>' == 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 = '<div class="item"><input type="number" class="smallNum formulaInputFocus"/><select class="operator"><option value="0"> <= </option><option value="1"> < </option></select><span class="compareValue">' + t + '</span><select class="operator2"><option value="0"> <= </option><option value="1" selected="selected"> < </option></select><input type="number" class="largeNum formulaInputFocus"/><span>' + a.ifGenTipLableTitile + '</span><input type="text" class="markText formulaInputFocus" value=""><i class="fa fa-remove" aria-hidden="true"></i></div>'; $("#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 += '<div class="item"><input type="number" class="smallNum formulaInputFocus" value="' + c + '"/><select class="operator"><option value="0"> <= </option><option value="1"> < </option></select><span class="compareValue">' + n + '</span><select class="operator2"><option value="0"> <= </option><option value="1" selected="selected"> < </option></select><input type="number" class="largeNum formulaInputFocus" value="' + u + '"/><span>' + a.ifGenTipLableTitile + '</span><input type="text" class="markText formulaInputFocus" value="' + d + '"><i class="fa fa-remove" aria-hidden="true"></i></div>' } var h = '<div class="ifAttr"><div class="attrBox"><label for="compareValue"> ' + a.ifGenCompareValueTitle + ' </label><div class="inpBox"><input id="compareValue" class="formulaInputFocus" value="' + n + '"/><i class="singRange fa fa-table" aria-hidden="true" title="' + a.ifGenSelectCellTitle + '"></i></div></div><div class="attrBox"><label for="smallRange"> ' + a.ifGenRangeTitle + ' </label><input type="number" id="smallRange" class="formulaInputFocus"/><span class="text"> ' + a.ifGenRangeTo + ' </span><input type="number" id="largeRange" class="formulaInputFocus"/><div id="rangeAssess"><span> ' + a.ifGenRangeEvaluate + ' </span><i class="multiRange fa fa-table" aria-hidden="true" title="' + a.ifGenSelectRangeTitle + '"></i></div></div><div class="attrBox"><label for="DivisionMethod"> ' + a.ifGenCutWay + ' </label><select id="DivisionMethod"><option value="0"> ' + a.ifGenCutSame + ' </option><option value="1"> ' + a.ifGenCutNpiece + ' </option><option value="2"> ' + a.ifGenCutCustom + ' </option></select><input id="DivisionMethodVal" class="formulaInputFocus"/><div id="createBtn"> ' + a.ifGenCutSame + ' </div></div></div><div class="ifList">' + l + "</div>"; $("body").append(_m(bn, { id: "luckysheet-ifFormulaGenerator-dialog", addclass: "luckysheet-ifFormulaGenerator-dialog", title: a.ifGenerate, content: h, botton: '<button id="luckysheet-ifFormulaGenerator-dialog-confirm" class="btn btn-primary">' + r.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + r.cancel + "</button>", 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: '<input readonly="readonly" placeholder="' + a.ifGenTipSelectCellPlace + '" value="' + e + '">', botton: '<button id="luckysheet-ifFormulaGenerator-singleRange-confirm" class="btn btn-primary">' + r.confirm + '</button><button id="luckysheet-ifFormulaGenerator-singleRange-cancel" class="btn btn-default">' + r.cancel + "</button>", 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: '<input readonly="readonly" placeholder="' + t.ifGenTipSelectRangePlace + '" value="">', botton: '<button id="luckysheet-ifFormulaGenerator-multiRange-confirm" class="btn btn-primary">' + a.confirm + '</button><button id="luckysheet-ifFormulaGenerator-multiRange-cancel" class="btn btn-default">' + a.cancel + "</button>", 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 = '<div class="item"><input type="number" class="smallNum formulaInputFocus" value="' + i[m] + '"/><select class="operator"><option value="0"> <= </option><option value="1"> < </option></select><span class="compareValue">' + e + '</span><select class="operator2"><option value="0"> <= </option><option value="1" selected="selected"> < </option></select><input type="number" class="largeNum formulaInputFocus" value="' + i[m + 1] + '"/><span>' + l.ifGenTipLableTitile + '</span><input type="text" class="markText formulaInputFocus" value="' + p + '"><i class="fa fa-remove" aria-hidden="true"></i></div>'; $("#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: '<button class="btn btn-default luckysheet-model-close-btn">&nbsp;&nbsp;' + t.close + "&nbsp;&nbsp;</button>", 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) && $('<div class="listBox" name="' + a[r].n + '"><span>' + a[r].n + "</span><span>" + a[r].a + "</span></div>").appendTo($("#formulaTypeList")) : "-1" != a[r].a.indexOf(t) && $('<div class="listBox" name="' + a[r].n + '"><span>' + a[r].n + "</span><span>" + a[r].a + "</span></div>").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 = '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">' + t.toUpperCase() + '</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'; $("#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 ($("<span>" + o + ":</span><span>" + r + "</span>").appendTo($("#luckysheet-search-formula-parm .parmDetailsBox")), "y" == n) { var s = $("#luckysheet-search-formula-parm .parmBox").length; s < 5 && t == s - 1 && $('<div class="parmBox"><div class="name">' + a.valueTitle + (s + 1) + '</div><div class="txt"><input class="formulaInputFocus" /><i class="fa fa-table" aria-hidden="true" title="' + a.tipSelectDataRange + '"></i></div><div class="val">=</div></div>').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: "<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='" + a.tipDataRangeTile + "' readonly='true' placeholder='" + a.tipDataRangeTile + "'>", botton: '<button id="luckysheet-search-formula-parm-select-confirm" class="btn btn-primary">' + r.confirm + "</button>", style: "z-index:100003" })) : $("body").append(_m(bn, { id: "luckysheet-search-formula-parm-select", addclass: "luckysheet-search-formula-parm-select", title: a.tipSelectDataRange, content: "<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='" + a.tipDataRangeTile + "' readonly='true' value='" + $(this).parents(".parmBox").find(".txt input").val() + "'>", botton: '<button id="luckysheet-search-formula-parm-select-confirm" class="btn btn-primary">' + r.confirm + "</button>", 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: "<div class='inpbox'><label for='searchFormulaListInput'>" + t.findFunctionTitle + "</label><input class='formulaInputFocus' id='searchFormulaListInput' placeholder='" + t.tipInputFunctionName + "' spellcheck='false'/></div><div class='selbox'><label>" + t.selectCategory + "</label><select id='formulaTypeSelect'><option value='0'>" + t.Math + "</option><option value='1'>" + t.Statistical + "</option><option value='2'>" + t.Lookup + "</option><option value='3'>" + t.luckysheet + "</option><option value='4'>" + t.dataMining + "</option><option value='5'>" + t.Database + "</option><option value='6'>" + t.Date + "</option><option value='7'>" + t.Filter + "</option><option value='8'>" + t.Financial + "</option><option value='9'>" + t.Engineering + "</option><option value='10'>" + t.Logical + "</option><option value='11'>" + t.Operator + "</option><option value='12'>" + t.Text + "</option><option value='13'>" + t.Parser + "</option><option value='14'>" + t.Array + "</option><option value='-1'>" + t.other + "</option></select></div><div class='listbox'><label>" + t.selectFunctionTitle + "</label><div id='formulaTypeList'></div></div>", botton: '<button id="luckysheet-search-formula-confirm" class="btn btn-primary">' + a.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + a.cancel + "</button>", 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) && $('<div class="listBox" name="' + t[a].n + '"><span>' + t[a].n + "</span><span>" + t[a].a + "</span></div>").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 += '<div class="parmBox"><div class="name">' + s[c].p[u].name + '</div><div class="txt"><input class="formulaInputFocus" spellcheck="false"/><i class="fa fa-table" aria-hidden="true" title="' + i.tipSelectDataRange + '"></i></div><div class="val">=</div></div>' : (null == t[u] && (t[u] = ""), n += '<div class="parmBox"><div class="name">' + s[c].p[u].name + '</div><div class="txt"><input class="formulaInputFocus" value="' + t[u] + '" spellcheck="false"/><i class="fa fa-table" aria-hidden="true" title="' + i.tipSelectDataRange + '"></i></div><div class="val">=</div></div>'); r = '<div><div class="parmListBox">' + n + '</div><div class="formulaDetails">' + s[c].d + '</div><div class="parmDetailsBox"></div><div class="result">' + i.calculationResult + " = <span></span></div></div>" } $("#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: '<button id="luckysheet-search-formula-parm-confirm" class="btn btn-primary">' + o.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + o.cancel + "</button>", 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: '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton ${subclass} luckysheet-mousedown-cancel" id="luckysheet-icon-${id}-menuButton">${item}</div>', item: '<div itemvalue="${value}" itemname="${name}" class="luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 0px 3px 1px;"><span style="margin-right:3px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span> ${name} <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel ${iconClass}" style="user-select: none;">${example}</span></div></div>', split: '<div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>', color: '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel luckysheet-menuButton ${sub}" id="${id}"><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-color-reset"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">${resetColor}</div></div> <div class="luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <input type="text" class="luckysheet-color-selected" /> </div> </div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> ${coloritem}</div>', coloritem: '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel ${class}"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">${name}</div></div>', subcolor: '<div id="luckysheet-icon-${id}-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-menuButton-sub luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <input type="text" class="luckysheet-color-selected" /> </div> </div></div>', 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('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') : e.find(".luckysheet-cols-menuitem[itemvalue='" + t + "']").find("span.icon").html('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') }, 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("<i class='fa fa-paint-brush'></i> " + 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("<i class='fa fa-paint-brush'></i> " + 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: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-top iconfont luckysheet-iconfont-shangbiankuang" style="user-select: none;"> </div> </div>' }, { text: n.borderBottom, value: "border-bottom", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-bottom iconfont luckysheet-iconfont-xiabiankuang" style="user-select: none;"> </div> </div>' }, { text: n.borderLeft, value: "border-left", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-left iconfont luckysheet-iconfont-zuobiankuang" style="user-select: none;"> </div> </div>' }, { text: n.borderRight, value: "border-right", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-right iconfont luckysheet-iconfont-youbiankuang" style="user-select: none;"> </div> </div>' }, { text: "", value: "split", example: "" }, { text: n.borderNone, value: "border-none", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-none iconfont luckysheet-iconfont-wubiankuang" style="user-select: none;"> </div> </div>' }, { text: n.borderAll, value: "border-all", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont luckysheet-iconfont-quanjiabiankuang" style="user-select: none;"> </div> </div>' }, { text: n.borderOutside, value: "border-outside", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-outside iconfont luckysheet-iconfont-sizhoujiabiankuang" style="user-select: none;"> </div> </div>' }, { text: "", value: "split", example: "" }, { text: n.borderInside, value: "border-inside", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-inside iconfont luckysheet-iconfont-neikuangxian" style="user-select: none;"> </div> </div>' }, { text: n.borderHorizontal, value: "border-horizontal", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-horizontal iconfont luckysheet-iconfont-neikuanghengxian" style="user-select: none;"> </div> </div>' }, { text: n.borderVertical, value: "border-vertical", example: '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-vertical iconfont luckysheet-iconfont-neikuangshuxian" style="user-select: none;"> </div> </div>' }, { text: "", value: "split", example: "" }, { text: "<span id='luckysheet-icon-borderColor-linecolor' class='luckysheet-mousedown-cancel' style='border-bottom:3px solid #000;'>" + n.borderColor + "</span>", value: "borderColor", example: "more" }, { text: n.borderSize + "<img id='luckysheetborderSizepreview' width=100 height=10 src='data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==' style='position:absolute;bottom:-5px;right:0px;width:100px;height:10px;'>", 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: "<canvas type='Thin' class='border-Thin' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "1", example: "" }, { text: "<canvas type='Hair' class='border-Hair' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "2", example: "" }, { text: "<canvas type='Dotted' class='border-Dotted' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "3", example: "" }, { text: "<canvas type='Dashed' class='border-Dashed' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "4", example: "" }, { text: "<canvas type='DashDot' class='border-DashDot' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "5", example: "" }, { text: "<canvas type='DashDotDot' class='border-DashDotDot' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "6", example: "" }, { text: "<canvas type='Medium' class='border-Medium' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "8", example: "" }, { text: "<canvas type='MediumDashed' class='border-MediumDashed' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "9", example: "" }, { text: "<canvas type='MediumDashDot' class='border-MediumDashDot' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "10", example: "" }, { text: "<canvas type='MediumDashDotDot' class='border-MediumDashDotDot' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", value: "11", example: "" }, { text: "<canvas type='Thick' class='border-Thick' width=120 height=10 style='width:120px;height:10px;position:static;'></canvas>", 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: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont luckysheet-iconfont-wenbenzuoduiqi" style="user-select: none;"> </div> </div>' }, { text: r.center, value: "center", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-center iconfont luckysheet-iconfont-wenbenjuzhongduiqi" style="user-select: none;"> </div> </div>' }, { text: r.right, value: "right", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-right iconfont luckysheet-iconfont-wenbenyouduiqi" style="user-select: none;"> </div> </div>' }], 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: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-top iconfont luckysheet-iconfont-dingbuduiqi" style="user-select: none;"> </div> </div>' }, { text: r.middle, value: "middle", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-middle iconfont luckysheet-iconfont-shuipingduiqi" style="user-select: none;"> </div> </div>' }, { text: r.bottom, value: "bottom", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont luckysheet-iconfont-dibuduiqi" style="user-select: none;"> </div> </div>' }], 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: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-overflow iconfont luckysheet-iconfont-yichu1" style="user-select: none;"> </div> </div>' }, { text: r.wrap, value: "wrap", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-wrap iconfont luckysheet-iconfont-zidonghuanhang" style="user-select: none;"> </div> </div>' }, { text: r.clip, value: "clip", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont luckysheet-iconfont-jieduan" style="user-select: none;"> </div> </div>' }], 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: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont luckysheet-iconfont-wuxuanzhuang" style="user-select: none;"> </div> </div>' }, { text: r.angleup, value: "angleup", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angleup iconfont luckysheet-iconfont-xiangshangqingxie" style="user-select: none;"> </div> </div>' }, { text: r.angledown, value: "angledown", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angledown iconfont luckysheet-iconfont-xiangxiaqingxie" style="user-select: none;"> </div> </div>' }, { text: r.vertical, value: "vertical", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-vertical iconfont luckysheet-iconfont-shupaiwenzi" style="user-select: none;"> </div> </div>' }, { text: r.rotationUp, value: "rotation-up", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-up iconfont luckysheet-iconfont-wenbenxiangshang" style="user-select: none;"> </div> </div>' }, { text: r.rotationDown, value: "rotation-down", example: '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-down iconfont luckysheet-iconfont-xiangxia90" style="user-select: none;"> </div> </div>' }], 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: '<i class="iconfont luckysheet-iconfont-shengxu" aria-hidden="true"></i>' }, { text: n.desc, value: "desc", example: '<i class="iconfont luckysheet-iconfont-jiangxu" aria-hidden="true"></i>' }, { text: n.custom + "...", value: "diysort", example: '<i class="iconfont luckysheet-iconfont-zidingyipaixu" aria-hidden="true"></i>' }, { text: "", value: "split", example: "" }, { text: l.filter, value: "filter", example: '<i class="iconfont luckysheet-iconfont-shaixuan2" aria-hidden="true"></i>' }, { text: l.clearFilter, value: "clearfilter", example: '<i class="iconfont luckysheet-iconfont-qingchushaixuan" aria-hidden="true"></i>' }], 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: '<i class="iconfont luckysheet-iconfont-sousuo" aria-hidden="true"></i>' }, { text: r.replace + " ...", value: "replace", example: '<i class="iconfont luckysheet-iconfont-tihuan" aria-hidden="true"></i>' }, { text: "", value: "split", example: "" }, { text: r.location + " ...", value: "location", example: '<i class="iconfont luckysheet-iconfont-dingwei" aria-hidden="true"></i>' }, { 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('<span dir="auto" class="luckysheet-formula-text-color">=</span>'), $("#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 = '<div id="luckysheet-icon-dataBar-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel" style="width: 126px;padding: 5px;top: 118.5px;left: 1321.48px;display: none;">\n <div itemvalue="0" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 0;" title="'.concat(r.gradientDataBar_1, '"></div>\n </div>\n <div itemvalue="1" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px 0;" title="').concat(r.gradientDataBar_2, '"></div>\n </div>\n <div itemvalue="2" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px 0;" title="').concat(r.gradientDataBar_3, '"></div>\n </div>\n <div itemvalue="3" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -36px;" title="').concat(r.gradientDataBar_4, '"></div>\n </div>\n <div itemvalue="4" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -36px;" title="').concat(r.gradientDataBar_5, '"></div>\n </div>\n <div itemvalue="5" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -36px;" title="').concat(r.gradientDataBar_6, '"></div>\n </div>\n <div itemvalue="6" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -72px;" title="').concat(r.solidColorDataBar_1, '"></div>\n </div>\n <div itemvalue="7" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -72px;" title="').concat(r.solidColorDataBar_2, '"></div>\n </div>\n <div itemvalue="8" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -72px;" title="').concat(r.solidColorDataBar_3, '"></div>\n </div>\n <div itemvalue="9" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -108px;" title="').concat(r.solidColorDataBar_4, '"></div>\n </div>\n <div itemvalue="10" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -108px;" title="').concat(r.solidColorDataBar_5, '"></div>\n </div>\n <div itemvalue="11" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -108px;" title="').concat(r.solidColorDataBar_6, '"></div>\n </div>\n </div>'), p = '<div id="luckysheet-icon-colorGradation-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel" style="width: 126px;padding: 5px;top: 143.5px;left: 1321.48px;display: none;">\n <div itemvalue="0" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 0;" title="'.concat(r.colorGradation_1, '"></div>\n </div>\n <div itemvalue="1" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px 0;" title="').concat(r.colorGradation_2, '"></div>\n </div>\n <div itemvalue="2" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px 0;" title="').concat(r.colorGradation_3, '"></div>\n </div>\n <div itemvalue="3" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px 0;" title="').concat(r.colorGradation_4, '"></div>\n </div>\n <div itemvalue="4" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -36px;" title="').concat(r.colorGradation_5, '"></div>\n </div>\n <div itemvalue="5" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -36px;" title="').concat(r.colorGradation_6, '"></div>\n </div>\n <div itemvalue="6" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -36px;" title="').concat(r.colorGradation_7, '"></div>\n </div>\n <div itemvalue="7" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px -36px;" title="').concat(r.colorGradation_8, '"></div>\n </div>\n <div itemvalue="8" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -72px;" title="').concat(r.colorGradation_9, '"></div>\n </div>\n <div itemvalue="9" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -72px;" title="').concat(r.colorGradation_10, '"></div>\n </div>\n <div itemvalue="10" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -72px;" title="').concat(r.colorGradation_11, '"></div>\n </div>\n <div itemvalue="11" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">\n <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px -72px;" title="').concat(r.colorGradation_12, '"></div>\n </div>\n </div>'), 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 = '<div class="box" data-itemvalue="greaterThan">\n <div class="boxTitleOne">'.concat(r.conditionformat_greaterThan_title, '</div>\n <div class="inpbox range">\n <input id="conditionVal" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div> \n ").concat(l, " \n </div>"); break; case "lessThan": t = r.conditionformat_lessThan, n = '<div class="box" data-itemvalue="lessThan">\n <div class="boxTitleOne">'.concat(r.conditionformat_lessThan_title, '</div>\n <div class="inpbox range">\n <input id="conditionVal" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "betweenness": t = r.conditionformat_betweenness, n = '<div class="box" data-itemvalue="betweenness">\n <div class="boxTitleOne">'.concat(r.conditionformat_betweenness_title, '</div>\n <div style="height: 30px;line-height: 30px;">\n <div class="inpbox2 range">\n <input id="conditionVal" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.to, '</div>\n <div class="inpbox2 range">\n <input id="conditionVal2" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "equal": t = r.conditionformat_equal, n = '<div class="box" data-itemvalue="equal">\n <div class="boxTitleOne">'.concat(r.conditionformat_equal_title, '</div>\n <div class="inpbox range">\n <input id="conditionVal" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "textContains": t = r.conditionformat_textContains, n = '<div class="box" data-itemvalue="textContains">\n <div class="boxTitleOne">'.concat(r.conditionformat_textContains_title, '</div>\n <div class="inpbox range">\n <input id="conditionVal" class="formulaInputFocus"/>\n <i class="fa fa-table" aria-hidden="true" title="').concat(r.selectCell, '"></i>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "occurrenceDate": t = r.conditionformat_occurrenceDate, n = '<div class="box" data-itemvalue="occurrenceDate">\n <div class="boxTitleOne">'.concat(r.conditionformat_occurrenceDate_title, '</div>\n <div class="inpbox">\n <input id="daterange-btn" class="formulaInputFocus" readonly="readonly" placeholder="').concat(r.pleaseSelectADate, '"/>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "duplicateValue": t = r.conditionformat_duplicateValue, n = '<div class="box" data-itemvalue="duplicateValue">\n <div class="boxTitleOne">'.concat(r.conditionformat_duplicateValue_title, '</div>\n <select id="conditionVal" class="selectbox">\n <option value="0">').concat(r.duplicateValue, '</option>\n <option value="1">').concat(r.uniqueValue, '</option>\n </select>\n <div style="margin:5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>") }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 = '<div class="box" data-itemvalue="top10">\n <div class="boxTitleOne">'.concat(r.conditionformat_top10_title, '</div>\n <div style="height: 30px;line-height: 30px;">\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.top, '</div>\n <div class="inpbox2">\n <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>\n </div>\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.oneself, '</div>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "top10%": t = r.conditionformat_top10_percent, n = '<div class="box" data-itemvalue="top10%">\n <div class="boxTitleOne">'.concat(r.conditionformat_top10_title, '</div>\n <div style="height: 30px;line-height: 30px;">\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.top, '</div>\n <div class="inpbox2">\n <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>\n </div>\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">%</div>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "last10": t = r.conditionformat_last10, n = '<div class="box" data-itemvalue="last10">\n <div class="boxTitleOne">'.concat(r.conditionformat_last10_title, '</div>\n <div style="height: 30px;line-height: 30px;">\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.last, '</div>\n <div class="inpbox2">\n <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>\n </div>\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.oneself, '</div>\n </div>\n <div style="margin: 5px 0;">').concat(r.setAs, "</div>\n ").concat(l, "\n </div>"); break; case "last10%": t = r.conditionformat_last10_percent, n = '<div class="box" data-itemvalue="last10%">\n <div class="boxTitleOne">'.concat(r.conditionformat_last10_title, '</div>\n <div style="height: 30px;line-height: 30px;">\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">').concat(r.last, '</div>\n <div class="inpbox2">\n <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>\n </div>\n <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">%</div>\n </div>\n <div style="margin:5px 0;">设置为:</div>\n ').concat(l, "\n </div>"); break; case "AboveAverage": t = r.conditionformat_AboveAverage, n = '<div class="box" data-itemvalue="AboveAverage">\n <div class="boxTitleOne">'.concat(r.conditionformat_AboveAverage_title, '</div>\n <div style="margin: 5px 0;">').concat(r.setAsByArea, "</div>\n ").concat(l, "\n </div>"); break; case "SubAverage": t = r.conditionformat_SubAverage, n = '<div class="box" data-itemvalue="SubAverage">\n <div class="boxTitleOne">'.concat(r.conditionformat_SubAverage_title, '</div>\n <div style="margin: 5px 0;">').concat(r.setAsByArea, "</div>\n ").concat(l, "\n </div>") }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: '<i class="iconfont luckysheet-iconfont-dayin" aria-hidden="true"></i>' }, { text: "", value: "split", example: "" }, { text: r.menuItemAreas, value: "areas", example: '<i class="iconfont luckysheet-iconfont-tihuan" aria-hidden="true"></i>' }, { text: r.menuItemRows, value: "rows", example: '<i class="iconfont luckysheet-iconfont-zhuandao1" aria-hidden="true"></i>' }, { text: r.menuItemColumns, value: "columns", example: '<i class="iconfont luckysheet-iconfont-dingwei" aria-hidden="true"></i>' }], 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 && $('<span id="luckysheetTextSizeTest" style="float:left;white-space:nowrap;visibility:hidden;margin:0;padding:0;">' + e + "</span>").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 = '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">' + n.toUpperCase() + '</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'; $("#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 = '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">' + n.toUpperCase() + '</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span class="luckysheet-formula-functionrange-cell" rangeindex="0" dir="auto" style="color:' + Cn[0] + ';">' + Cl(ga.currentSheetIndex, { row: a, column: r }, ga.currentSheetIndex) + '</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'; $("#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 = "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" + e + "'>" + e + "</span>", 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 = "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" + n + "'>" + n + "</span>", 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 = "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" + o.fontName + "'>" + o.fontName + "</span>", 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 = '<div class="box"><div class="boxTitle">' + t.splitDelimiters + '</div><div class="boxMain"><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_01" type="checkbox"/><label for="splitColumn_type_01">' + a.tab + '</label></div><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_02" type="checkbox"/><label for="splitColumn_type_02">' + a.semicolon + '</label></div><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_03" type="checkbox"/><label for="splitColumn_type_03">' + a.comma + '</label></div><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_04" type="checkbox"/><label for="splitColumn_type_04">' + a.space + '</label></div><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_05" type="checkbox"/><label for="splitColumn_type_05">' + t.splitOther + '</label><input type="text" class="formulaInputFocus" maxlength="1"/></div></div><div style="height: 22px;line-height: 22px;"><input id="splitColumn_type_06" type="checkbox"/><label for="splitColumn_type_06">' + t.splitContinueSymbol + '</label></div><div class="boxTitle" style="margin-top: 10px;">' + t.splitDataPreview + '</div><div class="boxMain" id="splitColumnData"></div></div>'; $("body").append(_m(bn, { id: "luckysheet-splitColumn-dialog", addclass: "luckysheet-splitColumn-dialog", title: t.splitTextTitle, content: n, botton: '<button id="luckysheet-splitColumn-dialog-confirm" class="btn btn-primary">' + r.confirm + '</button><button class="btn btn-default luckysheet-model-close-btn">' + r.cancel + "</button>", 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 += "<td>" + e[a][n] + "</td>"; t += "<tr>" + r + "</tr>" } var l = "<table>" + t + "</table>"; $("#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 <div class="luckysheet-cellFormat-menu-c">\n <div class="luckysheet-cellFormat-menu luckysheet-cellFormat-menu-active" id="luckysheet-cellFormat-protection">\n '.concat(t.protection, '\n </div>\n </div>\n <div id="luckysheet-cellFormat-protection-content" class="luckysheet-cellFormat-content">\n <div class="luckysheet-cellFormat-protection">\n <p>\n ').concat(t.protectionTips, '\n </p>\n <label for="luckysheet-protection-check-locked"><input id="luckysheet-protection-check-locked" name="luckysheet-protection-check-locked" type="checkbox">').concat(t.locked, '</label><span>部分选中</span>\n <br/>\n <label for="luckysheet-protection-check-hidden"><input id="luckysheet-protection-check-hidden" name="luckysheet-protection-check-hidden" type="checkbox">').concat(t.hidden, "</label><span>全部选中</span>\n </div>\n </div>\n "), botton: '<button id="luckysheet-cellFormat-confirm" class="btn btn-primary">'.concat(a.confirm, '</button>\n <button class="btn btn-default luckysheet-model-close-btn">').concat(a.cancel, "</button>"), 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('<i class="fa fa-check luckysheet-mousedown-cancel"></i>') })) })), 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('<i class="fa fa-exclamation-triangle"></i>', 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('<i class="fa fa-exclamation-triangle"></i>', 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 = $("<canvas>").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, '<div id="luckysheet-confirm-screenshot-save" style="height:' + k + 'px;overflow:auto;"></div>', 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("<tr.*?>(.*?)</tr>", "g"), i = new RegExp("<td.*?>(.*?)</td>", "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(/<td.*?>/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('<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + e + ';"></div>'); 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("<span class='luckysheet-input-box-index-sheettxt'>" + Sh.getSheetName(Ih.rangetosheet) + "!</span>").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 + "】?", "<span style='color:#9e9e9e;font-size:12px;'>" + e.redoDelete + "</span>", (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 = '<i class="fa fa-check" aria-hidden="true"></i>'), 1 == n.hide && (l = '<i class="fa fa-low-vision" aria-hidden="true"></i>', o += "color:#BBBBBB;"), null != n.color && n.color.length > 0 && (o += "border-right:4px solid " + n.color + ";"), a += _m('<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" id="luckysheet-sheet-btn${index}" data-index="${index}"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="${style}" ><span class="icon luckysheet-mousedown-cancel">${icon}</span>${name}</div></div>', { index: n.index, name: n.name, icon: l, style: o }) } i ? ($("#" + ga.container).append(_m('<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel" id="luckysheet-sheet-list">${item}</div>', { 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("<br/>"), 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"), '<div id="luckysheet-chart-rangeShow-' + e + '" style="left: ' + u + "px;width: " + (c - u - 1) + "px;top: " + s + "px;height: " + (o - s - 1) + 'px;border: none;margin: 0;position: absolute;z-index: 14;"><div class="luckysheet-chart-rangeShow-move" data-type="top" style="height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' + d + ';position: absolute;left: 0;right: 0;top: -2px;z-index: 18;opacity: 0.9;cursor: move;"></div><div class="luckysheet-chart-rangeShow-move" data-type="right" style="width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' + d + ';position: absolute;top: 0;bottom: 0;right: -2px;z-index: 18;opacity: 0.9;cursor: move;"></div><div class="luckysheet-chart-rangeShow-move" data-type="bottom" style="height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' + d + ';position: absolute;left: 0;right: 0;bottom: -2px;z-index: 18;opacity: 0.9;cursor: move;"></div><div class="luckysheet-chart-rangeShow-move" data-type="left" style="width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' + d + ';position: absolute;top: 0;bottom: 0;left: -2px;z-index: 18;opacity: 0.9;cursor: move;"></div><div style="border: 2px solid #85c0fc;background: ' + d + ';position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 15;opacity: 0.1;"></div><div class="luckysheet-chart-rangeShow-resize" data-type="lt" style="width: 6px;height: 6px;border: 1px solid #fff;background: ' + d + ';position: absolute;left: -3px;top: -3px;z-index: 19;cursor: se-resize;"></div><div class="luckysheet-chart-rangeShow-resize" data-type="rt" style="width: 6px;height: 6px;border: 1px solid #fff;background: ' + d + ';position: absolute;right: -3px;top: -3px;z-index: 19;cursor: ne-resize;"></div><div class="luckysheet-chart-rangeShow-resize" data-type="lb" style="width: 6px;height: 6px;border: 1px solid #fff;background: ' + d + ';position: absolute;left: -3px;bottom: -3px;z-index: 19;cursor: ne-resize;"></div><div class="luckysheet-chart-rangeShow-resize" data-type="rb" style="width: 6px;height: 6px;border: 1px solid #fff;background: ' + d + ';position: absolute;right: -3px;bottom: -3px;z-index: 19;cursor: se-resize;"></div></div>' } }, 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('<div style="width:100%;text-align:center;position:relative;top:45%;font-size:14px;"><div class="luckysheetLoaderGif"></div><span>' + a.filiterMoreDataTip + "</span></div>"); 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 ? '<div class="day luckysheet-mousedown-cancel cf" data-check="false" title="' + x + "-" + R + "-" + q + '"><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + S + '</label><span class="count luckysheet-mousedown-cancel">( ' + I + " )</span></div>" : '<div class="day luckysheet-mousedown-cancel cf" data-check="true" title="' + x + "-" + R + "-" + q + '"><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + S + '</label><span class="count luckysheet-mousedown-cancel">( ' + I + " )</span></div>" } w += T; var D = void 0; D = Number(C) < 10 ? "0" + Number(C) : C, _ += x in t && C in t ? '<div class="monthBox luckysheet-mousedown-cancel"><div class="month luckysheet-mousedown-cancel cf" data-check="false" title="' + x + "-" + D + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + C + a.filiterMonthText + '</label><span class="count luckysheet-mousedown-cancel">( ' + T + ' )</span></div><div class="dayList luckysheet-mousedown-cancel">' + A + "</div></div>" : '<div class="monthBox luckysheet-mousedown-cancel"><div class="month luckysheet-mousedown-cancel cf" data-check="true" title="' + x + "-" + D + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + C + a.filiterMonthText + '</label><span class="count luckysheet-mousedown-cancel">( ' + T + ' )</span></div><div class="dayList luckysheet-mousedown-cancel">' + A + "</div></div>" } var F = void 0; F = x in t ? '<div class="yearBox luckysheet-mousedown-cancel"><div class="year luckysheet-mousedown-cancel cf" data-check="false" title="' + x + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + x + a.filiterYearText + '</label><span class="count luckysheet-mousedown-cancel">( ' + w + ' )</span></div><div class="monthList luckysheet-mousedown-cancel">' + _ + "</div></div>" : '<div class="yearBox luckysheet-mousedown-cancel"><div class="year luckysheet-mousedown-cancel cf" data-check="true" title="' + x + '"><i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + x + a.filiterYearText + '</label><span class="count luckysheet-mousedown-cancel">( ' + w + ' )</span></div><div class="monthList luckysheet-mousedown-cancel">' + _ + "</div></div>", 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 ? '<div class="textBox luckysheet-mousedown-cancel cf" data-check="false" data-filter="' + N + "#$$$#" + P + '" title="' + z + '"><input class="luckysheet-mousedown-cancel" type="checkbox"/><label class="luckysheet-mousedown-cancel">' + z + '</label><span class="luckysheet-mousedown-cancel count">( ' + n[N][P] + " )</span></div>" : '<div class="textBox luckysheet-mousedown-cancel cf" data-check="true" data-filter="' + N + "#$$$#" + P + '" title="' + z + '"><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/><label class="luckysheet-mousedown-cancel">' + z + '</label><span class="luckysheet-mousedown-cancel count">( ' + n[N][P] + " )</span></div>", k.push(L) } } } $("#luckysheet-filter-byvalue-select").html("<div class='ListBox luckysheet-mousedown-cancel' style='min-height: 100px; max-height: " + (l - r.top - 350) + "px; overflow-y: auto; overflow-x: hidden;'><table cellspacing='0' style='width:100%;' class='luckysheet-mousedown-cancel'>" + k.join("") + "</table></div>") }), 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 += '<div class="item luckysheet-mousedown-cancel"><label class="luckysheet-mousedown-cancel" style="background-color: ' + y + '" title="' + y + '"></label><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/></div>' : v += '<div class="item luckysheet-mousedown-cancel"><label class="luckysheet-mousedown-cancel" style="background-color: ' + y + '" title="' + y + '"></label><input class="luckysheet-mousedown-cancel" type="checkbox"/></div>'; g = '<div id="filterBgColor" class="box luckysheet-mousedown-cancel"><div class="title luckysheet-mousedown-cancel">' + a.filiterByColorTip + '</div><div style="max-height:128px;overflow:auto;" class="luckysheet-mousedown-cancel">' + v + "</div></div>" } 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 += '<div class="item luckysheet-mousedown-cancel"><label class="luckysheet-mousedown-cancel" style="background-color: ' + w + '" title="' + w + '"></label><input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/></div>' : x += '<div class="item luckysheet-mousedown-cancel"><label class="luckysheet-mousedown-cancel" style="background-color: ' + w + '" title="' + w + '"></label><input class="luckysheet-mousedown-cancel" type="checkbox"/></div>'; k = '<div id="filterFcColor" class="box luckysheet-mousedown-cancel"><div class="title luckysheet-mousedown-cancel">' + a.filiterByTextColorTip + '</div><div style="max-height:128px;overflow:auto;" class="luckysheet-mousedown-cancel">' + x + "</div></div>" } b = "" == g && "" == k ? '<div class="luckysheet-mousedown-cancel" style="padding: 10px 30px;text-align: center;">' + a.filterContainerOneColorTip + "</div>" : g + k + '<div class="luckysheet-mousedown-cancel"><button id="luckysheet-filter-orderby-color-confirm" class="btn btn-primary luckysheet-mousedown-cancel" style="margin: 5px 20px;width: 70px;">' + r.confirm + "</button></div>", $("#luckysheet-filter-orderby-color-submenu").remove(), $("body").append('<div id="luckysheet-filter-orderby-color-submenu" class="luckysheet-cols-menu luckysheet-mousedown-cancel">' + b + "</div>"); 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('<span dir="auto" class="luckysheet-formula-text-color">=</span>'), $("#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 = '<div style="overflow: hidden;" class="luckysheet-sort-modal"><div><label><input type="checkbox" id="luckysheet-sort-haveheader"/><span>'.concat(a.hasTitle, '</span></label></div><div style="overflow-y:auto;" id="luckysheet-sort-dialog-tablec"><table data-itemcount="0" cellspacing="0"> <tr><td>').concat(a.hasTitle, ' <select name="sort_0"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> </td> <td> <div><label><input value="asc" type="radio" checked="checked" name="sort_0"><span>').concat(a.asc, 'A-Z</span></label></div> <div><label><input value="desc" type="radio" name="sort_0"><span>').concat(a.desc, 'Z-A</span></label></div></td></tr></table></div><div style="background: #e5e5e5;border-top: 1px solid #f5f5f5; height: 1px; width: 100%;margin:2px 0px;margin-bottom:10px;"></div> <div> <span style="font-weight: bold; text-decoration: underline;text-align:center;color: blue;cursor: pointer;" class="luckysheet-sort-dialog-additem">+ ').concat(a.addOthers, "</span> </div> </div>"); $("body").append(_m(bn, { id: "luckysheet-sort-dialog", addclass: "", title: e.sort.sortTitle, content: s, botton: '<button id="luckysheet-sort-modal-confirm" class="btn btn-primary">'.concat(a.confirm, '</button><button class="btn btn-default luckysheet-model-close-btn">').concat(a.close, "</button>") })), $("#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 += '<option value="' + s + '">' + c + "</option>" } else l += '<option value="' + s + '">' + Im(s) + "</option>"; $("#luckysheet-sort-dialog table").append('\n <tr class="luckysheet-sort-dialog-tr">\n <td><span class="luckysheet-sort-item-close" onclick="$(this).parent().parent().remove();"><i class="fa fa-times"\n aria-hidden="true"></i></span>'.concat(a.secondaryTitle, ' <select\n name="sort_').concat(i, '">').concat(l, '</select> </td>\n <td>\n <div><label><input value="asc" type="radio" checked="checked"\n name="sort_').concat(i, '"><span>').concat(a.asc, 'A-Z</span></label></div>\n <div><label><input value="desc" type="radio" name="sort_').concat(i, '"><span>').concat(a.desc, "Z-A</span></label>\n </div>\n </td>\n </tr>\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 += '<option value="' + o + '">' + s + "</option>" } else i += '<option value="' + o + '">' + Im(o) + "</option>"; $("#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 += '<option value="' + u + '">' + Im(u) + "</option>"; $("#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 + "<span>" + Im(i) + (n + 1) + "</span>" + a.sortRangeTitleTo + "<span>" + Im(o) + (l + 1) + "</span>"); 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 <img> or <canvas> 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 = '<div class="cropper-container" touch-action="none"><div class="cropper-wrap-box"><div class="cropper-canvas"></div></div><div class="cropper-drag-box"></div><div class="cropper-crop-box"><span class="cropper-view-box"></span><span class="cropper-dashed dashed-h"></span><span class="cropper-dashed dashed-v"></span><span class="cropper-center"></span><span class="cropper-face"></span><span class="cropper-line line-e" data-cropper-action="e"></span><span class="cropper-line line-n" data-cropper-action="n"></span><span class="cropper-line line-w" data-cropper-action="w"></span><span class="cropper-line line-s" data-cropper-action="s"></span><span class="cropper-point point-e" data-cropper-action="e"></span><span class="cropper-point point-n" data-cropper-action="n"></span><span class="cropper-point point-w" data-cropper-action="w"></span><span class="cropper-point point-s" data-cropper-action="s"></span><span class="cropper-point point-ne" data-cropper-action="ne"></span><span class="cropper-point point-nw" data-cropper-action="nw"></span><span class="cropper-point point-sw" data-cropper-action="sw"></span><span class="cropper-point point-se" data-cropper-action="se"></span></div></div>'; 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 = () => `<p>${C("services.default.heading")}</p>` } } class j extends R { constructor() { super(...arguments), this.name = "uploading", this.invisible = !0, this.template = () => `<div class="uppload-loader">\n <div></div>\n <p class="uppload-loader-text">${C("uploading")}<span class="progress"></span></p>\n </div>` } } 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 <div class="microlink-container">\n <form class="microlink-search-form">\n <div class="service-icon">${O(this.icon, this)}</div>\n <label>\n <span>${t(`services.${this.name}.label`) || t("services.microlink.label", [t(`services.${this.name}.title`) || this.name, t(`services.${this.name}.type`) || t("services.microlink.type")])}</span>\n <input class="microlink-search-input" type="url" placeholder="${t(`services.${this.name}.placeholder`) || t("services.microlink.placeholder", [t(`services.${this.name}.title`) || this.name, t(`services.${this.name}.type`) || t("services.microlink.type")]) || ""}" required>\n </label>\n <button type="submit" style="background: ${this.color}">${t(`services.${this.name}.button`) || t("services.microlink.button", t(`services.${this.name}.title`) || this.name)}</button></form><button class="need-help-link"><span>${t("needHelp")}</span aria-hidden="true"><span>?</span></button></div>\n <div class="uppload-loader microlink-loader">\n <div></div>\n <p>${t(`services.${this.name}.loading`) || t("services.microlink.loading", t(`services.${this.name}.title`) || this.name) || t("fetching", t(`services.${this.name}.title`))}</p>\n </div>`, 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 <div class="search-container"><form class="search-search-form">\n <div class="service-icon">${O(this.icon, this)}</div>\n <label><span>${t(`services.${this.name}.label`) || t("services.search.label")}</span>\n <input class="search-search-input" type="search" placeholder="${t("services.search.placeholder")}" required></label>\n <button type="submit" style="background: ${this.color}">${t("services.search.button", t(`services.${this.name}.title`))}</button>\n </form>\n <div class="search-images"></div>\n <p class="search-footer">${t("services.search.imagesPoweredBy", `<a href="${this.poweredByUrl}" target="_blank">${t(`services.${this.name}.title`)}</a>`)}</p></div>\n <button class="need-help-link"><span>${t("needHelp")}</span aria-hidden="true"><span>?</span></button>\n <div class="uppload-loader search-loader">\n <div></div>\n <p>${t("fetching", t(`services.${this.name}.title`))}</p>\n </div>\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 <div class="uppload-hue-image">\n <img style="width: 20px" alt="" src="${i}">\n </div>\n <div class="settings">\n <input type="range" value="${this.value}" min="0" max="${this.max}">\n <span class="value"><span>0</span>${e(`units.${this.unit}`) || this.unit}</span>\n </div>\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 => `<div data-uppload-service="${e.name}" class="uppload-service-name">\n ${t ? `<input type="radio" id="uppload-service-radio-${e.name}" value="${e.name}" name="uppload-radio">` : ""}\n <${t ? `label for="uppload-service-radio-${e.name}"` : "button"} data-uppload-service="${e.name}">\n ${e.icon.startsWith("http") ? `<img class="service-icon" alt="" src="${e.icon}">` : O(e.icon, e)}\n <span>${this.lang.services && this.lang.services[e.name] && this.lang.services[e.name].title ? this.lang.services[e.name].title : e.name}</span>\n </${t ? "label" : "button"}>\n </div>`).join("")}\n </${t ? "nav" : "div"}>` } getEffectsNavbar() { return `<div class="effects-continue">\n <button class="effects-continue--cancel">Cancel</button>\n </div><div class="effects-tabs"><div class="effects-tabs-flow">\n ${this.effects.map(t => `\n <input type="radio" id="uppload-effect-radio-${t.name}" value="${t.name}" name="uppload-effect-radio">\n <label for="uppload-effect-radio-${t.name}">\n ${t.icon.startsWith("http") ? `<img class="effect-icon" alt="" src="${t.icon}">` : O(t.icon, t)}\n <span>${this.lang.effects && this.lang.effects[t.name] && this.lang.effects[t.name].title ? this.lang.effects[t.name].title : t.name}</span>\n </label>\n `).join("")}\n </div></div><div class="effects-continue">\n <button class="effects-continue--upload">Upload</button>\n </div>` } renderContainer() { this.container && (this.container.innerHTML = `\n <div class="uppload-modal">\n <aside style="display: none">\n ${this.getNavbar(!0)}\n </aside>\n <section>\n ${this.error ? `<div class="uppload-error">${this.error}</div>` : ""}\n <div class="uppload-active-container"></div>\n <footer style="display: none" class="effects-nav">${this.getEffectsNavbar()}</footer>\n </section>\n <div class="uppload-help-loading">\n <div class="uppload-loader">\n <div></div>\n <p class="uppload-loader-text">${C("help.loading")}</p>\n </div>\n </div>\n <div class="uppload-help">\n <div><button><span>${C("help.close")}</span><span aria-hidden="true">&times;</span></button></div>\n <iframe></iframe>\n </div>\n </div>\n <div class="uppload-modal-bg">\n <button class="uppload-close" aria-label="Close">&times;</button>\n </div>\n `) } render() { return `\n ${this.error ? `<div class="uppload-error">${this.error}</div>` : ""}\n ${this.activeEffect ? `<div class="uppload-effect uppload-effect--${this.activeEffect || "none"}">\n ${this.activeEffect && this.file ? this.renderActiveEffect(this.file) : ""}\n </div>` : `<div class="uppload-service uppload-service--${this.activeService}">\n ${this.activeEffect && this.file ? "" : this.renderActiveService()}\n ${"default" === this.activeService ? this.getNavbar() : ""}\n </div>`}` } 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 <div class="active-effect-container">${"function" == typeof i.template ? i.template({ file: t, translate: C }) : ""}</div>\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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M63 65l17-33c2-3 5-5 9-5h78c4 0 8 2 9 5l17 33h33c17 0 30 13 30 29v106c0 16-13 29-30 29H30c-17 0-30-13-30-29V94c0-16 13-29 30-29h33zm65 126c27 0 49-22 49-49 0-26-22-48-49-48s-49 22-49 48c0 27 22 49 49 49zm0-20c-16 0-30-13-30-29s14-28 30-28 30 12 30 28-14 29-30 29zm79-48c5 0 10-4 10-9 0-6-5-10-10-10-6 0-10 4-10 10 0 5 4 9 10 9z" fill="#000" fill-rule="nonzero"/></svg>', 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 <div class="service-main">\n <div class="camera-waiting">${t("services.camera.waiting")}</div>\n <div class="camera-error">\n <p>${t("services.camera.unableToRead")}</p>\n <p><a href="https://uppload.js.org/help/camera" target="_blank">${t("needHelp")}</a></p>\n </div>\n <div class="camera-success">\n <video class="camera-stream"></video>\n </div>\n </div>\n <footer class="service-footer">\n \x3c!--<button\n class="camera-switch uppload-button"\n >${t("services.camera.switch")}</button>--\x3e\n <button\n class="camera-click uppload-button uppload-button--cta"\n style="background: ${this.color}"\n >${t("services.camera.button")}</button>\n </footer>\n <button class="need-help-link"><span>${t("needHelp")}</span aria-hidden="true"><span>?</span></button>\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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M180.8.8a94 94 0 0131 6 62.7 62.7 0 0122.7 14.7 62.7 62.7 0 0114.7 22.7 94 94 0 016 31c.6 13.1.7 17.7.8 48.8v8c0 31.1-.2 35.7-.8 48.8a94 94 0 01-6 31 65.4 65.4 0 01-37.4 37.4 94 94 0 01-31 6c-13.1.6-17.7.7-48.8.8h-8c-31.1 0-35.7-.2-48.8-.8a94 94 0 01-31-6 62.7 62.7 0 01-22.7-14.7 62.7 62.7 0 01-14.7-22.7 94 94 0 01-6-31c-.6-12.9-.7-17.5-.8-47V123c0-30.2.2-34.8.8-47.8a94 94 0 016-31 62.7 62.7 0 0114.7-22.7A62.7 62.7 0 0144.2 6.8a94 94 0 0131-6 811 811 0 0147-.8H133c30.2 0 34.8.2 47.8.8zM132 26h-8.7c-23.4 0-27.1.1-37.4.6a74.9 74.9 0 00-24.7 4.8 50 50 0 00-18 11.7 50 50 0 00-11.8 18A74.9 74.9 0 0026.6 86c-.4 10.2-.6 13.9-.6 36.6v11c0 22.7.2 26.4.6 36.6a74.9 74.9 0 004.8 24.7 50 50 0 0011.7 18 50 50 0 0018 11.8 74.9 74.9 0 0024.8 4.8c10.5.5 14.1.6 38.9.6h6.4c24.8 0 28.4-.1 38.9-.6a74.9 74.9 0 0024.7-4.8 52.2 52.2 0 0029.8-29.8 74.9 74.9 0 004.8-24.7c.5-10.5.6-14.1.6-39v-6.3c0-24.8-.1-28.4-.6-38.9a74.9 74.9 0 00-4.8-24.7 50 50 0 00-11.7-18 50 50 0 00-18-11.8 74.9 74.9 0 00-24.8-4.8c-10.4-.5-14-.6-38.1-.6zm0 18.4c23.6 0 27 .1 37.2.6 10 .4 15.4 2 19 3.5 4.4 1.6 8.4 4.2 11.7 7.6 3.4 3.3 6 7.3 7.6 11.7 1.4 3.6 3 9 3.5 19 .5 10.2.6 13.6.6 37.3v7.8c0 23.7-.1 27-.6 37.3-.4 10-2 15.4-3.5 19a33.8 33.8 0 01-19.3 19.3c-3.6 1.4-9 3-19 3.5-10.3.5-13.7.6-38 .6h-7a643 643 0 01-37.4-.6c-10-.4-15.4-2-19-3.5a31.6 31.6 0 01-11.7-7.6c-3.4-3.3-6-7.3-7.6-11.7-1.4-3.6-3-9-3.5-19-.5-10.3-.6-13.7-.6-38v-7c0-23.8.1-27.2.6-37.4.4-10 2-15.4 3.5-19 1.6-4.4 4.2-8.4 7.6-11.7 3.3-3.4 7.3-6 11.7-7.6 3.6-1.4 9-3 19-3.5 10.2-.5 13.6-.6 37.3-.6zM128.4 75a52.5 52.5 0 100 105 52.5 52.5 0 000-105zm0 18.4a34 34 0 110 68.2 34 34 0 010-68.2zM182 62a12 12 0 100 24 12 12 0 000-24z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M128 0c71 0 128 58 128 129 0 64-47 117-108 127v-89h30l6-38h-36v-24c0-10 5-20 21-20h16V53s-15-3-29-3c-29 0-48 18-48 50v29H75v37h1v1h32v89C47 246 1 194 0 131v-2C0 58 57 0 128 0z" fill="#000" fill-rule="nonzero"/></svg>', 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: '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M137 91c5 30-13 60-40 72-16 8-35 6-52 6H27v56H0V96a69 69 0 0169-65c33-1 65 26 68 60zm13-55l33 48h1l33-48h33l-46 68 52 71h-34l-38-52h-1l-38 52h-34l52-71-46-68h33zM33 80c-7 12-5 26-5 39v23h41c19 0 38-15 41-35 4-19-9-40-28-46-18-7-40 2-49 19z" fill="#000" fill-rule="nonzero"/></svg>', 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 => `<div class="result">\n <button aria-label="${t.tags}" data-full-url="${t.largeImageURL}" style="background-image: url('${t.previewURL}')"></button><small class="author">\n <img alt="" src="${t.userImageURL}">\n <span>${t.user}</span>\n </small></div>`, 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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero"><path d="M177 56L125 4l-3-2v57h57c0-2-1-3-2-3z"/><path d="M173 113h8V75h-66c-5 0-8-4-8-8V1H27c-4 0-8 4-8 8v184c0 4 4 8 8 8h65v-8c0-45 36-80 81-80z"/><path d="M173 128c-36 0-65 29-65 64s29 64 65 64c35 0 64-29 64-64s-29-64-64-64zm27 63h-14v33c0 2-2 3-4 3h-20c-2 0-3-1-3-3v-33h-14c-3 0-5-3-3-5l28-30c1-2 3-2 5 0l27 30c2 2 1 5-2 5z"/></g></svg>', this.color = "#34495e", this.mimeTypes = ["image/gif", "image/jpeg", "image/jpg", "image/png"], this.maxFileSize = 1 / 0, this.template = t => `<div class="drop-area">\n <div>${t.translate("services.local.drop")}</div>\n <em>${t.translate("services.local.or")}</em>\n <button class="uppload-button uppload-button--cta" style="background: ${this.color}">${t.translate("services.local.button")}</button>\n </div>\n <div class="alternate-input">\n <input type="file" accept="${this.mimeTypes.join()}"${t.uppload.settings.multiple ? " multiple" : ""}></div><button class="need-help-link"><span>${C("needHelp")}</span aria-hidden="true"><span>?</span></button>`, 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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero"><path d="M200 151l36-36a67 67 0 10-95-95L89 72a67 67 0 0012 105l28-28a31 31 0 01-14-51l52-52a31 31 0 0143 43l-15 15c6 15 8 31 5 47z"/><path d="M56 105l-36 36a67 67 0 1095 95l52-52a67 67 0 00-12-105l-28 28a31 31 0 0114 51l-52 52a31 31 0 01-43-43l15-15c-6-15-8-31-5-47z"/></g></svg>', this.color = "#8e44ad" } }, window.uppload_Screenshot = class extends V { constructor() { super(...arguments), this.name = "screenshot", this.icon = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M189 256h-25v-54h39v-38h53v92h-67zM0 210v-46h53v38h40v54H0v-46zm151-34h-10v-20h15v-15h20v35h-25zm-71-17v-18h20v15h15v20H80v-17zm0-62V80h35v20h-15v15H80V97zm76 10v-7h-15V80h35v35h-20v-8zM0 46V0h93v53H53v39H0V46zm203 27V53h-39V0h92v92h-53V73z" fill="#000" fill-rule="nonzero"/></svg>', this.color = "#e67e22" } }, window.uppload_GIPHY = class extends X { constructor(t) { super({ apiKey: t, name: "giphy", icon: '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><path fill="#000" d="M54 29h149v198H54z"/><path fill="#04FF8E" d="M24 22h30v212H24z"/><path fill="#8E2EFF" d="M203 80h30v154h-30z"/><path fill="#00C5FF" d="M24 227h209v29H24z"/><path fill="#FFF152" d="M24 0h119v29H24z"/><path fill="#FF5B5B" d="M203 59V29h-30V0h-30v88h90V59"/><path fill="#551C99" d="M203 117V88h30"/><path fill="#999131" d="M143 0v29h-29"/></g></svg>', 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 => `<div class="result">\n <button aria-label="${t.title}" data-full-url="${t.images.downsized_large.url}" style="background-image: url('${t.images.preview_gif.url}')"></button></div>`, getSearchResults: t => t.data, getPopularResults: t => t.data }) } }, window.uppload_Unsplash = class extends X { constructor(t) { super({ apiKey: t, name: "unsplash", icon: '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M81 113v72h94v-72h81v143H0V113h81zM175 0v71H81V0h94z" fill="#000" fill-rule="evenodd"/></svg>', 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 => `<div class="result">\n <button aria-label="${t.alt_description}" data-full-url="${t.urls.regular}" style="background-image: url('${t.urls.thumb}')"></button>\n <small class="author">\n <img alt="" src="${t.user.profile_image.small}">\n <span>${t.user.name}</span>\n </small>\n </div>`, getSearchResults: t => t.results, getPopularResults: t => t }) } }, window.uppload_Pexels = class extends X { constructor(t) { super({ apiKey: t, name: "pexels", icon: '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M21 0h-4v255l72 1h71v-35l1-35 4-1a97 97 0 0053-33 81 81 0 0013-22l7-22v-3-23-2l-1-3v-2a95 95 0 00-42-60l-3-3-13-6a98 98 0 00-30-6H21zm130 37a85 85 0 008 1l11 5a57 57 0 0131 62c-5 23-23 41-45 45l-20 1h-12v68H53v-91l1-91h97z" fill="#000" fill-rule="nonzero"/></svg>', 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 => `<div class="result">\n <button aria-label="" data-full-url="${t.src.large2x}" style="background-image: url('${t.src.tiny}')"></button><small class="author">\n <span>${t.photographer}</span>\n </small></div>`, 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M128 0a128 128 0 00-47 247c-1-10-2-25 1-36l15-64s-4-8-4-19c0-18 10-31 23-31 11 0 16 8 16 18 0 11-7 27-11 43-3 12 7 23 19 23 23 0 41-24 41-59 0-31-22-52-54-52-36 0-58 27-58 55 0 11 5 23 10 30l1 3-4 15c0 2-1 3-4 1-16-7-26-30-26-49 0-41 30-78 85-78 44 0 79 32 79 74 0 44-28 80-67 80-13 0-25-7-29-15l-8 31c-3 11-11 25-16 33A128 128 0 10128 0z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><path d="M117 128a59 59 0 11-118 0 59 59 0 01118 0z" fill="#0063DC"/><path d="M257 128a59 59 0 11-118 0 59 59 0 01118 0z" fill="#FF0084"/></g></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M16 64L128 0l111 64v128l-111 64-112-64 44-26 68 39c22-13 45-25 67-39v-51l-67 39L16 90V64zm66 13l46 26 45-26-45-26-46 26z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path fill="#000" fill-rule="nonzero" d="M208 44V0h-49l-2 5-22 35-7 9H49v66h44l5 5-49 89v47h49l2-5 24-42 4-6h80v-62h-44l-5-4z"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M158 189l30 51H45c-10 0-19-5-23-14L0 189h158zM100 15h45c10 0 18 5 23 13v1l84 146a26 26 0 01-1 29v1l-21 35L100 15h45zM79 51l58 101H21L79 51z" fill="#000" fill-rule="evenodd"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M81 232A148 148 0 00230 76c10-8 19-17 26-27-9 4-20 7-30 8 11-7 19-17 23-29-10 6-21 10-33 13a52 52 0 00-90 47C82 86 44 65 18 34a52 52 0 0016 70c-9-1-17-3-24-7v1c0 25 18 47 42 51a53 53 0 01-23 1c6 21 26 36 49 37a105 105 0 01-78 21c23 15 51 24 81 24" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero"><path opacity=".8" d="M85 85h85v85H85z"/><path opacity=".9" d="M85 0h171v85H85z"/><path d="M0 0h85v256H0z"/></g></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M188 105c-2-10-8-16-17-18l4-1c15-4 20-13 17-28l-7-38c-3-17-13-20-21-20l-19 4-77 22c-5 2-12 4-16 11-3 6-2 14-1 19l53 183c3 11 10 17 20 17h4l28-8c12-3 18-13 16-24l-3-11-13-67 3-1 13-3c13-3 19-12 17-25l-1-12zm-29 28l-22 5-5 2 13 64 5 25c1 5-2 9-7 11l-17 4c-5 1-9-2-11-8l-14-51L63 52c-3-9-1-12 8-14l77-22c9-3 13 0 15 9l8 39c1 8-1 11-9 14l-43 12 5 18 30-6c7-1 10 2 12 9l1 10c1 7-1 11-8 12z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M19 256h218c10 0 19-8 19-18V18c0-10-8-18-19-18H19C9 0 0 8 0 18v220c0 10 8 18 19 18h218zM58 83c-13 0-21-9-21-20s8-20 22-20c13 0 21 9 21 20s-8 20-22 20zm80 131H99V99h39v16c5-8 14-19 34-19h1c25 0 44 17 44 52v66h-39v-62c0-15-5-26-19-26-11 0-17 7-20 14l-1 10v64zm-60 0H39V99h39v115zm60-99h-1 1z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M152 164v3c-5 5-13 7-24 7s-19-2-24-7v-3h3c4 4 11 6 21 6s17-2 21-6h3zm-37-26a10 10 0 00-20 0 10 10 0 0020 0zm141-10a128 128 0 11-256 0 128 128 0 01256 0zm-53-1a17 17 0 00-28-12c-12-8-27-12-44-13l10-29 25 6h-1a14 14 0 0028 0 13 13 0 00-27-5l-26-6c-2 0-3 0-3 2l-11 32c-17 0-33 5-45 13a16 16 0 00-28 12c0 6 4 11 9 14l-1 5c0 24 30 44 67 44 36 0 66-20 66-44v-5c5-3 9-8 9-14zm-52 1c-6 0-10 5-10 10a10 10 0 0020 0c0-5-5-10-10-10z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M164 209c-21 0-25-15-26-25v-76h49V65h-48V0h-39l-2 2c-2 20-11 55-51 69v37h30v80c0 28 18 69 75 68 19 0 41-8 45-15l-12-37c-5 3-14 5-21 5z" fill="#000" fill-rule="evenodd"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M231 36c-18-16-40-23-64-13-12 5-24 11-34 20l-5 5-5-5c-10-8-20-15-31-20s-22-8-35-6C25 22-2 56 0 89l1 15c5 31 22 55 44 77a364 364 0 0083 59l5-3c23-13 45-28 65-45 21-20 40-41 51-68 13-34 8-66-18-88z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path fill="#000" d="M128 0l37 37h54v54l37 37-37 37v54h-54l-37 37-37-37H37v-54L0 128l37-37V37h54l37-37zm0 53a75 75 0 100 150 75 75 0 000-150zm0 21a54 54 0 110 108 54 54 0 010-108z"/></svg>', 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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M74 0v182h134v-25h-26V74H99V48h96c4 0 7 1 9 4 3 2 4 5 4 9v121h48v26h-48v48h-26v-48H61a13 13 0 01-13-13V74H0V48h48V0h26z" fill="#000" fill-rule="nonzero"/></svg>', 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 <div class="uppload-cropping-element">\n <img style="width: 20px" alt="" src="${URL.createObjectURL(t)}">\n </div>\n ${this.aspectRatio || this.hideAspectRatioSettings ? "" : `<div class="uppload-actions">\n ${Object.keys(this.aspectRatioOptions).map((t, i) => `\n <input value="${this.aspectRatioOptions[t]}" data-name="${t}" name="crop-aspect-ratio" type="radio"${i ? "" : " checked"} id="crop-aspect-ratio-${t}">\n <label for="crop-aspect-ratio-${t}">${e(`effects.crop.aspectRatios.${t}`) || t}</label>`).join("")}\n </div>`}\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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M139 37a110 110 0 014 218v-37a73 73 0 00-4-144v36L66 55l73-55v37zM61 234c15 11 33 18 52 21v-37c-9-2-18-6-25-11l-27 27zm-20-21c-12-15-19-33-22-52h37c2 9 6 18 11 26l-26 26zM40 81c-11 14-19 32-21 51h37c2-11 7-21 13-29L40 81z" fill="#000" fill-rule="nonzero"/></svg>', this.value = 0, this.max = 360, this.unit = "deg", this.template = ({ file: t, translate: e }) => `\n <div class="uppload-rotating-element">\n <img style="width: 20px" alt="" src="${URL.createObjectURL(t)}">\n </div>\n <div class="settings">\n <input type="range" value="${this.value}" min="0" max="${this.max}">\n <span class="value"><span>0</span>${e(`units.${this.unit}`) || this.unit}</span>\n </div>\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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M153 0v256h103L153 0zM0 256h103V0L0 256z" fill="#000" fill-rule="nonzero"/></svg>', this.canvas = document.createElement("canvas"), this.template = ({ file: t, translate: e }) => { const i = URL.createObjectURL(t); return this.originalfileURL = i, `\n <div class="uppload-flip">\n <img style="width: 20px" alt="" src="${i}">\n </div>\n <div class="settings">\n <button class="flip-btn-horizontal">${e("effects.flip.buttons.horizontal")}</button>\n <button class="flip-btn-vertical">${e("effects.flip.buttons.vertical")}</button>\n </div>\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 = '<svg aria-hidden="true" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g transform="translate(1 18)" fill="#000" fill-rule="nonzero"><path d="M244 40h-29V10c0-6-5-10-10-10H10C4 0 0 4 0 10v160c0 5 4 10 10 10h29v30c0 6 4 10 9 10h195c6 0 10-4 10-10V50c0-5-4-10-9-10zm-10 136l-40-45c-4-5-11-5-15 0l-17 19-38-45c-4-5-13-5-17 0l-49 58V60h176v116zM19 160V20h176v20H49c-6 0-10 5-10 10v110H19z"/><ellipse cx="202.5" cy="94" rx="15.5" ry="16"/></g></svg>', this.template = ({ file: t }) => `\n <div class="uppload-preview-element">\n <img style="width: 20px" alt="" src="${URL.createObjectURL(t)}">\n </div>\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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M128 0l-7 7s-21 23-41 54c-21 31-42 70-42 105a90 90 0 00180 0c0-35-22-74-42-105-21-31-42-54-42-54l-6-7zm36 166h18c0 30-25 54-54 54v-18c20 0 36-16 36-36z" fill="#000" fill-rule="nonzero"/></svg>', this.cssFilter = "blur", this.unit = "px" } }, window.uppload_Contrast = class extends Z { constructor() { super(...arguments), this.name = "contrast", this.icon = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M128 0c35 0 66 13 90 38 25 25 38 55 38 90s-13 66-38 90c-24 25-55 38-90 38s-65-13-90-38c-25-24-38-55-38-90s13-65 38-90S93 0 128 0zm67 62a91 91 0 00-67-28v188c26 0 48-9 67-28 18-18 27-40 27-66s-9-48-27-66z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M181 196l30 30c-20 17-44 27-71 30h-1v-43c15-2 30-8 42-17zm-105-1c11 9 25 16 40 18h1v43c-27-2-52-13-71-29l-1-1 31-31zm138-56h42c-2 27-13 52-29 71l-1 1-30-30c9-12 16-27 18-42zm-170 0c1 15 7 29 16 41h1l-31 31c-17-20-28-44-30-71v-1h44zM210 8a27 27 0 0138 38l-38 37 10 10c5 5 5 13 0 18l-1 1c-5 5-13 4-18-1l-10-9-47 47c-5 5-15 9-22 10h-6l-17-2-2-17v-6c0-7 5-17 10-23l47-47-10-9c-5-5-5-14 0-19h1c5-5 13-5 18 0l10 10zm-47 66l-47 47c-3 3-5 9-6 13v1l11 10c4 0 11-3 14-5l47-47-19-19zM30 45l31 31c-9 11-15 25-17 40v1H0c2-27 13-52 30-72zm87-45v43c-15 2-29 8-41 17v1L45 30C65 13 90 2 117 0z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M213 114c-30 0-69 0-76-87-2-17-13-27-30-27-22 0-48 14-68 36C13 65 2 102 6 141c6 62 66 115 129 115 64 0 116-52 116-115 0-26-18-27-38-27zM77 101a24 24 0 110-48 24 24 0 010 48zm-8 28a24 24 0 110 48 24 24 0 010-48zm83 74a24 24 0 11-48 0 24 24 0 0148 0zm68-40a24 24 0 11-47 0 24 24 0 0147 0z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero"><path d="M214 145a100 100 0 010 10l-7 25 1-2c-3 7-8 15-13 21l2-2c-5 7-11 12-18 18l3-2c-7 5-14 9-22 12l3-1a98 98 0 01-22 7 101 101 0 01-23 0c-9-1-17-3-25-7l3 1c-8-3-15-7-22-12l3 2c-7-6-13-11-18-18l2 2c-5-6-10-14-13-21l1 2a98 98 0 01-6-21 102 102 0 010-24c1-8 3-17 6-25l-1 3c3-8 8-15 13-22l-2 3 15-17a657 657 0 0163-57h-17a1561 1561 0 0175 71c5 7 10 14 13 22l-1-3a100 100 0 017 35c0 7 6 13 12 12 6 0 12-5 12-12a112 112 0 00-38-83 676 676 0 00-50-48L137 3h-1c-2-2-5-3-8-3s-6 1-8 3a1704 1704 0 00-49 43c-9 9-19 18-27 29a118 118 0 00-19 30 109 109 0 005 90 111 111 0 0089 60 110 110 0 00119-110c0-6-6-12-12-12-7 1-12 6-12 12z"/><path d="M226 145c0 55-44 99-98 99V12s58 49 76 71c14 17 22 39 22 62z"/></g></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M13 0h230c6 0 11 5 12 11v233c0 7-5 12-11 12H13c-7 0-12-5-12-11V12C1 5 6 0 12 0h231zm219 23H24v160h208V23zM110 72l31 42c2 2 5 2 7 1v-1l13-12c2-2 5-2 7 0v1l35 50c3 3 1 7-3 7H55c-4 0-6-4-4-7l51-81c2-2 6-3 8 0zm65-26a18 18 0 110 36 18 18 0 010-36z" fill="#000" fill-rule="nonzero"/></svg>', 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 = '<svg aria-hidden="true" viewbox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M127 0a82 82 0 00-75 50l-1 2a81 81 0 00-3 10l-1 3-1 7v9a99 99 0 0181 4 99 99 0 0182-4v-8-1l-1-7-1-3a82 82 0 00-3-10l-1-2a82 82 0 00-76-50zM82 92c-12 0-23 3-33 7l-1 1c4 19 14 35 29 46 5-19 17-36 32-49-8-3-17-5-27-5zm91 0c-10 0-19 2-27 5 15 13 26 30 32 49 15-11 25-27 29-46l-1-1c-10-4-21-7-33-7zm-46 14a82 82 0 00-34 50 82 82 0 0069 0c-5-21-17-39-35-50zm-96 4a82 82 0 00-27 39l-1 2-2 9v5a83 83 0 00-1 17c4 39 35 70 74 74h8c9 0 18-2 26-5a100 100 0 01-35-85c-20-13-35-33-42-56zm192 0c-6 23-21 43-41 56v8c0 31-14 58-36 77a70 70 0 0035 5c39-4 69-35 73-74a82 82 0 000-17v-2-3l-2-9-1-2c-5-15-15-29-28-39zM91 175c0 28 14 52 35 66l1-1 2 1c21-14 34-38 35-66a99 99 0 01-73 0z" fill="#000" fill-rule="nonzero"/></svg>', 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: <table class='${n.className}'></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 += "<h5 class='card-title'>" + ("id" === a.toLowerCase() ? "ID" : a) + "</h5>", l.innerHTML += "<div class='card-text'>" + s + "</div>", 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 += `<link rel='stylesheet' href='https://cdn.jsdelivr.net/gh/kushalcodes/konvert-table-to-card@main/styling/${n}'/>`, 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 += `<link rel='stylesheet' href='https://cdn.jsdelivr.net/gh/kushalcodes/konvert-table-to-card@main/styling/${n}'/>`, 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"
});