!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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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} page，current ${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} page，All 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: "Page break preview",
                    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 将被设为 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: (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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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: "Range，Values 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 + 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\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表示"美國（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: !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_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"&amp;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將被設為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, ";
        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)
            }
            function rd(num,defNum=0) {
                //判断数字是否有小数
                if (String(num).indexOf('.') < 0) {
                    return defNum
                } else {
                    let pointPos = String(num).indexOf('.') + 1; //小数点的位置
                    let digCount = String(num).length - pointPos; //小数的位数
                    //返回小数点后的个数
                    return digCount<defNum?defNum:digCount
                }
            }
            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 m_01(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\.([#0]*#)$/)){
                        let digCount=rd(y,2);
                        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, digCount), digCount);
                    }
                    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\./, ".")
                        default:
                            return p(f, "#,##0.00##", y)

                    }
                    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\.([#0]*#)$/)){
                        let digCount=rd(m,2);
                        return m < 0 ? "-" + f(o, h, -m) : T("" + (Math.floor(m) + function(e, t) {
                            return t < ("" + Math.round((e - Math.floor(e)) * Math.pow(10, t))).length ? 1 : 0
                        }(m, y[1].length))) + "." + r(m_01(m, digCount), digCount);
                    }
                    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:
                                return f(o, "#,##0.00##", m)
                    }
                    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
