var JSEncryptExports = {};

(function (p) {
    function n(nj, nO, nt) {
        if (null != nj) {
            "number" == typeof nj ? this.fromNumber(nj, nO, nt) : null == nO && "string" != typeof nj ? this.fromString(nj, 256) : this.fromString(nj, nO);
        }
    }

    function c() {
        return new n(null);
    }

    function a(nj, nO, nt, nX, nG, nx) {
        for (; --nx >= 0;) {
            var nN = nO * this[nj++] + nt[nX] + nG;
            nG = Math.floor(nN / 67108864);
            nt[nX++] = 67108863 & nN;
        }

        return nG;
    }

    function A(nj, nO, nt, nX, nG, nx) {
        for (var nN = 32767 & nO, nD = nO >> 15; --nx >= 0;) {
            var ny = 32767 & this[nj];
            var no = this[nj++] >> 15;
            var nv = nD * ny + no * nN;
            ny = nN * ny + ((32767 & nv) << 15) + nt[nX] + (1073741823 & nG);
            nG = (ny >>> 30) + (nv >>> 15) + nD * no + (nG >>> 30);
            nt[nX++] = 1073741823 & ny;
        }

        return nG;
    }

    function g(nj, nO, nt, nX, nG, nx) {
        for (var nN = 16383 & nO, nD = nO >> 14; --nx >= 0;) {
            var ny = 16383 & this[nj];
            var no = this[nj++] >> 14;
            var nv = nD * ny + no * nN;
            ny = nN * ny + ((16383 & nv) << 14) + nt[nX] + nG;
            nG = (ny >> 28) + (nv >> 14) + nD * no;
            nt[nX++] = 268435455 & ny;
        }

        return nG;
    }

    function S(nj) {
        return nW.charAt(nj);
    }

    function f(nj, nO) {
        var nt = nl[nj.charCodeAt(nO)];
        return null == nt ? -1 : nt;
    }

    function Y(nj) {
        for (var nO = this.t - 1; nO >= 0; --nO) nj[nO] = this[nO];

        nj.t = this.t;
        nj.s = this.s;
    }

    function J(nj) {
        this.t = 1;
        0 > nj ? this.s = -1 : this.s = 0;
        nj > 0 ? this[0] = nj : -1 > nj ? this[0] = nj + DV : this.t = 0;
    }

    function b(nj) {
        var nO = c();
        return nO.fromInt(nj), nO;
    }

    function C(nj, nO) {
        var nt;
        if (16 == nO) nt = 4;else {
            if (8 == nO) nt = 3;else {
                if (256 == nO) nt = 8;else {
                    if (2 == nO) nt = 1;else {
                        if (32 == nO) nt = 5;else {
                            if (4 != nO) return void this.fromRadix(nj, nO);
                            nt = 2;
                        }
                    }
                }
            }
        }
        this.t = 0;
        this.s = 0;

        for (var nX = nj.length, nG = !1, nx = 0; --nX >= 0;) {
            if (8 == nt) {
                var nN = 255 & nj[nX];
            } else {
                var nN = f(nj, nX);
            }

            if (0 > nN) {
                if ("-" == nj.charAt(nX)) {
                    nG = !0;
                }
            } else {
                nG = !1;
                0 == nx ? this[this.t++] = nN : nx + nt > this.DB ? (this[this.t - 1] |= (nN & (1 << this.DB - nx) - 1) << nx, this[this.t++] = nN >> this.DB - nx) : this[this.t - 1] |= nN << nx;
                nx += nt;
                nx >= this.DB && (nx -= this.DB);
            }
        }

        8 == nt && 0 != (128 & nj[0]) && (this.s = -1, nx > 0 && (this[this.t - 1] |= (1 << this.DB - nx) - 1 << nx));
        this.clamp();
        nG && n.ZERO.subTo(this, this);
    }

    function V() {
        for (var nj = this.s & this.DM; this.t > 0 && this[this.t - 1] == nj;) --this.t;
    }

    function W(nj) {
        if (this.s < 0) return "-" + this.negate().toString(nj);
        var nO;
        if (16 == nj) nO = 4;else {
            if (8 == nj) nO = 3;else {
                if (2 == nj) nO = 1;else {
                    if (32 == nj) nO = 5;else {
                        if (4 != nj) return this.toRadix(nj);
                        nO = 2;
                    }
                }
            }
        }
        var nt;
        var nX = (1 << nO) - 1;
        var nG = !1;
        var nx = "";
        var nN = this.t;
        var nD = this.DB - nN * this.DB % nO;

        if (nN-- > 0) {
            for (nD < this.DB && (nt = this[nN] >> nD) > 0 && (nG = !0, nx = S(nt)); nN >= 0;) {
                nO > nD ? (nt = (this[nN] & (1 << nD) - 1) << nO - nD, nt |= this[--nN] >> (nD += this.DB - nO)) : (nt = this[nN] >> (nD -= nO) & nX, 0 >= nD && (nD += this.DB, --nN));
                nt > 0 && (nG = !0);
                nG && (nx += S(nt));
            }
        }

        return nG ? nx : "0";
    }

    function l() {
        var nj = c();
        return n.ZERO.subTo(this, nj), nj;
    }

    function R() {
        return this.s < 0 ? this.negate() : this;
    }

    function B(nj) {
        var nO = this.s - nj.s;
        if (0 != nO) return nO;
        var nt = this.t;
        if (nO = nt - nj.t, 0 != nO) return this.s < 0 ? -nO : nO;

        for (; --nt >= 0;) if (0 != (nO = this[nt] - nj[nt])) return nO;

        return 0;
    }

    function F(nj) {
        var nO;
        var nt = 1;
        return 0 != (nO = nj >>> 16) && (nj = nO, nt += 16), 0 != (nO = nj >> 8) && (nj = nO, nt += 8), 0 != (nO = nj >> 4) && (nj = nO, nt += 4), 0 != (nO = nj >> 2) && (nj = nO, nt += 2), 0 != (nO = nj >> 1) && (nj = nO, nt += 1), nt;
    }

    function E() {
        return this.t <= 0 ? 0 : this.DB * (this.t - 1) + F(this[this.t - 1] ^ this.s & this.DM);
    }

    function s(nj, nO) {
        var nt;

        for (nt = this.t - 1; nt >= 0; --nt) nO[nt + nj] = this[nt];

        for (nt = nj - 1; nt >= 0; --nt) nO[nt] = 0;

        nO.t = this.t + nj;
        nO.s = this.s;
    }

    function I(nj, nO) {
        for (var nt = nj; nt < this.t; ++nt) nO[nt - nj] = this[nt];

        nO.t = Math.max(this.t - nj, 0);
        nO.s = this.s;
    }

    function K(nj, nO) {
        var nt;
        var nX = nj % this.DB;
        var nG = this.DB - nX;
        var nx = (1 << nG) - 1;
        var nN = Math.floor(nj / this.DB);
        var nD = this.s << nX & this.DM;

        for (nt = this.t - 1; nt >= 0; --nt) {
            nO[nt + nN + 1] = this[nt] >> nG | nD;
            nD = (this[nt] & nx) << nX;
        }

        for (nt = nN - 1; nt >= 0; --nt) nO[nt] = 0;

        nO[nN] = nD;
        nO.t = this.t + nN + 1;
        nO.s = this.s;
        nO.clamp();
    }

    function T(nj, nO) {
        nO.s = this.s;
        var nt = Math.floor(nj / this.DB);
        if (nt >= this.t) return void (nO.t = 0);
        var nX = nj % this.DB;
        var nG = this.DB - nX;
        var nx = (1 << nX) - 1;
        nO[0] = this[nt] >> nX;

        for (var nN = nt + 1; nN < this.t; ++nN) {
            nO[nN - nt - 1] |= (this[nN] & nx) << nG;
            nO[nN - nt] = this[nN] >> nX;
        }

        nX > 0 && (nO[this.t - nt - 1] |= (this.s & nx) << nG);
        nO.t = this.t - nt;
        nO.clamp();
    }

    function i(nj, nO) {
        for (var nt = 0, nX = 0, nG = Math.min(nj.t, this.t); nG > nt;) {
            nX += this[nt] - nj[nt];
            nO[nt++] = nX & this.DM;
            nX >>= this.DB;
        }

        if (nj.t < this.t) {
            for (nX -= nj.s; nt < this.t;) {
                nX += this[nt];
                nO[nt++] = nX & this.DM;
                nX >>= this.DB;
            }

            nX += this.s;
        } else {
            for (nX += this.s; nt < nj.t;) {
                nX -= nj[nt];
                nO[nt++] = nX & this.DM;
                nX >>= this.DB;
            }

            nX -= nj.s;
        }

        0 > nX ? nO.s = -1 : nO.s = 0;
        -1 > nX ? nO[nt++] = this.DV + nX : nX > 0 && (nO[nt++] = nX);
        nO.t = nt;
        nO.clamp();
    }

    function e(nj, nO) {
        var nt = this.abs();
        var nX = nj.abs();
        var nG = nt.t;

        for (nO.t = nG + nX.t; --nG >= 0;) nO[nG] = 0;

        for (nG = 0; nG < nX.t; ++nG) nO[nG + nt.t] = nt.am(0, nX[nG], nO, nG, 0, nt.t);

        nO.s = 0;
        nO.clamp();
        this.s != nj.s && n.ZERO.subTo(nO, nO);
    }

    function Z(nj) {
        for (var nO = this.abs(), nt = nj.t = 2 * nO.t; --nt >= 0;) nj[nt] = 0;

        for (nt = 0; nt < nO.t - 1; ++nt) {
            var nX = nO.am(nt, nO[nt], nj, 2 * nt, 0, 1);

            if ((nj[nt + nO.t] += nO.am(nt + 1, 2 * nO[nt], nj, 2 * nt + 1, nX, nO.t - nt - 1)) >= nO.DV) {
                nj[nt + nO.t] -= nO.DV;
                nj[nt + nO.t + 1] = 1;
            }
        }

        nj.t > 0 && (nj[nj.t - 1] += nO.am(nt, nO[nt], nj, 2 * nt, 0, 1));
        nj.s = 0;
        nj.clamp();
    }

    function w(nj, nO, nt) {
        var nX = nj.abs();

        if (!(nX.t <= 0)) {
            var nG = this.abs();
            if (nG.t < nX.t) return null != nO && nO.fromInt(0), void (null != nt && this.copyTo(nt));

            if (null == nt) {
                nt = c();
            }

            var nx = c();
            var nN = this.s;
            var nD = nj.s;
            var ny = this.DB - F(nX[nX.t - 1]);

            if (ny > 0) {
                nX.lShiftTo(ny, nx);
                nG.lShiftTo(ny, nt);
            } else {
                nX.copyTo(nx);
                nG.copyTo(nt);
            }

            var no = nx.t;
            var nv = nx[no - 1];

            if (0 != nv) {
                var nm = nv * (1 << this.F1) + (no > 1 ? nx[no - 2] >> this.F2 : 0);
                var nd = this.FV / nm;
                var nr = (1 << this.F1) / nm;
                var nQ = 1 << this.F2;
                var nP = nt.t;
                var c0 = nP - no;

                if (null == nO) {
                    var c1 = c();
                } else {
                    var c1 = nO;
                }

                for (nx.dlShiftTo(c0, c1), nt.compareTo(c1) >= 0 && (nt[nt.t++] = 1, nt.subTo(c1, nt)), n.ONE.dlShiftTo(no, c1), c1.subTo(nx, nx); nx.t < no;) nx[nx.t++] = 0;

                for (; --c0 >= 0;) {
                    var c2 = nt[--nP] == nv ? this.DM : Math.floor(nt[nP] * nd + (nt[nP - 1] + nQ) * nr);

                    if ((nt[nP] += nx.am(0, c2, nt, c0, 0, no)) < c2) {
                        for (nx.dlShiftTo(c0, c1), nt.subTo(c1, nt); nt[nP] < --c2;) nt.subTo(c1, nt);
                    }
                }

                null != nO && (nt.drShiftTo(no, nO), nN != nD && n.ZERO.subTo(nO, nO));
                nt.t = no;
                nt.clamp();
                ny > 0 && nt.rShiftTo(ny, nt);
                0 > nN && n.ZERO.subTo(nt, nt);
            }
        }
    }

    function M(nj) {
        var nO = c();
        return this.abs().divRemTo(nj, null, nO), this.s < 0 && nO.compareTo(n.ZERO) > 0 && nj.subTo(nO, nO), nO;
    }

    function u(nj) {
        this.m = nj;
    }

    function k(nj) {
        return nj.s < 0 || nj.compareTo(this.m) >= 0 ? nj.mod(this.m) : nj;
    }

    function q(nj) {
        return nj;
    }

    function U(nj) {
        nj.divRemTo(this.m, null, nj);
    }

    function h(nj, nO, nt) {
        nj.multiplyTo(nO, nt);
        this.reduce(nt);
    }

    function H(nj, nO) {
        nj.squareTo(nO);
        this.reduce(nO);
    }

    function j() {
        if (this.t < 1) return 0;
        var nj = this[0];
        if (0 == (1 & nj)) return 0;
        var nO = 3 & nj;
        return nO = nO * (2 - (15 & nj) * nO) & 15, nO = nO * (2 - (255 & nj) * nO) & 255, nO = nO * (2 - ((65535 & nj) * nO & 65535)) & 65535, nO = nO * (2 - nj * nO % this.DV) % this.DV, nO > 0 ? this.DV - nO : -nO;
    }

    function O(nj) {
        this.m = nj;
        this.mp = nj.invDigit();
        this.mpl = 32767 & this.mp;
        this.mph = this.mp >> 15;
        this.um = (1 << nj.DB - 15) - 1;
        this.mt2 = 2 * nj.t;
    }

    function X(nj) {
        var nO = c();
        return nj.abs().dlShiftTo(this.m.t, nO), nO.divRemTo(this.m, null, nO), nj.s < 0 && nO.compareTo(n.ZERO) > 0 && this.m.subTo(nO, nO), nO;
    }

    function G(nj) {
        var nO = c();
        return nj.copyTo(nO), this.reduce(nO), nO;
    }

    function x(nj) {
        for (; nj.t <= this.mt2;) nj[nj.t++] = 0;

        for (var nO = 0; nO < this.m.t; ++nO) {
            var nt = 32767 & nj[nO];
            var nX = nt * this.mpl + ((nt * this.mph + (nj[nO] >> 15) * this.mpl & this.um) << 15) & nj.DM;

            for (nt = nO + this.m.t, nj[nt] += this.m.am(0, nX, nj, nO, 0, this.m.t); nj[nt] >= nj.DV;) {
                nj[nt] -= nj.DV;
                nj[++nt]++;
            }
        }

        nj.clamp();
        nj.drShiftTo(this.m.t, nj);
        nj.compareTo(this.m) >= 0 && nj.subTo(this.m, nj);
    }

    function N(nj, nO) {
        nj.squareTo(nO);
        this.reduce(nO);
    }

    function D(nj, nO, nt) {
        nj.multiplyTo(nO, nt);
        this.reduce(nt);
    }

    function y() {
        return 0 == (this.t > 0 ? 1 & this[0] : this.s);
    }

    function o(nj, nO) {
        if (nj > 4294967295 || 1 > nj) return n.ONE;
        var nt = c();
        var nX = c();
        var nG = nO.convert(this);
        var nx = F(nj) - 1;

        for (nG.copyTo(nt); --nx >= 0;) if (nO.sqrTo(nt, nX), (nj & 1 << nx) > 0) nO.mulTo(nX, nG, nt);else {
            var nN = nt;
            nt = nX;
            nX = nN;
        }

        return nO.revert(nt);
    }

    function v(nj, nO) {
        var nt;
        return 256 > nj || nO.isEven() ? nt = new u(nO) : nt = new O(nO), this.exp(nj, nt);
    }

    function m() {
        var nj = c();
        return this.copyTo(nj), nj;
    }

    function d() {
        if (this.s < 0) {
            if (1 == this.t) return this[0] - this.DV;
            if (0 == this.t) return -1;
        } else {
            if (1 == this.t) return this[0];
            if (0 == this.t) return 0;
        }

        return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
    }

    function r() {
        return 0 == this.t ? this.s : this[0] << 24 >> 24;
    }

    function Q() {
        return 0 == this.t ? this.s : this[0] << 16 >> 16;
    }

    function P(nj) {
        return Math.floor(Math.LN2 * this.DB / Math.log(nj));
    }

    function p0() {
        return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1;
    }

    function p1(nj) {
        if (null == nj && (nj = 10), 0 == this.signum() || 2 > nj || nj > 36) return "0";
        var nO = this.chunkSize(nj);
        var nt = Math.pow(nj, nO);
        var nX = b(nt);
        var nG = c();
        var nx = c();
        var nN = "";

        for (this.divRemTo(nX, nG, nx); nG.signum() > 0;) {
            nN = (nt + nx.intValue()).toString(nj).substr(1) + nN;
            nG.divRemTo(nX, nG, nx);
        }

        return nx.intValue().toString(nj) + nN;
    }

    function p2(nj, nO) {
        this.fromInt(0);
        null == nO && (nO = 10);

        for (var nt = this.chunkSize(nO), nX = Math.pow(nO, nt), nG = !1, nx = 0, nN = 0, nD = 0; nD < nj.length; ++nD) {
            var ny = f(nj, nD);

            if (0 > ny) {
                if ("-" == nj.charAt(nD) && 0 == this.signum()) {
                    nG = !0;
                }
            } else {
                nN = nO * nN + ny;
                ++nx >= nt && (this.dMultiply(nX), this.dAddOffset(nN, 0), nx = 0, nN = 0);
            }
        }

        nx > 0 && (this.dMultiply(Math.pow(nO, nx)), this.dAddOffset(nN, 0));
        nG && n.ZERO.subTo(this, this);
    }

    function p3(nj, nO, nt) {
        if ("number" == typeof nO) {
            if (2 > nj) this.fromInt(1);else {
                for (this.fromNumber(nj, nt), this.testBit(nj - 1) || this.bitwiseTo(n.ONE.shiftLeft(nj - 1), pn, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(nO);) {
                    this.dAddOffset(2, 0);
                    this.bitLength() > nj && this.subTo(n.ONE.shiftLeft(nj - 1), this);
                }
            }
        } else {
            var nX = new Array();
            var nG = 7 & nj;
            nX.length = (nj >> 3) + 1;
            nO.nextBytes(nX);
            nG > 0 ? nX[0] &= (1 << nG) - 1 : nX[0] = 0;
            this.fromString(nX, 256);
        }
    }

    function p4() {
        var nj = this.t;
        var nO = new Array();
        nO[0] = this.s;
        var nt;
        var nX = this.DB - nj * this.DB % 8;
        var nG = 0;

        if (nj-- > 0) {
            for (nX < this.DB && (nt = this[nj] >> nX) != (this.s & this.DM) >> nX && (nO[nG++] = nt | this.s << this.DB - nX); nj >= 0;) {
                8 > nX ? (nt = (this[nj] & (1 << nX) - 1) << 8 - nX, nt |= this[--nj] >> (nX += this.DB - 8)) : (nt = this[nj] >> (nX -= 8) & 255, 0 >= nX && (nX += this.DB, --nj));
                0 != (128 & nt) && (nt |= -256);
                0 == nG && (128 & this.s) != (128 & nt) && ++nG;
                (nG > 0 || nt != this.s) && (nO[nG++] = nt);
            }
        }

        return nO;
    }

    function p5(nj) {
        return 0 == this.compareTo(nj);
    }

    function p6(nj) {
        return this.compareTo(nj) < 0 ? this : nj;
    }

    function p7(nj) {
        return this.compareTo(nj) > 0 ? this : nj;
    }

    function p8(nj, nO, nt) {
        var nX;
        var nG;
        var nx = Math.min(nj.t, this.t);

        for (nX = 0; nx > nX; ++nX) nt[nX] = nO(this[nX], nj[nX]);

        if (nj.t < this.t) {
            for (nG = nj.s & this.DM, nX = nx; nX < this.t; ++nX) nt[nX] = nO(this[nX], nG);

            nt.t = this.t;
        } else {
            for (nG = this.s & this.DM, nX = nx; nX < nj.t; ++nX) nt[nX] = nO(nG, nj[nX]);

            nt.t = nj.t;
        }

        nt.s = nO(this.s, nj.s);
        nt.clamp();
    }

    function p9(nj, nO) {
        return nj & nO;
    }

    function pp(nj) {
        var nO = c();
        return this.bitwiseTo(nj, p9, nO), nO;
    }

    function pn(nj, nO) {
        return nj | nO;
    }

    function pc(nj) {
        var nO = c();
        return this.bitwiseTo(nj, pn, nO), nO;
    }

    function pa(nj, nO) {
        return nj ^ nO;
    }

    function pA(nj) {
        var nO = c();
        return this.bitwiseTo(nj, pa, nO), nO;
    }

    function pL(nj, nO) {
        return nj & ~nO;
    }

    function pg(nj) {
        var nO = c();
        return this.bitwiseTo(nj, pL, nO), nO;
    }

    function pS() {
        for (var nj = c(), nO = 0; nO < this.t; ++nO) nj[nO] = this.DM & ~this[nO];

        return nj.t = this.t, nj.s = ~this.s, nj;
    }

    function pf(nj) {
        var nO = c();
        return 0 > nj ? this.rShiftTo(-nj, nO) : this.lShiftTo(nj, nO), nO;
    }

    function pY(nj) {
        var nO = c();
        return 0 > nj ? this.lShiftTo(-nj, nO) : this.rShiftTo(nj, nO), nO;
    }

    function pJ(nj) {
        if (0 == nj) return -1;
        var nO = 0;
        return 0 == (65535 & nj) && (nj >>= 16, nO += 16), 0 == (255 & nj) && (nj >>= 8, nO += 8), 0 == (15 & nj) && (nj >>= 4, nO += 4), 0 == (3 & nj) && (nj >>= 2, nO += 2), 0 == (1 & nj) && ++nO, nO;
    }

    function pb() {
        for (var nj = 0; nj < this.t; ++nj) if (0 != this[nj]) return nj * this.DB + pJ(this[nj]);

        return this.s < 0 ? this.t * this.DB : -1;
    }

    function pC(nj) {
        for (var nO = 0; 0 != nj;) {
            nj &= nj - 1;
            ++nO;
        }

        return nO;
    }

    function pV() {
        for (var nj = 0, nO = this.s & this.DM, nt = 0; nt < this.t; ++nt) nj += pC(this[nt] ^ nO);

        return nj;
    }

    function pW(nj) {
        var nO = Math.floor(nj / this.DB);
        return nO >= this.t ? 0 != this.s : 0 != (this[nO] & 1 << nj % this.DB);
    }

    function pl(nj, nO) {
        var nt = n.ONE.shiftLeft(nj);
        return this.bitwiseTo(nt, nO, nt), nt;
    }

    function pR(nj) {
        return this.changeBit(nj, pn);
    }

    function pB(nj) {
        return this.changeBit(nj, pL);
    }

    function pF(nj) {
        return this.changeBit(nj, pa);
    }

    function pE(nj, nO) {
        for (var nt = 0, nX = 0, nG = Math.min(nj.t, this.t); nG > nt;) {
            nX += this[nt] + nj[nt];
            nO[nt++] = nX & this.DM;
            nX >>= this.DB;
        }

        if (nj.t < this.t) {
            for (nX += nj.s; nt < this.t;) {
                nX += this[nt];
                nO[nt++] = nX & this.DM;
                nX >>= this.DB;
            }

            nX += this.s;
        } else {
            for (nX += this.s; nt < nj.t;) {
                nX += nj[nt];
                nO[nt++] = nX & this.DM;
                nX >>= this.DB;
            }

            nX += nj.s;
        }

        0 > nX ? nO.s = -1 : nO.s = 0;
        nX > 0 ? nO[nt++] = nX : -1 > nX && (nO[nt++] = this.DV + nX);
        nO.t = nt;
        nO.clamp();
    }

    function ps(nj) {
        var nO = c();
        return this.addTo(nj, nO), nO;
    }

    function pI(nj) {
        var nO = c();
        return this.subTo(nj, nO), nO;
    }

    function pK(nj) {
        var nO = c();
        return this.multiplyTo(nj, nO), nO;
    }

    function pT() {
        var nj = c();
        return this.squareTo(nj), nj;
    }

    function pi(nj) {
        var nO = c();
        return this.divRemTo(nj, nO, null), nO;
    }

    function pe(nj) {
        var nO = c();
        return this.divRemTo(nj, null, nO), nO;
    }

    function pZ(nj) {
        var nO = c();
        var nt = c();
        return this.divRemTo(nj, nO, nt), new Array(nO, nt);
    }

    function pw(nj) {
        this[this.t] = this.am(0, nj - 1, this, 0, 0, this.t);
        ++this.t;
        this.clamp();
    }

    function pM(nj, nO) {
        if (0 != nj) {
            for (; this.t <= nO;) this[this.t++] = 0;

            for (this[nO] += nj; this[nO] >= this.DV;) {
                this[nO] -= this.DV;
                ++nO >= this.t && (this[this.t++] = 0);
                ++this[nO];
            }
        }
    }

    function pu() {}

    function pk(nj) {
        return nj;
    }

    function pq(nj, nO, nt) {
        nj.multiplyTo(nO, nt);
    }

    function pU(nj, nO) {
        nj.squareTo(nO);
    }

    function pz(nj) {
        return this.exp(nj, new pu());
    }

    function ph(nj, nO, nt) {
        var nX = Math.min(this.t + nj.t, nO);

        for (nt.s = 0, nt.t = nX; nX > 0;) nt[--nX] = 0;

        var nG;

        for (nG = nt.t - this.t; nG > nX; ++nX) nt[nX + this.t] = this.am(0, nj[nX], nt, nX, 0, this.t);

        for (nG = Math.min(nj.t, nO); nG > nX; ++nX) this.am(0, nj[nX], nt, nX, 0, nO - nX);

        nt.clamp();
    }

    function pH(nj, nO, nt) {
        --nO;
        var nX = nt.t = this.t + nj.t - nO;

        for (nt.s = 0; --nX >= 0;) nt[nX] = 0;

        for (nX = Math.max(nO - this.t, 0); nX < nj.t; ++nX) nt[this.t + nX - nO] = this.am(nO - nX, nj[nX], nt, 0, 0, this.t + nX - nO);

        nt.clamp();
        nt.drShiftTo(1, nt);
    }

    function pj(nj) {
        this.r2 = c();
        this.q3 = c();
        n.ONE.dlShiftTo(2 * nj.t, this.r2);
        this.mu = this.r2.divide(nj);
        this.m = nj;
    }

    function pO(nj) {
        if (nj.s < 0 || nj.t > 2 * this.m.t) return nj.mod(this.m);
        if (nj.compareTo(this.m) < 0) return nj;
        var nO = c();
        return nj.copyTo(nO), this.reduce(nO), nO;
    }

    function pt(nj) {
        return nj;
    }

    function pX(nj) {
        for (nj.drShiftTo(this.m.t - 1, this.r2), nj.t > this.m.t + 1 && (nj.t = this.m.t + 1, nj.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); nj.compareTo(this.r2) < 0;) nj.dAddOffset(1, this.m.t + 1);

        for (nj.subTo(this.r2, nj); nj.compareTo(this.m) >= 0;) nj.subTo(this.m, nj);
    }

    function pG(nj, nO) {
        nj.squareTo(nO);
        this.reduce(nO);
    }

    function px(nj, nO, nt) {
        nj.multiplyTo(nO, nt);
        this.reduce(nt);
    }

    function pN(nj, nO) {
        var nt;
        var nX;
        var nG = nj.bitLength();
        var nx = b(1);
        if (0 >= nG) return nx;
        18 > nG ? nt = 1 : 48 > nG ? nt = 3 : 144 > nG ? nt = 4 : 768 > nG ? nt = 5 : nt = 6;
        8 > nG ? nX = new u(nO) : nO.isEven() ? nX = new pj(nO) : nX = new O(nO);
        var nN = new Array();
        var nD = 3;
        var ny = nt - 1;
        var no = (1 << nt) - 1;

        if (nN[1] = nX.convert(this), nt > 1) {
            var nv = c();

            for (nX.sqrTo(nN[1], nv); no >= nD;) {
                nN[nD] = c();
                nX.mulTo(nv, nN[nD - 2], nN[nD]);
                nD += 2;
            }
        }

        var nm;
        var nd;
        var nr = nj.t - 1;
        var nQ = !0;
        var nP = c();

        for (nG = F(nj[nr]) - 1; nr >= 0;) {
            for (nG >= ny ? nm = nj[nr] >> nG - ny & no : (nm = (nj[nr] & (1 << nG + 1) - 1) << ny - nG, nr > 0 && (nm |= nj[nr - 1] >> this.DB + nG - ny)), nD = nt; 0 == (1 & nm);) {
                nm >>= 1;
                --nD;
            }

            if ((nG -= nD) < 0 && (nG += this.DB, --nr), nQ) {
                nN[nm].copyTo(nx);
                nQ = !1;
            } else {
                for (; nD > 1;) {
                    nX.sqrTo(nx, nP);
                    nX.sqrTo(nP, nx);
                    nD -= 2;
                }

                nD > 0 ? nX.sqrTo(nx, nP) : (nd = nx, nx = nP, nP = nd);
                nX.mulTo(nP, nN[nm], nx);
            }

            for (; nr >= 0 && 0 == (nj[nr] & 1 << nG);) {
                nX.sqrTo(nx, nP);
                nd = nx;
                nx = nP;
                nP = nd;
                --nG < 0 && (nG = this.DB - 1, --nr);
            }
        }

        return nX.revert(nx);
    }

    function pD(nj) {
        if (this.s < 0) {
            var nO = this.negate();
        } else {
            var nO = this.clone();
        }

        if (nj.s < 0) {
            var nt = nj.negate();
        } else {
            var nt = nj.clone();
        }

        if (nO.compareTo(nt) < 0) {
            var nX = nO;
            nO = nt;
            nt = nX;
        }

        var nG = nO.getLowestSetBit();
        var nx = nt.getLowestSetBit();
        if (0 > nx) return nO;

        for (nx > nG && (nx = nG), nx > 0 && (nO.rShiftTo(nx, nO), nt.rShiftTo(nx, nt)); nO.signum() > 0;) {
            (nG = nO.getLowestSetBit()) > 0 && nO.rShiftTo(nG, nO);
            (nG = nt.getLowestSetBit()) > 0 && nt.rShiftTo(nG, nt);
            nO.compareTo(nt) >= 0 ? (nO.subTo(nt, nO), nO.rShiftTo(1, nO)) : (nt.subTo(nO, nt), nt.rShiftTo(1, nt));
        }

        return nx > 0 && nt.lShiftTo(nx, nt), nt;
    }

    function py(nj) {
        if (0 >= nj) return 0;
        var nO = this.DV % nj;

        if (this.s < 0) {
            var nt = nj - 1;
        } else {
            var nt = 0;
        }

        if (this.t > 0) {
            if (0 == nO) nt = this[0] % nj;else {
                for (var nX = this.t - 1; nX >= 0; --nX) nt = (nO * nt + this[nX]) % nj;
            }
        }

        return nt;
    }

    function po(nj) {
        var nO = nj.isEven();
        if (this.isEven() && nO || 0 == nj.signum()) return n.ZERO;

        for (var nt = nj.clone(), nX = this.clone(), nG = b(1), nx = b(0), nN = b(0), nD = b(1); 0 != nt.signum();) {
            for (; nt.isEven();) {
                nt.rShiftTo(1, nt);
                nO ? (nG.isEven() && nx.isEven() || (nG.addTo(this, nG), nx.subTo(nj, nx)), nG.rShiftTo(1, nG)) : nx.isEven() || nx.subTo(nj, nx);
                nx.rShiftTo(1, nx);
            }

            for (; nX.isEven();) {
                nX.rShiftTo(1, nX);
                nO ? (nN.isEven() && nD.isEven() || (nN.addTo(this, nN), nD.subTo(nj, nD)), nN.rShiftTo(1, nN)) : nD.isEven() || nD.subTo(nj, nD);
                nD.rShiftTo(1, nD);
            }

            if (nt.compareTo(nX) >= 0) {
                nt.subTo(nX, nt);
                nO && nG.subTo(nN, nG);
                nx.subTo(nD, nx);
            } else {
                nX.subTo(nt, nX);
                nO && nN.subTo(nG, nN);
                nD.subTo(nx, nD);
            }
        }

        return 0 != nX.compareTo(n.ONE) ? n.ZERO : nD.compareTo(nj) >= 0 ? nD.subtract(nj) : nD.signum() < 0 ? (nD.addTo(nj, nD), nD.signum() < 0 ? nD.add(nj) : nD) : nD;
    }

    function pv(nj) {
        var nO;
        var nt = this.abs();

        if (1 == nt.t && nt[0] <= nF[nF.length - 1]) {
            for (nO = 0; nO < nF.length; ++nO) if (nt[0] == nF[nO]) return !0;

            return !1;
        }

        if (nt.isEven()) return !1;

        for (nO = 1; nO < nF.length;) {
            for (var nX = nF[nO], nG = nO + 1; nG < nF.length && nE > nX;) nX *= nF[nG++];

            for (nX = nt.modInt(nX); nG > nO;) if (nX % nF[nO++] == 0) return !1;
        }

        return nt.millerRabin(nj);
    }

    function pm(nj) {
        var nO = this.subtract(n.ONE);
        var nt = nO.getLowestSetBit();
        if (0 >= nt) return !1;
        var nX = nO.shiftRight(nt);
        nj = nj + 1 >> 1;
        nj > nF.length && (nj = nF.length);

        for (var nG = c(), nx = 0; nj > nx; ++nx) {
            nG.fromInt(nF[Math.floor(Math.random() * nF.length)]);
            var nN = nG.modPow(nX, this);

            if (0 != nN.compareTo(n.ONE) && 0 != nN.compareTo(nO)) {
                for (var nD = 1; nD++ < nt && 0 != nN.compareTo(nO);) if (nN = nN.modPowInt(2, this), 0 == nN.compareTo(n.ONE)) return !1;

                if (0 != nN.compareTo(nO)) return !1;
            }
        }

        return !0;
    }

    function pd() {
        this.i = 0;
        this.j = 0;
        this.S = new Array();
    }

    function pr(nj) {
        var nO;
        var nt;
        var nX;

        for (nO = 0; 256 > nO; ++nO) this.S[nO] = nO;

        for (nt = 0, nO = 0; 256 > nO; ++nO) {
            nt = nt + this.S[nO] + nj[nO % nj.length] & 255;
            nX = this.S[nO];
            this.S[nO] = this.S[nt];
            this.S[nt] = nX;
        }

        this.i = 0;
        this.j = 0;
    }

    function pQ() {
        var nj;
        return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, nj = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = nj, this.S[nj + this.S[this.i] & 255];
    }

    function pP() {
        return new pd();
    }

    function n0() {
        if (null == nI) {
            for (nI = pP(); ns > nT;) {
                var nj = Math.floor(65536 * Math.random());
                nK[nT++] = 255 & nj;
            }

            for (nI.init(nK), nT = 0; nT < nK.length; ++nT) nK[nT] = 0;

            nT = 0;
        }

        return nI.next();
    }

    function n1(nj) {
        var nO;

        for (nO = 0; nO < nj.length; ++nO) nj[nO] = n0();
    }

    function n2() {}

    function n3(nj, nO) {
        return new n(nj, nO);
    }

    function n4(nj, nO) {
        for (var nt = "", nX = 0; nX + nO < nj.length;) {
            nt += nj.substring(nX, nX + nO) + "\n";
            nX += nO;
        }

        return nt + nj.substring(nX, nj.length);
    }

    function n5(nj) {
        return 16 > nj ? "0" + nj.toString(16) : nj.toString(16);
    }

    function n6(nj, nO) {
        if (nO < nj.length + 11) return console.error("Message too long for RSA"), null;

        for (var nt = new Array(), nX = nj.length - 1; nX >= 0 && nO > 0;) {
            var nG = nj.charCodeAt(nX--);

            if (128 > nG) {
                nt[--nO] = nG;
            } else {
                if (nG > 127 && 2048 > nG) {
                    nt[--nO] = 63 & nG | 128;
                    nt[--nO] = nG >> 6 | 192;
                } else {
                    nt[--nO] = 63 & nG | 128;
                    nt[--nO] = nG >> 6 & 63 | 128;
                    nt[--nO] = nG >> 12 | 224;
                }
            }
        }

        nt[--nO] = 0;

        for (var nx = new n2(), nN = new Array(); nO > 2;) {
            for (nN[0] = 0; 0 == nN[0];) nx.nextBytes(nN);

            nt[--nO] = nN[0];
        }

        return nt[--nO] = 2, nt[--nO] = 0, new n(nt);
    }

    function n7() {
        this.n = null;
        this.e = 0;
        this.d = null;
        this.p = null;
        this.q = null;
        this.dmp1 = null;
        this.dmq1 = null;
        this.coeff = null;
    }

    function n8(nj, nO) {
        if (null != nj && null != nO && nj.length > 0 && nO.length > 0) {
            this.n = n3(nj, 16);
            this.e = parseInt(nO, 16);
        } else {
            console.error("Invalid RSA public key");
        }
    }

    function n9(nj) {
        return nj.modPowInt(this.e, this.n);
    }

    function np(nj) {
        var nO = n6(nj, this.n.bitLength() + 7 >> 3);
        if (null == nO) return null;
        var nt = this.doPublic(nO);
        if (null == nt) return null;
        var nX = nt.toString(16);
        return 0 == (1 & nX.length) ? nX : "0" + nX;
    }

    function nn(nj, nO) {
        for (var nt = nj.toByteArray(), nX = 0; nX < nt.length && 0 == nt[nX];) ++nX;

        if (nt.length - nX != nO - 1 || 2 != nt[nX]) return null;

        for (++nX; 0 != nt[nX];) if (++nX >= nt.length) return null;

        for (var nG = ""; ++nX < nt.length;) {
            var nx = 255 & nt[nX];

            if (128 > nx) {
                nG += String.fromCharCode(nx);
            } else {
                if (nx > 191 && 224 > nx) {
                    nG += String.fromCharCode((31 & nx) << 6 | 63 & nt[nX + 1]);
                    ++nX;
                } else {
                    nG += String.fromCharCode((15 & nx) << 12 | (63 & nt[nX + 1]) << 6 | 63 & nt[nX + 2]);
                    nX += 2;
                }
            }
        }

        return nG;
    }

    function nc(nj, nO, nt) {
        if (null != nj && null != nO && nj.length > 0 && nO.length > 0) {
            this.n = n3(nj, 16);
            this.e = parseInt(nO, 16);
            this.d = n3(nt, 16);
        } else {
            console.error("Invalid RSA private key");
        }
    }

    function na(nj, nO, nt, nX, nG, nx, nN, nD) {
        if (null != nj && null != nO && nj.length > 0 && nO.length > 0) {
            this.n = n3(nj, 16);
            this.e = parseInt(nO, 16);
            this.d = n3(nt, 16);
            this.p = n3(nX, 16);
            this.q = n3(nG, 16);
            this.dmp1 = n3(nx, 16);
            this.dmq1 = n3(nN, 16);
            this.coeff = n3(nD, 16);
        } else {
            console.error("Invalid RSA private key");
        }
    }

    function nA(nj, nO) {
        var nt = new n2();
        var nX = nj >> 1;
        this.e = parseInt(nO, 16);

        for (var nG = new n(nO, 16);;) {
            for (; this.p = new n(nj - nX, 1, nt), 0 != this.p.subtract(n.ONE).gcd(nG).compareTo(n.ONE) || !this.p.isProbablePrime(10););

            for (; this.q = new n(nX, 1, nt), 0 != this.q.subtract(n.ONE).gcd(nG).compareTo(n.ONE) || !this.q.isProbablePrime(10););

            if (this.p.compareTo(this.q) <= 0) {
                var nx = this.p;
                this.p = this.q;
                this.q = nx;
            }

            var nN = this.p.subtract(n.ONE);
            var nD = this.q.subtract(n.ONE);
            var ny = nN.multiply(nD);

            if (0 == ny.gcd(nG).compareTo(n.ONE)) {
                this.n = this.p.multiply(this.q);
                this.d = nG.modInverse(ny);
                this.dmp1 = this.d.mod(nN);
                this.dmq1 = this.d.mod(nD);
                this.coeff = this.q.modInverse(this.p);
                break;
            }
        }
    }

    function nL(nj) {
        if (null == this.p || null == this.q) return nj.modPow(this.d, this.n);

        for (var nO = nj.mod(this.p).modPow(this.dmp1, this.p), nt = nj.mod(this.q).modPow(this.dmq1, this.q); nO.compareTo(nt) < 0;) nO = nO.add(this.p);

        return nO.subtract(nt).multiply(this.coeff).mod(this.p).multiply(this.q).add(nt);
    }

    function ng(nj) {
        var nO = n3(nj, 16);
        var nt = this.doPrivate(nO);
        return null == nt ? null : nn(nt, this.n.bitLength() + 7 >> 3);
    }

    function nS(nj) {
        var nO;
        var nt;
        var nX = "";

        for (nO = 0; nO + 3 <= nj.length; nO += 3) {
            nt = parseInt(nj.substring(nO, nO + 3), 16);
            nX += nw.charAt(nt >> 6) + nw.charAt(63 & nt);
        }

        for (nO + 1 == nj.length ? (nt = parseInt(nj.substring(nO, nO + 1), 16), nX += nw.charAt(nt << 2)) : nO + 2 == nj.length && (nt = parseInt(nj.substring(nO, nO + 2), 16), nX += nw.charAt(nt >> 2) + nw.charAt((3 & nt) << 4)); (3 & nX.length) > 0;) nX += nM;

        return nX;
    }

    function nf(nj) {
        var nO;
        var nt;
        var nX = "";
        var nG = 0;

        for (nO = 0; nO < nj.length && nj.charAt(nO) != nM; ++nO) {
            v = nw.indexOf(nj.charAt(nO));
            v < 0 || (0 == nG ? (nX += S(v >> 2), nt = 3 & v, nG = 1) : 1 == nG ? (nX += S(nt << 2 | v >> 4), nt = 15 & v, nG = 2) : 2 == nG ? (nX += S(nt), nX += S(v >> 2), nt = 3 & v, nG = 3) : (nX += S(nt << 2 | v >> 4), nX += S(15 & v), nG = 0));
        }

        return 1 == nG && (nX += S(nt << 2)), nX;
    }

    function nY(nj) {
        var nO;
        var nt = nf(nj);
        var nX = new Array();

        for (nO = 0; 2 * nO < nt.length; ++nO) nX[nO] = parseInt(nt.substring(2 * nO, 2 * nO + 2), 16);

        return nX;
    }

    var nJ;
    var nb = 244837814094590;
    var nC = 15715070 == (16777215 & nb);
    nC && "Microsoft Internet Explorer" == navigator.appName ? (n.prototype.am = A, nJ = 30) : nC && "Netscape" != navigator.appName ? (n.prototype.am = a, nJ = 26) : (n.prototype.am = g, nJ = 28);
    n.prototype.DB = nJ;
    n.prototype.DM = (1 << nJ) - 1;
    n.prototype.DV = 1 << nJ;
    var nV = 52;
    n.prototype.FV = Math.pow(2, nV);
    n.prototype.F1 = nV - nJ;
    n.prototype.F2 = 2 * nJ - nV;
    var nW = "0123456789abcdefghijklmnopqrstuvwxyz";
    var nl = new Array();
    var nR;
    var nB;

    for (nR = "0".charCodeAt(0), nB = 0; 9 >= nB; ++nB) nl[nR++] = nB;

    for (nR = "a".charCodeAt(0), nB = 10; 36 > nB; ++nB) nl[nR++] = nB;

    for (nR = "A".charCodeAt(0), nB = 10; 36 > nB; ++nB) nl[nR++] = nB;

    u.prototype.convert = k;
    u.prototype.revert = q;
    u.prototype.reduce = U;
    u.prototype.mulTo = h;
    u.prototype.sqrTo = H;
    O.prototype.convert = X;
    O.prototype.revert = G;
    O.prototype.reduce = x;
    O.prototype.mulTo = D;
    O.prototype.sqrTo = N;
    n.prototype.copyTo = Y;
    n.prototype.fromInt = J;
    n.prototype.fromString = C;
    n.prototype.clamp = V;
    n.prototype.dlShiftTo = s;
    n.prototype.drShiftTo = I;
    n.prototype.lShiftTo = K;
    n.prototype.rShiftTo = T;
    n.prototype.subTo = i;
    n.prototype.multiplyTo = e;
    n.prototype.squareTo = Z;
    n.prototype.divRemTo = w;
    n.prototype.invDigit = j;
    n.prototype.isEven = y;
    n.prototype.exp = o;
    n.prototype.toString = W;
    n.prototype.negate = l;
    n.prototype.abs = R;
    n.prototype.compareTo = B;
    n.prototype.bitLength = E;
    n.prototype.mod = M;
    n.prototype.modPowInt = v;
    n.ZERO = b(0);
    n.ONE = b(1);
    pu.prototype.convert = pk;
    pu.prototype.revert = pk;
    pu.prototype.mulTo = pq;
    pu.prototype.sqrTo = pU;
    pj.prototype.convert = pO;
    pj.prototype.revert = pt;
    pj.prototype.reduce = pX;
    pj.prototype.mulTo = px;
    pj.prototype.sqrTo = pG;
    var nF = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
    var nE = 67108864 / nF[nF.length - 1];
    n.prototype.chunkSize = P;
    n.prototype.toRadix = p1;
    n.prototype.fromRadix = p2;
    n.prototype.fromNumber = p3;
    n.prototype.bitwiseTo = p8;
    n.prototype.changeBit = pl;
    n.prototype.addTo = pE;
    n.prototype.dMultiply = pw;
    n.prototype.dAddOffset = pM;
    n.prototype.multiplyLowerTo = ph;
    n.prototype.multiplyUpperTo = pH;
    n.prototype.modInt = py;
    n.prototype.millerRabin = pm;
    n.prototype.clone = m;
    n.prototype.intValue = d;
    n.prototype.byteValue = r;
    n.prototype.shortValue = Q;
    n.prototype.signum = p0;
    n.prototype.toByteArray = p4;
    n.prototype.equals = p5;
    n.prototype.min = p6;
    n.prototype.max = p7;
    n.prototype.and = pp;
    n.prototype.or = pc;
    n.prototype.xor = pA;
    n.prototype.andNot = pg;
    n.prototype.not = pS;
    n.prototype.shiftLeft = pf;
    n.prototype.shiftRight = pY;
    n.prototype.getLowestSetBit = pb;
    n.prototype.bitCount = pV;
    n.prototype.testBit = pW;
    n.prototype.setBit = pR;
    n.prototype.clearBit = pB;
    n.prototype.flipBit = pF;
    n.prototype.add = ps;
    n.prototype.subtract = pI;
    n.prototype.multiply = pK;
    n.prototype.divide = pi;
    n.prototype.remainder = pe;
    n.prototype.divideAndRemainder = pZ;
    n.prototype.modPow = pN;
    n.prototype.modInverse = po;
    n.prototype.pow = pz;
    n.prototype.gcd = pD;
    n.prototype.isProbablePrime = pv;
    n.prototype.square = pT;
    pd.prototype.init = pr;
    pd.prototype.next = pQ;
    var ns = 256;
    var nI;
    var nK;
    var nT;

    if (null == nK) {
        nK = new Array();
        nT = 0;
        var ni;

        if (window.crypto && window.crypto.getRandomValues) {
            var ne = new Uint32Array(256);

            for (window.crypto.getRandomValues(ne), ni = 0; ni < ne.length; ++ni) nK[nT++] = 255 & ne[ni];
        }

        var nZ = function (nj) {
            if (this.count = this.count || 0, this.count >= 256 || nT >= ns) return void (window.removeEventListener ? window.removeEventListener("mousemove", nZ) : window.detachEvent && window.detachEvent("onmousemove", nZ));
            this.count += 1;
            var nO = nj.x + nj.y;
            nK[nT++] = 255 & nO;
        };

        if (window.addEventListener) {
            window.addEventListener("mousemove", nZ);
        } else {
            if (window.attachEvent) {
                window.attachEvent("onmousemove", nZ);
            }
        }
    }

    n2.prototype.nextBytes = n1;
    n7.prototype.doPublic = n9;
    n7.prototype.setPublic = n8;
    n7.prototype.encrypt = np;
    n7.prototype.doPrivate = nL;
    n7.prototype.setPrivate = nc;
    n7.prototype.setPrivateEx = na;
    n7.prototype.generate = nA;
    n7.prototype.decrypt = ng;

    (function () {
        var nj = function (nX, nG, nx) {
            var nN = new n2();
            var nD = nX >> 1;
            this.e = parseInt(nG, 16);
            var ny = new n(nG, 16);
            var no = this;

            var nv = function () {
                var nm = function () {
                    if (no.p.compareTo(no.q) <= 0) {
                        var nQ = no.p;
                        no.p = no.q;
                        no.q = nQ;
                    }

                    var nP = no.p.subtract(n.ONE);
                    var c0 = no.q.subtract(n.ONE);
                    var c1 = nP.multiply(c0);

                    if (0 == c1.gcd(ny).compareTo(n.ONE)) {
                        no.n = no.p.multiply(no.q);
                        no.d = ny.modInverse(c1);
                        no.dmp1 = no.d.mod(nP);
                        no.dmq1 = no.d.mod(c0);
                        no.coeff = no.q.modInverse(no.p);
                        setTimeout(function () {
                            nx();
                        }, 0);
                    } else {
                        setTimeout(nv, 0);
                    }
                };

                var nd = function () {
                    no.q = c();
                    no.q.fromNumberAsync(nD, 1, nN, function () {
                        no.q.subtract(n.ONE).gcda(ny, function (nQ) {
                            if (0 == nQ.compareTo(n.ONE) && no.q.isProbablePrime(10)) {
                                setTimeout(nm, 0);
                            } else {
                                setTimeout(nd, 0);
                            }
                        });
                    });
                };

                var nr = function () {
                    no.p = c();
                    no.p.fromNumberAsync(nX - nD, 1, nN, function () {
                        no.p.subtract(n.ONE).gcda(ny, function (nQ) {
                            if (0 == nQ.compareTo(n.ONE) && no.p.isProbablePrime(10)) {
                                setTimeout(nd, 0);
                            } else {
                                setTimeout(nr, 0);
                            }
                        });
                    });
                };

                setTimeout(nr, 0);
            };

            setTimeout(nv, 0);
        };

        n7.prototype.generateAsync = nj;

        var nO = function (nX, nG) {
            if (this.s < 0) {
                var nx = this.negate();
            } else {
                var nx = this.clone();
            }

            if (nX.s < 0) {
                var nN = nX.negate();
            } else {
                var nN = nX.clone();
            }

            if (nx.compareTo(nN) < 0) {
                var nD = nx;
                nx = nN;
                nN = nD;
            }

            var ny = nx.getLowestSetBit();
            var no = nN.getLowestSetBit();
            if (0 > no) return void nG(nx);
            no > ny && (no = ny);
            no > 0 && (nx.rShiftTo(no, nx), nN.rShiftTo(no, nN));

            var nv = function () {
                (ny = nx.getLowestSetBit()) > 0 && nx.rShiftTo(ny, nx);
                (ny = nN.getLowestSetBit()) > 0 && nN.rShiftTo(ny, nN);
                nx.compareTo(nN) >= 0 ? (nx.subTo(nN, nx), nx.rShiftTo(1, nx)) : (nN.subTo(nx, nN), nN.rShiftTo(1, nN));
                nx.signum() > 0 ? setTimeout(nv, 0) : (no > 0 && nN.lShiftTo(no, nN), setTimeout(function () {
                    nG(nN);
                }, 0));
            };

            setTimeout(nv, 10);
        };

        n.prototype.gcda = nO;

        var nt = function (nX, nG, nx, nN) {
            if ("number" == typeof nG) {
                if (2 > nX) this.fromInt(1);else {
                    this.fromNumber(nX, nx);
                    this.testBit(nX - 1) || this.bitwiseTo(n.ONE.shiftLeft(nX - 1), pn, this);
                    this.isEven() && this.dAddOffset(1, 0);
                    var nD = this;

                    var ny = function () {
                        nD.dAddOffset(2, 0);
                        nD.bitLength() > nX && nD.subTo(n.ONE.shiftLeft(nX - 1), nD);
                        nD.isProbablePrime(nG) ? setTimeout(function () {
                            nN();
                        }, 0) : setTimeout(ny, 0);
                    };

                    setTimeout(ny, 0);
                }
            } else {
                var no = new Array();
                var nv = 7 & nX;
                no.length = (nX >> 3) + 1;
                nG.nextBytes(no);
                nv > 0 ? no[0] &= (1 << nv) - 1 : no[0] = 0;
                this.fromString(no, 256);
            }
        };

        n.prototype.fromNumberAsync = nt;
    })();

    var nw = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var nM = "=";
    var nu = nu || {};
    nu.env = nu.env || {};
    var nk = nu;
    var nq = Object.prototype;
    var nU = "[object Function]";
    var nz = ["toString", "valueOf"];

    nu.env.parseUA = function (nj) {
        var nO;

        var nt = function (ny) {
            var no = 0;
            return parseFloat(ny.replace(/\./g, function () {
                return 1 == no++ ? "" : ".";
            }));
        };

        var nX = navigator;
        var nG = {
            "ie": 0,
            "opera": 0,
            "gecko": 0,
            "webkit": 0,
            "chrome": 0,
            "mobile": null,
            "air": 0,
            "ipad": 0,
            "iphone": 0,
            "ipod": 0,
            "ios": null,
            "android": 0,
            "webos": 0,
            "caja": nX && nX.cajaVersion,
            "secure": !1,
            "os": null
        };
        var nx = nj || navigator && navigator.userAgent;
        var nN = window && window.location;
        var nD = nN && nN.href;
        return nG.secure = nD && 0 === nD.toLowerCase().indexOf("https"), nx && (/windows|win32/i.test(nx) ? nG.os = "windows" : /macintosh/i.test(nx) ? nG.os = "macintosh" : /rhino/i.test(nx) && (nG.os = "rhino"), /KHTML/.test(nx) && (nG.webkit = 1), nO = nx.match(/AppleWebKit\/([^\s]*)/), nO && nO[1] && (nG.webkit = nt(nO[1]), / Mobile\//.test(nx) ? (nG.mobile = "Apple", nO = nx.match(/OS ([^\s]*)/), nO && nO[1] && (nO = nt(nO[1].replace("_", "."))), nG.ios = nO, nG.ipad = nG.ipod = nG.iphone = 0, nO = nx.match(/iPad|iPod|iPhone/), nO && nO[0] && (nG[nO[0].toLowerCase()] = nG.ios)) : (nO = nx.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/), nO && (nG.mobile = nO[0]), /webOS/.test(nx) && (nG.mobile = "WebOS", nO = nx.match(/webOS\/([^\s]*);/), nO && nO[1] && (nG.webos = nt(nO[1]))), / Android/.test(nx) && (nG.mobile = "Android", nO = nx.match(/Android ([^\s]*);/), nO && nO[1] && (nG.android = nt(nO[1])))), nO = nx.match(/Chrome\/([^\s]*)/), nO && nO[1] ? nG.chrome = nt(nO[1]) : (nO = nx.match(/AdobeAIR\/([^\s]*)/), nO && (nG.air = nO[0]))), nG.webkit || (nO = nx.match(/Opera[\s\/]([^\s]*)/), nO && nO[1] ? (nG.opera = nt(nO[1]), nO = nx.match(/Version\/([^\s]*)/), nO && nO[1] && (nG.opera = nt(nO[1])), nO = nx.match(/Opera Mini[^;]*/), nO && (nG.mobile = nO[0])) : (nO = nx.match(/MSIE\s([^;]*)/), nO && nO[1] ? nG.ie = nt(nO[1]) : (nO = nx.match(/Gecko\/([^\s]*)/), nO && (nG.gecko = 1, nO = nx.match(/rv:([^\s\)]*)/), nO && nO[1] && (nG.gecko = nt(nO[1]))))))), nG;
    };

    nu.env.ua = nu.env.parseUA();

    nu.isFunction = function (nj) {
        return "function" == typeof nj || nq.toString.apply(nj) === nU;
    };

    nu.env.ua.ie ? nu._IEEnumFix = function (nj, nO) {
        var nt;
        var nX;
        var nG;

        for (nt = 0; nt < nz.length; nt += 1) {
            nX = nz[nt];
            nG = nO[nX];
            nk.isFunction(nG) && nG != nq[nX] && (nj[nX] = nG);
        }
    } : nu._IEEnumFix = function () {};

    nu.extend = function (nj, nO, nt) {
        if (!nO || !nj) throw new Error("extend failed, please check that all dependencies are included.");
        var nX;

        var nG = function () {};

        if (nG.prototype = nO.prototype, nj.prototype = new nG(), nj.prototype.constructor = nj, nj.superclass = nO.prototype, nO.prototype.constructor == nq.constructor && (nO.prototype.constructor = nO), nt) {
            for (nX in nt) if (nk.hasOwnProperty(nt, nX)) {
                nj.prototype[nX] = nt[nX];
            }

            nk._IEEnumFix(nj.prototype, nt);
        }
    };

    "undefined" != typeof KJUR && KJUR || (KJUR = {});
    "undefined" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {});
    KJUR.asn1.ASN1Util = new function () {
        this.integerToByteHex = function (nj) {
            var nO = nj.toString(16);
            return nO.length % 2 == 1 && (nO = "0" + nO), nO;
        };

        this.bigIntToMinTwosComplementsHex = function (nj) {
            var nO = nj.toString(16);
            if ("-" != nO.substr(0, 1)) {
                if (nO.length % 2 == 1) {
                    nO = "0" + nO;
                } else {
                    nO.match(/^[0-7]/) || (nO = "00" + nO);
                }
            } else {
                var nt = nO.substr(1);
                var nX = nt.length;

                if (nX % 2 == 1) {
                    nX += 1;
                } else {
                    nO.match(/^[0-7]/) || (nX += 2);
                }

                for (var nG = "", nx = 0; nX > nx; nx++) nG += "f";

                var nN = new n(nG, 16);
                var nD = nN.xor(nj).add(n.ONE);
                nO = nD.toString(16).replace(/^-/, "");
            }
            return nO;
        };

        this.getPEMStringFromHex = function (nj, nO) {
            var nt = CryptoJS.enc.Hex.parse(nj);
            var nX = CryptoJS.enc.Base64.stringify(nt);
            var nG = nX.replace(/(.{64})/g, "$1\r\n");
            return nG = nG.replace(/\r\n$/, ""), "-----BEGIN " + nO + "-----\r\n" + nG + "\r\n-----END " + nO + "-----\r\n";
        };
    }();

    KJUR.asn1.ASN1Object = function () {
        var nj = "";

        this.getLengthHexFromValue = function () {
            if ("undefined" == typeof this.hV || null == this.hV) throw "this.hV is null or undefined.";
            if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + nj.length + ",v=" + this.hV;
            var nO = this.hV.length / 2;
            var nt = nO.toString(16);
            if (nt.length % 2 == 1 && (nt = "0" + nt), 128 > nO) return nt;
            var nX = nt.length / 2;
            if (nX > 15) throw "ASN.1 length too long to represent by 8x: n = " + nO.toString(16);
            var nG = 128 + nX;
            return nG.toString(16) + nt;
        };

        this.getEncodedHex = function () {
            return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV;
        };

        this.getValueHex = function () {
            return this.getEncodedHex(), this.hV;
        };

        this.getFreshValueHex = function () {
            return "";
        };
    };

    KJUR.asn1.DERAbstractString = function (nj) {
        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);

        this.getString = function () {
            return this.s;
        };

        this.setString = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.s = nO;
            this.hV = stohex(this.s);
        };

        this.setStringHex = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.s = null;
            this.hV = nO;
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.str ? this.setString(nj.str) : "undefined" != typeof nj.hex && this.setStringHex(nj.hex));
    };

    nu.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERAbstractTime = function () {
        KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);

        this.localDateToUTC = function (nj) {
            utc = nj.getTime() + 60000 * nj.getTimezoneOffset();
            var nO = new Date(utc);
            return nO;
        };

        this.formatDate = function (nj, nO) {
            var nt = this.zeroPadding;
            var nX = this.localDateToUTC(nj);
            var nG = String(nX.getFullYear());

            if ("utc" == nO) {
                nG = nG.substr(2, 2);
            }

            var nx = nt(String(nX.getMonth() + 1), 2);
            var nN = nt(String(nX.getDate()), 2);
            var nD = nt(String(nX.getHours()), 2);
            var ny = nt(String(nX.getMinutes()), 2);
            var no = nt(String(nX.getSeconds()), 2);
            return nG + nx + nN + nD + ny + no + "Z";
        };

        this.zeroPadding = function (nj, nO) {
            return nj.length >= nO ? nj : new Array(nO - nj.length + 1).join("0") + nj;
        };

        this.getString = function () {
            return this.s;
        };

        this.setString = function (nj) {
            this.hTLV = null;
            this.isModified = !0;
            this.s = nj;
            this.hV = stohex(this.s);
        };

        this.setByDateValue = function (nj, nO, nt, nX, nG, nx) {
            var nN = new Date(Date.UTC(nj, nO - 1, nt, nX, nG, nx, 0));
            this.setByDate(nN);
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };
    };

    nu.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERAbstractStructured = function (nj) {
        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);

        this.setByASN1ObjectArray = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.asn1Array = nO;
        };

        this.appendASN1Object = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.asn1Array.push(nO);
        };

        this.asn1Array = new Array();
        "undefined" != typeof nj && "undefined" != typeof nj.array && (this.asn1Array = nj.array);
    };

    nu.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERBoolean = function () {
        KJUR.asn1.DERBoolean.superclass.constructor.call(this);
        this.hT = "01";
        this.hTLV = "0101ff";
    };

    nu.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERInteger = function (nj) {
        KJUR.asn1.DERInteger.superclass.constructor.call(this);
        this.hT = "02";

        this.setByBigInteger = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(nO);
        };

        this.setByInteger = function (nO) {
            var nt = new n(String(nO), 10);
            this.setByBigInteger(nt);
        };

        this.setValueHex = function (nO) {
            this.hV = nO;
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.bigint ? this.setByBigInteger(nj.bigint) : "undefined" != typeof nj.int ? this.setByInteger(nj.int) : "undefined" != typeof nj.hex && this.setValueHex(nj.hex));
    };

    nu.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERBitString = function (nj) {
        KJUR.asn1.DERBitString.superclass.constructor.call(this);
        this.hT = "03";

        this.setHexValueIncludingUnusedBits = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.hV = nO;
        };

        this.setUnusedBitsAndHexValue = function (nO, nt) {
            if (0 > nO || nO > 7) throw "unused bits shall be from 0 to 7: u = " + nO;
            var nX = "0" + nO;
            this.hTLV = null;
            this.isModified = !0;
            this.hV = nX + nt;
        };

        this.setByBinaryString = function (nO) {
            nO = nO.replace(/0+$/, "");
            var nt = 8 - nO.length % 8;

            if (8 == nt) {
                nt = 0;
            }

            for (var nX = 0; nt >= nX; nX++) nO += "0";

            for (var nG = "", nX = 0; nX < nO.length - 1; nX += 8) {
                var nx = nO.substr(nX, 8);
                var nN = parseInt(nx, 2).toString(16);
                1 == nN.length && (nN = "0" + nN);
                nG += nN;
            }

            this.hTLV = null;
            this.isModified = !0;
            this.hV = "0" + nt + nG;
        };

        this.setByBooleanArray = function (nO) {
            for (var nt = "", nX = 0; nX < nO.length; nX++) nt += 1 == nO[nX] ? "1" : "0";

            this.setByBinaryString(nt);
        };

        this.newFalseArray = function (nO) {
            for (var nt = new Array(nO), nX = 0; nO > nX; nX++) nt[nX] = !1;

            return nt;
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.hex ? this.setHexValueIncludingUnusedBits(nj.hex) : "undefined" != typeof nj.bin ? this.setByBinaryString(nj.bin) : "undefined" != typeof nj.array && this.setByBooleanArray(nj.array));
    };

    nu.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);

    KJUR.asn1.DEROctetString = function (nj) {
        KJUR.asn1.DEROctetString.superclass.constructor.call(this, nj);
        this.hT = "04";
    };

    nu.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERNull = function () {
        KJUR.asn1.DERNull.superclass.constructor.call(this);
        this.hT = "05";
        this.hTLV = "0500";
    };

    nu.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERObjectIdentifier = function (nj) {
        var nO = function (nX) {
            var nG = nX.toString(16);
            return 1 == nG.length && (nG = "0" + nG), nG;
        };

        var nt = function (nX) {
            var nG = "";
            var nx = new n(nX, 10);
            var nN = nx.toString(2);
            var nD = 7 - nN.length % 7;

            if (7 == nD) {
                nD = 0;
            }

            for (var ny = "", no = 0; nD > no; no++) ny += "0";

            nN = ny + nN;

            for (var no = 0; no < nN.length - 1; no += 7) {
                var nv = nN.substr(no, 7);
                no != nN.length - 7 && (nv = "1" + nv);
                nG += nO(parseInt(nv, 2));
            }

            return nG;
        };

        KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
        this.hT = "06";

        this.setValueHex = function (nX) {
            this.hTLV = null;
            this.isModified = !0;
            this.s = null;
            this.hV = nX;
        };

        this.setValueOidString = function (nX) {
            if (!nX.match(/^[0-9.]+$/)) throw "malformed oid string: " + nX;
            var nG = "";
            var nx = nX.split(".");
            var nN = 40 * parseInt(nx[0]) + parseInt(nx[1]);
            nG += nO(nN);
            nx.splice(0, 2);

            for (var nD = 0; nD < nx.length; nD++) nG += nt(nx[nD]);

            this.hTLV = null;
            this.isModified = !0;
            this.s = null;
            this.hV = nG;
        };

        this.setValueName = function (nX) {
            if ("undefined" == typeof KJUR.asn1.x509.OID.name2oidList[nX]) throw "DERObjectIdentifier oidName undefined: " + nX;
            var nG = KJUR.asn1.x509.OID.name2oidList[nX];
            this.setValueOidString(nG);
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.oid ? this.setValueOidString(nj.oid) : "undefined" != typeof nj.hex ? this.setValueHex(nj.hex) : "undefined" != typeof nj.name && this.setValueName(nj.name));
    };

    nu.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);

    KJUR.asn1.DERUTF8String = function (nj) {
        KJUR.asn1.DERUTF8String.superclass.constructor.call(this, nj);
        this.hT = "0c";
    };

    nu.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERNumericString = function (nj) {
        KJUR.asn1.DERNumericString.superclass.constructor.call(this, nj);
        this.hT = "12";
    };

    nu.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERPrintableString = function (nj) {
        KJUR.asn1.DERPrintableString.superclass.constructor.call(this, nj);
        this.hT = "13";
    };

    nu.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERTeletexString = function (nj) {
        KJUR.asn1.DERTeletexString.superclass.constructor.call(this, nj);
        this.hT = "14";
    };

    nu.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERIA5String = function (nj) {
        KJUR.asn1.DERIA5String.superclass.constructor.call(this, nj);
        this.hT = "16";
    };

    nu.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);

    KJUR.asn1.DERUTCTime = function (nj) {
        KJUR.asn1.DERUTCTime.superclass.constructor.call(this, nj);
        this.hT = "17";

        this.setByDate = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.date = nO;
            this.s = this.formatDate(this.date, "utc");
            this.hV = stohex(this.s);
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.str ? this.setString(nj.str) : "undefined" != typeof nj.hex ? this.setStringHex(nj.hex) : "undefined" != typeof nj.date && this.setByDate(nj.date));
    };

    nu.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);

    KJUR.asn1.DERGeneralizedTime = function (nj) {
        KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, nj);
        this.hT = "18";

        this.setByDate = function (nO) {
            this.hTLV = null;
            this.isModified = !0;
            this.date = nO;
            this.s = this.formatDate(this.date, "gen");
            this.hV = stohex(this.s);
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.str ? this.setString(nj.str) : "undefined" != typeof nj.hex ? this.setStringHex(nj.hex) : "undefined" != typeof nj.date && this.setByDate(nj.date));
    };

    nu.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);

    KJUR.asn1.DERSequence = function (nj) {
        KJUR.asn1.DERSequence.superclass.constructor.call(this, nj);
        this.hT = "30";

        this.getFreshValueHex = function () {
            for (var nO = "", nt = 0; nt < this.asn1Array.length; nt++) {
                var nX = this.asn1Array[nt];
                nO += nX.getEncodedHex();
            }

            return this.hV = nO, this.hV;
        };
    };

    nu.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);

    KJUR.asn1.DERSet = function (nj) {
        KJUR.asn1.DERSet.superclass.constructor.call(this, nj);
        this.hT = "31";

        this.getFreshValueHex = function () {
            for (var nO = new Array(), nt = 0; nt < this.asn1Array.length; nt++) {
                var nX = this.asn1Array[nt];
                nO.push(nX.getEncodedHex());
            }

            return nO.sort(), this.hV = nO.join(""), this.hV;
        };
    };

    nu.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);

    KJUR.asn1.DERTaggedObject = function (nj) {
        KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
        this.hT = "a0";
        this.hV = "";
        this.isExplicit = !0;
        this.asn1Object = null;

        this.setASN1Object = function (nO, nt, nX) {
            this.hT = nt;
            this.isExplicit = nO;
            this.asn1Object = nX;
            this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = nX.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, nt), this.isModified = !1);
        };

        this.getFreshValueHex = function () {
            return this.hV;
        };

        "undefined" != typeof nj && ("undefined" != typeof nj.tag && (this.hT = nj.tag), "undefined" != typeof nj.explicit && (this.isExplicit = nj.explicit), "undefined" != typeof nj.obj && (this.asn1Object = nj.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)));
    };

    nu.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);

    (function (nj) {
        'use strict';

        var nO;
        var nt = {};

        nt.decode = function (nX) {
            var nG;

            if (nO === nj) {
                var nx = "0123456789ABCDEF";
                var nN = " \f\n\r\t聽\u2028\u2029";

                for (nO = [], nG = 0; 16 > nG; ++nG) nO[nx.charAt(nG)] = nG;

                for (nx = nx.toLowerCase(), nG = 10; 16 > nG; ++nG) nO[nx.charAt(nG)] = nG;

                for (nG = 0; nG < nN.length; ++nG) nO[nN.charAt(nG)] = -1;
            }

            var nD = [];
            var ny = 0;
            var no = 0;

            for (nG = 0; nG < nX.length; ++nG) {
                var nv = nX.charAt(nG);
                if ("=" == nv) break;

                if (nv = nO[nv], -1 != nv) {
                    if (nv === nj) throw "Illegal character at offset " + nG;
                    ny |= nv;
                    ++no >= 2 ? (nD[nD.length] = ny, ny = 0, no = 0) : ny <<= 4;
                }
            }

            if (no) throw "Hex encoding incomplete: 4 bits missing";
            return nD;
        };

        window.Hex = nt;
    })();

    (function (nj) {
        'use strict';

        var nO;
        var nt = {};

        nt.decode = function (nX) {
            var nG;

            if (nO === nj) {
                var nx = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
                var nN = "= \f\n\r\t聽\u2028\u2029";

                for (nO = [], nG = 0; 64 > nG; ++nG) nO[nx.charAt(nG)] = nG;

                for (nG = 0; nG < nN.length; ++nG) nO[nN.charAt(nG)] = -1;
            }

            var nD = [];
            var ny = 0;
            var no = 0;

            for (nG = 0; nG < nX.length; ++nG) {
                var nv = nX.charAt(nG);
                if ("=" == nv) break;

                if (nv = nO[nv], -1 != nv) {
                    if (nv === nj) throw "Illegal character at offset " + nG;
                    ny |= nv;
                    ++no >= 4 ? (nD[nD.length] = ny >> 16, nD[nD.length] = ny >> 8 & 255, nD[nD.length] = 255 & ny, ny = 0, no = 0) : ny <<= 6;
                }
            }

            switch (no) {
                case 1:
                    throw "Base64 encoding incomplete: at least 2 bits missing";

                case 2:
                    nD[nD.length] = ny >> 10;
                    break;

                case 3:
                    nD[nD.length] = ny >> 16;
                    nD[nD.length] = ny >> 8 & 255;
            }

            return nD;
        };

        nt.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/;

        nt.unarmor = function (nX) {
            var nG = nt.re.exec(nX);

            if (nG) {
                if (nG[1]) nX = nG[1];else {
                    if (!nG[2]) throw "RegExp out of sync";
                    nX = nG[2];
                }
            }

            return nt.decode(nX);
        };

        window.Base64 = nt;
    })();

    (function (nj) {
        'use strict';

        function nO(nN, nD) {
            if (nN instanceof nO) {
                this.enc = nN.enc;
                this.pos = nN.pos;
            } else {
                this.enc = nN;
                this.pos = nD;
            }
        }

        function nt(nN, nD, ny, no, nv) {
            this.stream = nN;
            this.header = nD;
            this.length = ny;
            this.tag = no;
            this.sub = nv;
        }

        var nX = 100;
        var nG = "鈥�";
        var nx = {
            "tag": function (nN, nD) {
                var ny = document.createElement(nN);
                return ny.className = nD, ny;
            },
            "text": function (nN) {
                return document.createTextNode(nN);
            }
        };

        nO.prototype.get = function (nN) {
            if (nN === nj && (nN = this.pos++), nN >= this.enc.length) throw "Requesting byte offset " + nN + " on a stream of length " + this.enc.length;
            return this.enc[nN];
        };

        nO.prototype.hexDigits = "0123456789ABCDEF";

        nO.prototype.hexByte = function (nN) {
            return this.hexDigits.charAt(nN >> 4 & 15) + this.hexDigits.charAt(15 & nN);
        };

        nO.prototype.hexDump = function (nN, nD, ny) {
            for (var no = "", nv = nN; nD > nv; ++nv) if (no += this.hexByte(this.get(nv)), ny !== !0) switch (15 & nv) {
                case 7:
                    no += "  ";
                    break;

                case 15:
                    no += "\n";
                    break;

                default:
                    no += " ";
            }

            return no;
        };

        nO.prototype.parseStringISO = function (nN, nD) {
            for (var ny = "", no = nN; nD > no; ++no) ny += String.fromCharCode(this.get(no));

            return ny;
        };

        nO.prototype.parseStringUTF = function (nN, nD) {
            for (var ny = "", no = nN; nD > no;) {
                var nv = this.get(no++);
                ny += String.fromCharCode(128 > nv ? nv : nv > 191 && 224 > nv ? (31 & nv) << 6 | 63 & this.get(no++) : (15 & nv) << 12 | (63 & this.get(no++)) << 6 | 63 & this.get(no++));
            }

            return ny;
        };

        nO.prototype.parseStringBMP = function (nN, nD) {
            for (var ny = "", no = nN; nD > no; no += 2) {
                var nv = this.get(no);
                var nm = this.get(no + 1);
                ny += String.fromCharCode((nv << 8) + nm);
            }

            return ny;
        };

        nO.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;

        nO.prototype.parseTime = function (nN, nD) {
            var ny = this.parseStringISO(nN, nD);
            var no = this.reTime.exec(ny);
            return no ? (ny = no[1] + "-" + no[2] + "-" + no[3] + " " + no[4], no[5] && (ny += ":" + no[5], no[6] && (ny += ":" + no[6], no[7] && (ny += "." + no[7]))), no[8] && (ny += " UTC", "Z" != no[8] && (ny += no[8], no[9] && (ny += ":" + no[9]))), ny) : "Unrecognized time: " + ny;
        };

        nO.prototype.parseInteger = function (nN, nD) {
            var ny = nD - nN;

            if (ny > 4) {
                ny <<= 3;
                var no = this.get(nN);
                if (0 === no) ny -= 8;else {
                    for (; 128 > no;) {
                        no <<= 1;
                        --ny;
                    }
                }
                return "(" + ny + " bit)";
            }

            for (var nv = 0, nm = nN; nD > nm; ++nm) nv = nv << 8 | this.get(nm);

            return nv;
        };

        nO.prototype.parseBitString = function (nN, nD) {
            var ny = this.get(nN);
            var no = (nD - nN - 1 << 3) - ny;
            var nv = "(" + no + " bit)";

            if (20 >= no) {
                var nm = ny;
                nv += " ";

                for (var nd = nD - 1; nd > nN; --nd) {
                    for (var nr = this.get(nd), nQ = nm; 8 > nQ; ++nQ) nv += nr >> nQ & 1 ? "1" : "0";

                    nm = 0;
                }
            }

            return nv;
        };

        nO.prototype.parseOctetString = function (nN, nD) {
            var ny = nD - nN;
            var no = "(" + ny + " byte) ";

            if (ny > nX) {
                nD = nN + nX;
            }

            for (var nv = nN; nD > nv; ++nv) no += this.hexByte(this.get(nv));

            return ny > nX && (no += nG), no;
        };

        nO.prototype.parseOID = function (nN, nD) {
            for (var ny = "", no = 0, nv = 0, nm = nN; nD > nm; ++nm) {
                var nd = this.get(nm);

                if (no = no << 7 | 127 & nd, nv += 7, !(128 & nd)) {
                    if ("" === ny) {
                        if (80 > no) {
                            var nr = 40 > no ? 0 : 1;
                        } else {
                            var nr = 2;
                        }

                        ny = nr + "." + (no - 40 * nr);
                    } else ny += "." + (nv >= 31 ? "bigint" : no);

                    no = nv = 0;
                }
            }

            return ny;
        };

        nt.prototype.typeName = function () {
            if (this.tag === nj) return "unknown";
            var nN = this.tag >> 6;
            var nD = (this.tag >> 5 & 1, 31 & this.tag);

            switch (nN) {
                case 0:
                    switch (nD) {
                        case 0:
                            return "EOC";

                        case 1:
                            return "BOOLEAN";

                        case 2:
                            return "INTEGER";

                        case 3:
                            return "BIT_STRING";

                        case 4:
                            return "OCTET_STRING";

                        case 5:
                            return "NULL";

                        case 6:
                            return "OBJECT_IDENTIFIER";

                        case 7:
                            return "ObjectDescriptor";

                        case 8:
                            return "EXTERNAL";

                        case 9:
                            return "REAL";

                        case 10:
                            return "ENUMERATED";

                        case 11:
                            return "EMBEDDED_PDV";

                        case 12:
                            return "UTF8String";

                        case 16:
                            return "SEQUENCE";

                        case 17:
                            return "SET";

                        case 18:
                            return "NumericString";

                        case 19:
                            return "PrintableString";

                        case 20:
                            return "TeletexString";

                        case 21:
                            return "VideotexString";

                        case 22:
                            return "IA5String";

                        case 23:
                            return "UTCTime";

                        case 24:
                            return "GeneralizedTime";

                        case 25:
                            return "GraphicString";

                        case 26:
                            return "VisibleString";

                        case 27:
                            return "GeneralString";

                        case 28:
                            return "UniversalString";

                        case 30:
                            return "BMPString";

                        default:
                            return "Universal_" + nD.toString(16);
                    }

                case 1:
                    return "Application_" + nD.toString(16);

                case 2:
                    return "[" + nD + "]";

                case 3:
                    return "Private_" + nD.toString(16);
            }
        };

        nt.prototype.reSeemsASCII = /^[ -~]+$/;

        nt.prototype.content = function () {
            if (this.tag === nj) return null;
            var nN = this.tag >> 6;
            var nD = 31 & this.tag;
            var ny = this.posContent();
            var no = Math.abs(this.length);

            if (0 !== nN) {
                if (null !== this.sub) return "(" + this.sub.length + " elem)";
                var nv = this.stream.parseStringISO(ny, ny + Math.min(no, nX));
                return this.reSeemsASCII.test(nv) ? nv.substring(0, 2 * nX) + (nv.length > 2 * nX ? nG : "") : this.stream.parseOctetString(ny, ny + no);
            }

            switch (nD) {
                case 1:
                    return 0 === this.stream.get(ny) ? "false" : "true";

                case 2:
                    return this.stream.parseInteger(ny, ny + no);

                case 3:
                    return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(ny, ny + no);

                case 4:
                    return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(ny, ny + no);

                case 6:
                    return this.stream.parseOID(ny, ny + no);

                case 16:
                case 17:
                    return "(" + this.sub.length + " elem)";

                case 12:
                    return this.stream.parseStringUTF(ny, ny + no);

                case 18:
                case 19:
                case 20:
                case 21:
                case 22:
                case 26:
                    return this.stream.parseStringISO(ny, ny + no);

                case 30:
                    return this.stream.parseStringBMP(ny, ny + no);

                case 23:
                case 24:
                    return this.stream.parseTime(ny, ny + no);
            }

            return null;
        };

        nt.prototype.toString = function () {
            return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]";
        };

        nt.prototype.print = function (nN) {
            if (nN === nj && (nN = ""), document.writeln(nN + this), null !== this.sub) {
                nN += "  ";

                for (var nD = 0, ny = this.sub.length; ny > nD; ++nD) this.sub[nD].print(nN);
            }
        };

        nt.prototype.toPrettyString = function (nN) {
            if (nN === nj) {
                nN = "";
            }

            var nD = nN + this.typeName() + " @" + this.stream.pos;

            if (this.length >= 0 && (nD += "+"), nD += this.length, 32 & this.tag ? nD += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (nD += " (encapsulates)"), nD += "\n", null !== this.sub) {
                nN += "  ";

                for (var ny = 0, no = this.sub.length; no > ny; ++ny) nD += this.sub[ny].toPrettyString(nN);
            }

            return nD;
        };

        nt.prototype.toDOM = function () {
            var nN = nx.tag("div", "node");
            nN.asn1 = this;
            var nD = nx.tag("div", "head");
            var ny = this.typeName().replace(/_/g, " ");
            nD.innerHTML = ny;
            var no = this.content();

            if (null !== no) {
                no = String(no).replace(/</g, "&lt;");
                var nv = nx.tag("span", "preview");
                nv.appendChild(nx.text(no));
                nD.appendChild(nv);
            }

            nN.appendChild(nD);
            this.node = nN;
            this.head = nD;
            var nm = nx.tag("div", "value");

            if (ny = "Offset: " + this.stream.pos + "<br/>", ny += "Length: " + this.header + "+", ny += this.length >= 0 ? this.length : -this.length + " (undefined)", 32 & this.tag ? ny += "<br/>(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (ny += "<br/>(encapsulates)"), null !== no && (ny += "<br/>Value:<br/><b>" + no + "</b>", "object" == typeof oids && 6 == this.tag)) {
                var nd = oids[no];

                if (nd) {
                    nd.d && (ny += "<br/>" + nd.d);
                    nd.c && (ny += "<br/>" + nd.c);
                    nd.w && (ny += "<br/>(warning!)");
                }
            }

            nm.innerHTML = ny;
            nN.appendChild(nm);
            var nr = nx.tag("div", "sub");

            if (null !== this.sub) {
                for (var nQ = 0, nP = this.sub.length; nP > nQ; ++nQ) nr.appendChild(this.sub[nQ].toDOM());
            }

            return nN.appendChild(nr), nD.onclick = function () {
                if ("node collapsed" == nN.className) {
                    nN.className = "node";
                } else {
                    nN.className = "node collapsed";
                }
            }, nN;
        };

        nt.prototype.posStart = function () {
            return this.stream.pos;
        };

        nt.prototype.posContent = function () {
            return this.stream.pos + this.header;
        };

        nt.prototype.posEnd = function () {
            return this.stream.pos + this.header + Math.abs(this.length);
        };

        nt.prototype.fakeHover = function (nN) {
            this.node.className += " hover";
            nN && (this.head.className += " hover");
        };

        nt.prototype.fakeOut = function (nN) {
            var nD = / ?hover/;
            this.node.className = this.node.className.replace(nD, "");
            nN && (this.head.className = this.head.className.replace(nD, ""));
        };

        nt.prototype.toHexDOM_sub = function (nN, nD, ny, no, nv) {
            if (!(no >= nv)) {
                var nm = nx.tag("span", nD);
                nm.appendChild(nx.text(ny.hexDump(no, nv)));
                nN.appendChild(nm);
            }
        };

        nt.prototype.toHexDOM = function (nN) {
            var nD = nx.tag("span", "hex");
            if (nN === nj && (nN = nD), this.head.hexNode = nD, this.head.onmouseover = function () {
                this.hexNode.className = "hexCurrent";
            }, this.head.onmouseout = function () {
                this.hexNode.className = "hex";
            }, nD.asn1 = this, nD.onmouseover = function () {
                var nd = !nN.selected;
                nd && (nN.selected = this.asn1, this.className = "hexCurrent");
                this.asn1.fakeHover(nd);
            }, nD.onmouseout = function () {
                var nd = nN.selected == this.asn1;
                this.asn1.fakeOut(nd);
                nd && (nN.selected = null, this.className = "hex");
            }, this.toHexDOM_sub(nD, "tag", this.stream, this.posStart(), this.posStart() + 1), this.toHexDOM_sub(nD, this.length >= 0 ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()), null === this.sub) nD.appendChild(nx.text(this.stream.hexDump(this.posContent(), this.posEnd())));else {
                if (this.sub.length > 0) {
                    var ny = this.sub[0];
                    var no = this.sub[this.sub.length - 1];
                    this.toHexDOM_sub(nD, "intro", this.stream, this.posContent(), ny.posStart());

                    for (var nv = 0, nm = this.sub.length; nm > nv; ++nv) nD.appendChild(this.sub[nv].toHexDOM(nN));

                    this.toHexDOM_sub(nD, "outro", this.stream, no.posEnd(), this.posEnd());
                }
            }
            return nD;
        };

        nt.prototype.toHexString = function () {
            return this.stream.hexDump(this.posStart(), this.posEnd(), !0);
        };

        nt.decodeLength = function (nN) {
            var nD = nN.get();
            var ny = 127 & nD;
            if (ny == nD) return ny;
            if (ny > 3) throw "Length over 24 bits not supported at position " + (nN.pos - 1);
            if (0 === ny) return -1;
            nD = 0;

            for (var no = 0; ny > no; ++no) nD = nD << 8 | nN.get();

            return nD;
        };

        nt.hasContent = function (nN, nD, ny) {
            if (32 & nN) return !0;
            if (3 > nN || nN > 4) return !1;
            var no = new nO(ny);

            if (3 == nN) {
                no.get();
            }

            var nv = no.get();
            if (nv >> 6 & 1) return !1;

            try {
                var nm = nt.decodeLength(no);
                return no.pos - ny.pos + nm == nD;
            } catch (nd) {
                console.log(nd);
                return !1;
            }
        };

        nt.decode = function (nN) {
            nN instanceof nO || (nN = new nO(nN, 0));
            var nD = new nO(nN);
            var ny = nN.get();
            var no = nt.decodeLength(nN);
            var nv = nN.pos - nD.pos;
            var nm = null;

            if (nt.hasContent(ny, no, nN)) {
                var nd = nN.pos;

                if (3 == ny && nN.get(), nm = [], no >= 0) {
                    for (var nr = nd + no; nN.pos < nr;) nm[nm.length] = nt.decode(nN);

                    if (nN.pos != nr) throw "Content size is not correct for container starting at offset " + nd;
                } else try {
                    for (;;) {
                        var nQ = nt.decode(nN);
                        if (0 === nQ.tag) break;
                        nm[nm.length] = nQ;
                    }

                    no = nd - nN.pos;
                } catch (nP) {
                    console.log(nP);
                    throw "Exception while decoding undefined length content: " + nP;
                }
            } else nN.pos += no;

            return new nt(nD, nv, no, ny, nm);
        };

        nt.test = function () {
            for (var nN = [{
                "value": [39],
                "expected": 39
            }, {
                "value": [129, 201],
                "expected": 201
            }, {
                "value": [131, 254, 220, 186],
                "expected": 16702650
            }], nD = 0, ny = nN.length; ny > nD; ++nD) {
                var no = new nO(nN[nD].value, 0);
                var nv = nt.decodeLength(no);

                if (nv != nN[nD].expected) {
                    document.write("In test[" + nD + "] expected " + nN[nD].expected + " got " + nv + "\n");
                }
            }
        };

        window.ASN1 = nt;
    })();

    ASN1.prototype.getHexStringValue = function () {
        var nj = this.toHexString();
        var nO = 2 * this.header;
        var nt = 2 * this.length;
        return nj.substr(nO, nt);
    };

    n7.prototype.parseKey = function (nj) {
        try {
            var nO = 0;
            var nt = 0;
            var nX = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/;

            if (nX.test(nj)) {
                var nG = Hex.decode(nj);
            } else {
                var nG = Base64.unarmor(nj);
            }

            var nx = ASN1.decode(nG);

            if (3 === nx.sub.length && (nx = nx.sub[2].sub[0]), 9 === nx.sub.length) {
                nO = nx.sub[1].getHexStringValue();
                this.n = n3(nO, 16);
                nt = nx.sub[2].getHexStringValue();
                this.e = parseInt(nt, 16);
                var nN = nx.sub[3].getHexStringValue();
                this.d = n3(nN, 16);
                var nD = nx.sub[4].getHexStringValue();
                this.p = n3(nD, 16);
                var ny = nx.sub[5].getHexStringValue();
                this.q = n3(ny, 16);
                var no = nx.sub[6].getHexStringValue();
                this.dmp1 = n3(no, 16);
                var nv = nx.sub[7].getHexStringValue();
                this.dmq1 = n3(nv, 16);
                var nm = nx.sub[8].getHexStringValue();
                this.coeff = n3(nm, 16);
            } else {
                if (2 !== nx.sub.length) return !1;
                var nd = nx.sub[1];
                var nr = nd.sub[0];
                nO = nr.sub[0].getHexStringValue();
                this.n = n3(nO, 16);
                nt = nr.sub[1].getHexStringValue();
                this.e = parseInt(nt, 16);
            }

            return !0;
        } catch (nQ) {
            console.log(nQ);
            return !1;
        }
    };

    n7.prototype.getPrivateBaseKey = function () {
        var nj = {
            "array": [new KJUR.asn1.DERInteger({
                "int": 0
            }), new KJUR.asn1.DERInteger({
                "bigint": this.n
            }), new KJUR.asn1.DERInteger({
                "int": this.e
            }), new KJUR.asn1.DERInteger({
                "bigint": this.d
            }), new KJUR.asn1.DERInteger({
                "bigint": this.p
            }), new KJUR.asn1.DERInteger({
                "bigint": this.q
            }), new KJUR.asn1.DERInteger({
                "bigint": this.dmp1
            }), new KJUR.asn1.DERInteger({
                "bigint": this.dmq1
            }), new KJUR.asn1.DERInteger({
                "bigint": this.coeff
            })]
        };
        var nO = new KJUR.asn1.DERSequence(nj);
        return nO.getEncodedHex();
    };

    n7.prototype.getPrivateBaseKeyB64 = function () {
        return nS(this.getPrivateBaseKey());
    };

    n7.prototype.getPublicBaseKey = function () {
        var nj = {
            "array": [new KJUR.asn1.DERObjectIdentifier({
                "oid": "1.2.840.113549.1.1.1"
            }), new KJUR.asn1.DERNull()]
        };
        var nO = new KJUR.asn1.DERSequence(nj);
        nj = {
            "array": [new KJUR.asn1.DERInteger({
                "bigint": this.n
            }), new KJUR.asn1.DERInteger({
                "int": this.e
            })]
        };
        var nt = new KJUR.asn1.DERSequence(nj);
        nj = {
            "hex": "00" + nt.getEncodedHex()
        };
        var nX = new KJUR.asn1.DERBitString(nj);
        nj = {
            "array": [nO, nX]
        };
        var nG = new KJUR.asn1.DERSequence(nj);
        return nG.getEncodedHex();
    };

    n7.prototype.getPublicBaseKeyB64 = function () {
        return nS(this.getPublicBaseKey());
    };

    n7.prototype.wordwrap = function (nj, nO) {
        if (nO = nO || 64, !nj) return nj;
        var nt = "(.{1," + nO + "})( +|$\n?)|(.{1," + nO + "})";
        return nj.match(RegExp(nt, "g")).join("\n");
    };

    n7.prototype.getPrivateKey = function () {
        var nj = "-----BEGIN RSA PRIVATE KEY-----\n";
        return nj += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n", nj += "-----END RSA PRIVATE KEY-----";
    };

    n7.prototype.getPublicKey = function () {
        var nj = "-----BEGIN PUBLIC KEY-----\n";
        return nj += this.wordwrap(this.getPublicBaseKeyB64()) + "\n", nj += "-----END PUBLIC KEY-----";
    };

    n7.prototype.hasPublicKeyProperty = function (nj) {
        return nj = nj || {}, nj.hasOwnProperty("n") && nj.hasOwnProperty("e");
    };

    n7.prototype.hasPrivateKeyProperty = function (nj) {
        return nj = nj || {}, nj.hasOwnProperty("n") && nj.hasOwnProperty("e") && nj.hasOwnProperty("d") && nj.hasOwnProperty("p") && nj.hasOwnProperty("q") && nj.hasOwnProperty("dmp1") && nj.hasOwnProperty("dmq1") && nj.hasOwnProperty("coeff");
    };

    n7.prototype.parsePropertiesFrom = function (nj) {
        this.n = nj.n;
        this.e = nj.e;
        nj.hasOwnProperty("d") && (this.d = nj.d, this.p = nj.p, this.q = nj.q, this.dmp1 = nj.dmp1, this.dmq1 = nj.dmq1, this.coeff = nj.coeff);
    };

    var nh = function (nj) {
        n7.call(this);
        nj && ("string" == typeof nj ? this.parseKey(nj) : (this.hasPrivateKeyProperty(nj) || this.hasPublicKeyProperty(nj)) && this.parsePropertiesFrom(nj));
    };

    nh.prototype = new n7();
    nh.prototype.constructor = nh;

    var nH = function (nj) {
        nj = nj || {};
        this.default_key_size = parseInt(nj.default_key_size) || 1024;
        this.default_public_exponent = nj.default_public_exponent || "010001";
        this.log = nj.log || !1;
        this.key = null;
    };

    nH.prototype.setKey = function (nj) {
        this.log && this.key && console.warn("A key was already set, overriding existing.");
        this.key = new nh(nj);
    };

    nH.prototype.setPrivateKey = function (nj) {
        this.setKey(nj);
    };

    nH.prototype.setPublicKey = function (nj) {
        this.setKey(nj);
    };

    nH.prototype.decrypt = function (nj) {
        try {
            return this.getKey().decrypt(nf(nj));
        } catch (nO) {
            console.log(nO);
            return !1;
        }
    };

    nH.prototype.encrypt = function (nj) {
        try {
            return nS(this.getKey().encrypt(nj));
        } catch (nO) {
            console.log(nO);
            return !1;
        }
    };

    nH.prototype.getKey = function (nj) {
        if (!this.key) {
            if (this.key = new nh(), nj && "[object Function]" === {}.toString.call(nj)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, nj);
            this.key.generate(this.default_key_size, this.default_public_exponent);
        }

        return this.key;
    };

    nH.prototype.getPrivateKey = function () {
        return this.getKey().getPrivateKey();
    };

    nH.prototype.getPrivateKeyB64 = function () {
        return this.getKey().getPrivateBaseKeyB64();
    };

    nH.prototype.getPublicKey = function () {
        return this.getKey().getPublicKey();
    };

    nH.prototype.getPublicKeyB64 = function () {
        return this.getKey().getPublicBaseKeyB64();
    };

    p.JSEncrypt = nH;
})(JSEncryptExports);

var JSEncrypt = JSEncryptExports.JSEncrypt;
if (YAHOO === undefined) var YAHOO = {};
YAHOO.lang = {
    "extend": function (p, n, A) {
        if (!n || !p) throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included.");

        var L = function () {};

        L.prototype = n.prototype;
        p.prototype = new L();
        p.prototype.constructor = p;
        p.superclass = n.prototype;

        if (n.prototype.constructor == Object.prototype.constructor) {
            n.prototype.constructor = n;
        }

        if (A) {
            var S;

            for (S in A) {
                p.prototype[S] = A[S];
            }

            var Y = function () {};

            var J = ["toString", "valueOf"];

            try {
                if (/MSIE/.test(navigator.userAgent)) {
                    Y = function (C, V) {
                        for (S = 0; S < J.length; S = S + 1) {
                            var W = J[S];
                            var R = V[W];

                            if (typeof R === "function" && R != Object.prototype[W]) {
                                C[W] = R;
                            }
                        }
                    };
                }
            } catch (C) {
                console.log(C);
            }

            Y(p.prototype, A);
        }
    }
};
PVA = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAy5R1R2yM5jPPvkO2F47qVqMkYj7o92DF8y1yMkCSxY1WwqG0\ndCdUZTnaoBuAz99wGt55oGLcdalV71nPUiGWs/b6GzVN5v72baz/Q2OxHtkrFKqL\nVX16LW31cW9hAntN84RCbvTeB0MNV+SHmXjIf17OQLCtDKHBZWZ5NKyqFstO+KOd\nu32d2jsw+DT5lOBzDUBk/wUw2KyFJVx7eK6sSXEyWqBk2nxMRDNYixIEN1V1EBSq\nf+OwKK5Mxi04r38+Qog8z03/t/u6CfAOWVmi+MdrD1VHXv/P7bnFlgRcLzKwK1QL\nTSLBE1PrMmNNj0oRjByhMoI9tY5X6mRBqLyDhwIDAQABAoIBAGO++RmGO6D9CNAJ\n4Bm52eKaK5UBiubOIR8NiNLLZb5qinRxg3eX35d7Wb2xzBLNwOFBWSl21trFncfY\n4qY0s+C4ZYHYQ7Om/7nsFeQAYAOj1yJYj01TXf4NTsGGF2t+W8qxZlV0H6dCOLL0\nU2YkUmRp4Le8eQVj6dyTcVaYNPxWQBnb9ZOEIEvEjeoO/DD7CCmt7LDCey9KrTQl\nAvuc2nN6uRV1Wfm0P8conKPJtVdgzMvJujNdpz+bBDqwsqgeCICjs/hSCNO81VH3\nDD7J0mG2OHqowOVqagoDHpBprHOUKxAeTs9I0KEL+hEI4zXCDL69+Xs6azuts733\nzSOmwxkCgYEA25czfPVxxcK685LhaAvwbmzWHqNp07ytRNGf+Aww6OdgWkdgPy0n\n20Gkg0HAqsxGcgZJk6cAkOy5hBLNHpHlGbeWFi+62lVNYUv3hAxumtiPyBMu7avE\nZQCTXND1H1f/2enRDJRxQsR8y/SX1ivmC5U6fx7hbpKxnXyRHnvSlk8CgYEA7VWp\nhLNkn4AEaPPW0TknwKG40At/hjecX2zWAyZVt4ydDSeKgMEOUdmvGGlSCrefAl0n\nPTfM9SdIDcO5OTa2wUayKLIsrb6TDnG6KXXN6z3HR3Q4qKJbG83eaMYDqqziPPV+\nxzRVWShI3EGwkLczASmiYy+sEAT0OkxP59xTKUkCgYBgaGjFkukJfy4fJDxsNtmv\nUX9MYkhjGrIjxbjq6UdL6dGGsVGTSxr1i0NUETkqg5bmFtaUybxY5GWqk6qUok8o\nVE7DnN73Xn4jmnun8OFagHvXxnxTApeuFGueU2tbAIKmxJ3wXPfA7Y0w6kkDUbCl\nIzZUe1VT+3mZgAgijxBsxwKBgQDNytiJ62/V6hBo3P6pPtEcdF6nb0DtpazfBaVw\n572twaywqlermzsKeCIenbx49I1ZZGLQ72C2NpCA9vTWCn5fiyiSpyScp0ImZTDS\nIIckctYoPDug5d7wdgtjeEfXp78osopyuwtCmu7Kpd8vLNt6J5raPI0K+vC22FL1\nLpOhmQKBgQCFeU448fL87N1MjMyusi8wJ5MLcn+kHbLTtpskTpfQM2p3Cnp4oL+7\nBI4AlXlKItV37rJIjZxQgLWhGoTZPplZaW4ooJCFJbazce5ua5fnsFS0oXhDN7uw\njaq+v5t8G6gFS09hEa4kz9O53t/7UGuQqh0Bxb0cJ9iNeAlhagvBDQ==\n-----END RSA PRIVATE KEY-----";

var CryptoJS = CryptoJS || function (p, n) {
    var A = {};
    var L = A.lib = {};

    var S = L.Base = function () {
        function E() {}

        return {
            "extend": function (s) {
                E.prototype = this;
                var I = new E();
                return s && I.mixIn(s), !I.hasOwnProperty("init") && (I.init = function () {
                    I.$super.init.apply(this, arguments);
                }), I.init.prototype = I, I.$super = this, I;
            },
            "create": function () {
                var s = this.extend();
                return s.init.apply(s, arguments), s;
            },
            "init": function () {},
            "mixIn": function (s) {
                for (var I in s) {
                    if (s.hasOwnProperty(I)) {
                        this[I] = s[I];
                    }
                }

                if (s.hasOwnProperty("toString")) {
                    this.toString = s.toString;
                }
            },
            "clone": function () {
                return this.init.prototype.extend(this);
            }
        };
    }();

    var Y = L.WordArray = S.extend({
        "init": function (E, s) {
            E = this.words = E || [];
            s != n ? this.sigBytes = s : this.sigBytes = E.length * 4;
        },
        "toString": function (E) {
            return (E || C).stringify(this);
        },
        "concat": function (E) {
            var I = this.words;
            var K = E.words;
            var T = this.sigBytes;
            var Z = E.sigBytes;
            this.clamp();
            if (T % 4) for (var w = 0; w < Z; w++) {
                var M = K[w >>> 2] >>> 24 - w % 4 * 8 & 255;
                I[T + w >>> 2] |= M << 24 - (T + w) % 4 * 8;
            } else for (var w = 0; w < Z; w += 4) {
                I[T + w >>> 2] = K[w >>> 2];
            }
            return this.sigBytes += Z, this;
        },
        "clamp": function () {
            var E = this.words;
            var s = this.sigBytes;
            E[s >>> 2] &= 4294967295 << 32 - s % 4 * 8;
            E.length = p.ceil(s / 4);
        },
        "clone": function () {
            var E = S.clone.call(this);
            return E.words = this.words.slice(0), E;
        },
        "random": function (E) {
            var s = [];

            for (var I = 0; I < E; I += 4) {
                s.push(p.random() * 4294967296 | 0);
            }

            return new Y.init(s, E);
        }
    });
    var J = A.enc = {};
    var C = J.Hex = {
        "stringify": function (E) {
            var I = E.words;
            var K = E.sigBytes;
            var T = [];

            for (var Z = 0; Z < K; Z++) {
                var w = I[Z >>> 2] >>> 24 - Z % 4 * 8 & 255;
                T.push((w >>> 4).toString(16));
                T.push((w & 15).toString(16));
            }

            return T.join("");
        },
        "parse": function (E) {
            var s = E.length;
            var I = [];

            for (var K = 0; K < s; K += 2) {
                I[K >>> 3] |= parseInt(E.substr(K, 2), 16) << 24 - K % 8 * 4;
            }

            return new Y.init(I, s / 2);
        }
    };
    var V = J.Latin1 = {
        "stringify": function (E) {
            var I = E.words;
            var K = E.sigBytes;
            var T = [];

            for (var Z = 0; Z < K; Z++) {
                var w = I[Z >>> 2] >>> 24 - Z % 4 * 8 & 255;
                T.push(String.fromCharCode(w));
            }

            return T.join("");
        },
        "parse": function (E) {
            var s = E.length;
            var I = [];

            for (var K = 0; K < s; K++) {
                I[K >>> 2] |= (E.charCodeAt(K) & 255) << 24 - K % 4 * 8;
            }

            return new Y.init(I, s);
        }
    };
    var W = J.Utf8 = {
        "stringify": function (E) {
            try {
                return decodeURIComponent(escape(V.stringify(E)));
            } catch (s) {
                console.log(s);
                throw new Error("Malformed UTF-8 data");
            }
        },
        "parse": function (E) {
            return V.parse(unescape(encodeURIComponent(E)));
        }
    };
    var R = L.BufferedBlockAlgorithm = S.extend({
        "reset": function () {
            this._data = new Y.init();
            this._nDataBytes = 0;
        },
        "_append": function (E) {
            typeof E == "string" && (E = W.parse(E));

            this._data.concat(E);

            this._nDataBytes += E.sigBytes;
        },
        "_process": function (E) {
            var I = this._data;
            var K = I.words;
            var T = I.sigBytes;
            var Z = this.blockSize;
            var M = Z * 4;
            var U = T / M;

            if (E) {
                U = p.ceil(U);
            } else {
                U = p.max((U | 0) - this._minBufferSize, 0);
            }

            var H = U * Z;
            var O = p.min(H * 4, T);

            if (H) {
                for (var X = 0; X < H; X += Z) {
                    this._doProcessBlock(K, X);
                }

                var G = K.splice(0, H);
                I.sigBytes -= O;
            }

            return new Y.init(G, O);
        },
        "clone": function () {
            var E = S.clone.call(this);
            return E._data = this._data.clone(), E;
        },
        "_minBufferSize": 0
    });
    var B = L.Hasher = R.extend({
        "cfg": S.extend(),
        "init": function (E) {
            this.cfg = this.cfg.extend(E);
            this.reset();
        },
        "reset": function () {
            R.reset.call(this);

            this._doReset();
        },
        "update": function (E) {
            return this._append(E), this._process(), this;
        },
        "finalize": function (E) {
            if (E) {
                this._append(E);
            }

            var s = this._doFinalize();

            return s;
        },
        "blockSize": 16,
        "_createHelper": function (E) {
            return function (s, I) {
                return new E.init(I).finalize(s);
            };
        },
        "_createHmacHelper": function (E) {
            return function (s, I) {
                return new F.HMAC.init(E, I).finalize(s);
            };
        }
    });
    var F = A.algo = {};
    return A;
}(Math);

(function (p) {
    var n = CryptoJS;
    var c = n.lib;
    var A = c.Base;
    var L = c.WordArray;
    var n = n.x64 = {};
    n.Word = A.extend({
        "init": function (S, Y) {
            this.high = S;
            this.low = Y;
        }
    });
    n.WordArray = A.extend({
        "init": function (S, Y) {
            S = this.words = S || [];
            Y != p ? this.sigBytes = Y : this.sigBytes = 8 * S.length;
        },
        "toX32": function () {
            for (var S = this.words, Y = S.length, J = [], C = 0; C < Y; C++) {
                var V = S[C];
                J.push(V.high);
                J.push(V.low);
            }

            return L.create(J, this.sigBytes);
        },
        "clone": function () {
            for (var S = A.clone.call(this), Y = S.words = this.words.slice(0), J = Y.length, C = 0; C < J; C++) Y[C] = Y[C].clone();

            return S;
        }
    });
})();

CryptoJS.lib.Cipher || function (c) {
    var a = CryptoJS;
    var A = a.lib;
    var L = A.Base;
    var S = A.WordArray;
    var Y = A.BufferedBlockAlgorithm;
    var J = a.enc.Base64;
    var b = a.algo.EvpKDF;
    var C = A.Cipher = Y.extend({
        "cfg": L.extend(),
        "createEncryptor": function (I, K) {
            return this.create(this._ENC_XFORM_MODE, I, K);
        },
        "createDecryptor": function (I, K) {
            return this.create(this._DEC_XFORM_MODE, I, K);
        },
        "init": function (I, K, T) {
            this.cfg = this.cfg.extend(T);
            this._xformMode = I;
            this._key = K;
            this.reset();
        },
        "reset": function () {
            Y.reset.call(this);

            this._doReset();
        },
        "process": function (I) {
            return this._append(I), this._process();
        },
        "finalize": function (I) {
            return I && this._append(I), this._doFinalize();
        },
        "keySize": 4,
        "ivSize": 4,
        "_ENC_XFORM_MODE": 1,
        "_DEC_XFORM_MODE": 2,
        "_createHelper": function (I) {
            return {
                "encrypt": function (K, T, i) {
                    return ("string" == typeof T ? E : F).encrypt(I, K, T, i);
                },
                "decrypt": function (K, T, i) {
                    return ("string" == typeof T ? E : F).decrypt(I, K, T, i);
                }
            };
        }
    });
    A.StreamCipher = C.extend({
        "_doFinalize": function () {
            return this._process(!0);
        },
        "blockSize": 1
    });
    var V = a.mode = {};

    var W = function (I, K, T) {
        var i = this._iv;

        if (i) {
            this._iv = c;
        } else {
            i = this._prevBlock;
        }

        for (var Z = 0; Z < T; Z++) I[K + Z] ^= i[Z];
    };

    var R = (A.BlockCipherMode = L.extend({
        "createEncryptor": function (I, K) {
            return this.Encryptor.create(I, K);
        },
        "createDecryptor": function (I, K) {
            return this.Decryptor.create(I, K);
        },
        "init": function (I, K) {
            this._cipher = I;
            this._iv = K;
        }
    })).extend();
    R.Encryptor = R.extend({
        "processBlock": function (I, K) {
            var T = this._cipher;
            var i = T.blockSize;
            W.call(this, I, K, i);
            T.encryptBlock(I, K);
            this._prevBlock = I.slice(K, K + i);
        }
    });
    R.Decryptor = R.extend({
        "processBlock": function (I, K) {
            var T = this._cipher;
            var i = T.blockSize;
            var Z = I.slice(K, K + i);
            T.decryptBlock(I, K);
            W.call(this, I, K, i);
            this._prevBlock = Z;
        }
    });
    V = V.CBC = R;
    R = (a.pad = {}).Pkcs7 = {
        "pad": function (I, K) {
            for (var T = 4 * K, T = T - I.sigBytes % T, i = T << 24 | T << 16 | T << 8 | T, Z = [], w = 0; w < T; w += 4) Z.push(i);

            T = S.create(Z, T);
            I.concat(T);
        },
        "unpad": function (I) {
            I.sigBytes -= I.words[I.sigBytes - 1 >>> 2] & 255;
        }
    };
    A.BlockCipher = C.extend({
        "cfg": C.cfg.extend({
            "mode": V,
            "padding": R
        }),
        "reset": function () {
            C.reset.call(this);
            var I = this.cfg;
            var K = I.iv;
            var I = I.mode;
            if (this._xformMode == this._ENC_XFORM_MODE) var T = I.createEncryptor;else {
                T = I.createDecryptor;
                this._minBufferSize = 1;
            }
            this._mode = T.call(I, this, K && K.words);
        },
        "_doProcessBlock": function (I, K) {
            this._mode.processBlock(I, K);
        },
        "_doFinalize": function () {
            var I = this.cfg.padding;

            if (this._xformMode == this._ENC_XFORM_MODE) {
                I.pad(this._data, this.blockSize);

                var K = this._process(!0);
            } else {
                K = this._process(!0);
                I.unpad(K);
            }

            return K;
        },
        "blockSize": 4
    });
    var B = A.CipherParams = L.extend({
        "init": function (I) {
            this.mixIn(I);
        },
        "toString": function (I) {
            return (I || this.formatter).stringify(this);
        }
    });
    var V = (a.format = {}).OpenSSL = {
        "stringify": function (I) {
            var K = I.ciphertext;
            return I = I.salt, (I ? S.create([1398893684, 1701076831]).concat(I).concat(K) : K).toString(J);
        },
        "parse": function (I) {
            I = J.parse(I);
            var K = I.words;

            if (1398893684 == K[0] && 1701076831 == K[1]) {
                var T = S.create(K.slice(2, 4));
                K.splice(0, 4);
                I.sigBytes -= 16;
            }

            return B.create({
                "ciphertext": I,
                "salt": T
            });
        }
    };
    var F = A.SerializableCipher = L.extend({
        "cfg": L.extend({
            "format": V
        }),
        "encrypt": function (I, K, T, i) {
            i = this.cfg.extend(i);
            var Z = I.createEncryptor(T, i);
            return K = Z.finalize(K), Z = Z.cfg, B.create({
                "ciphertext": K,
                "key": T,
                "iv": Z.iv,
                "algorithm": I,
                "mode": Z.mode,
                "padding": Z.padding,
                "blockSize": I.blockSize,
                "formatter": i.format
            });
        },
        "decrypt": function (I, K, T, i) {
            return i = this.cfg.extend(i), K = this._parse(K, i.format), I.createDecryptor(T, i).finalize(K.ciphertext);
        },
        "_parse": function (I, K) {
            return "string" == typeof I ? K.parse(I, this) : I;
        }
    });
    var a = (a.kdf = {}).OpenSSL = {
        "execute": function (I, K, T, i) {
            return i || (i = S.random(8)), I = b.create({
                "keySize": K + T
            }).compute(I, i), T = S.create(I.words.slice(K), 4 * T), I.sigBytes = 4 * K, B.create({
                "key": I,
                "iv": T,
                "salt": i
            });
        }
    };
    var E = A.PasswordBasedCipher = F.extend({
        "cfg": F.cfg.extend({
            "kdf": a
        }),
        "encrypt": function (I, K, T, i) {
            return i = this.cfg.extend(i), T = i.kdf.execute(T, I.keySize, I.ivSize), i.iv = T.iv, I = F.encrypt.call(this, I, K, T.key, i), I.mixIn(T), I;
        },
        "decrypt": function (I, K, T, i) {
            return i = this.cfg.extend(i), K = this._parse(K, i.format), T = i.kdf.execute(T, I.keySize, I.ivSize, K.salt), i.iv = T.iv, F.decrypt.call(this, I, K, T.key, i);
        }
    });
}();

(function () {
    for (var p = CryptoJS, c = p.lib.BlockCipher, a = p.algo, L = [], S = [], Y = [], J = [], V = [], W = [], R = [], I = [], K = [], T = [], i = [], e = 0; 256 > e; e++) if (128 > e) {
        i[e] = e << 1;
    } else {
        i[e] = e << 1 ^ 283;
    }

    for (var Z = 0, M = 0, e = 0; 256 > e; e++) {
        var U = M ^ M << 1 ^ M << 2 ^ M << 3 ^ M << 4;
        var U = U >>> 8 ^ U & 255 ^ 99;
        L[Z] = U;
        S[U] = Z;
        var h = i[Z];
        var H = i[h];
        var O = i[H];
        var X = 257 * i[U] ^ 16843008 * U;
        Y[Z] = X << 24 | X >>> 8;
        J[Z] = X << 16 | X >>> 16;
        V[Z] = X << 8 | X >>> 24;
        W[Z] = X;
        X = 16843009 * O ^ 65537 * H ^ 257 * h ^ 16843008 * Z;
        R[U] = X << 24 | X >>> 8;
        I[U] = X << 16 | X >>> 16;
        K[U] = X << 8 | X >>> 24;
        T[U] = X;
        Z ? (Z = h ^ i[i[i[O ^ h]]], M ^= i[i[M]]) : Z = M = 1;
    }

    var G = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];
    var a = a.AES = c.extend({
        "_doReset": function () {
            for (var N = this._key, o = N.words, m = N.sigBytes / 4, N = 4 * ((this._nRounds = m + 6) + 1), Q = this._keySchedule = [], P = 0; P < N; P++) if (P < m) Q[P] = o[P];else {
                var p0 = Q[P - 1];
                P % m ? 6 < m && 4 == P % m && (p0 = L[p0 >>> 24] << 24 | L[p0 >>> 16 & 255] << 16 | L[p0 >>> 8 & 255] << 8 | L[p0 & 255]) : (p0 = p0 << 8 | p0 >>> 24, p0 = L[p0 >>> 24] << 24 | L[p0 >>> 16 & 255] << 16 | L[p0 >>> 8 & 255] << 8 | L[p0 & 255], p0 ^= G[P / m | 0] << 24);
                Q[P] = Q[P - m] ^ p0;
            }

            o = this._invKeySchedule = [];

            for (m = 0; m < N; m++) {
                P = N - m;
                m % 4 ? p0 = Q[P] : p0 = Q[P - 4];
                4 > m || 4 >= P ? o[m] = p0 : o[m] = R[L[p0 >>> 24]] ^ I[L[p0 >>> 16 & 255]] ^ K[L[p0 >>> 8 & 255]] ^ T[L[p0 & 255]];
            }
        },
        "encryptBlock": function (N, o) {
            this._doCryptBlock(N, o, this._keySchedule, Y, J, V, W, L);
        },
        "decryptBlock": function (N, o) {
            var m = N[o + 1];
            N[o + 1] = N[o + 3];
            N[o + 3] = m;

            this._doCryptBlock(N, o, this._invKeySchedule, R, I, K, T, S);

            m = N[o + 1];
            N[o + 1] = N[o + 3];
            N[o + 3] = m;
        },
        "_doCryptBlock": function (N, o, Q, P, p0, p1, p2, p3) {
            for (var p4 = this._nRounds, p5 = N[o] ^ Q[0], p6 = N[o + 1] ^ Q[1], p7 = N[o + 2] ^ Q[2], p8 = N[o + 3] ^ Q[3], p9 = 4, pp = 1; pp < p4; pp++) var pn = P[p5 >>> 24] ^ p0[p6 >>> 16 & 255] ^ p1[p7 >>> 8 & 255] ^ p2[p8 & 255] ^ Q[p9++], pc = P[p6 >>> 24] ^ p0[p7 >>> 16 & 255] ^ p1[p8 >>> 8 & 255] ^ p2[p5 & 255] ^ Q[p9++], pa = P[p7 >>> 24] ^ p0[p8 >>> 16 & 255] ^ p1[p5 >>> 8 & 255] ^ p2[p6 & 255] ^ Q[p9++], p8 = P[p8 >>> 24] ^ p0[p5 >>> 16 & 255] ^ p1[p6 >>> 8 & 255] ^ p2[p7 & 255] ^ Q[p9++], p5 = pn, p6 = pc, p7 = pa;

            pn = (p3[p5 >>> 24] << 24 | p3[p6 >>> 16 & 255] << 16 | p3[p7 >>> 8 & 255] << 8 | p3[p8 & 255]) ^ Q[p9++];
            pc = (p3[p6 >>> 24] << 24 | p3[p7 >>> 16 & 255] << 16 | p3[p8 >>> 8 & 255] << 8 | p3[p5 & 255]) ^ Q[p9++];
            pa = (p3[p7 >>> 24] << 24 | p3[p8 >>> 16 & 255] << 16 | p3[p5 >>> 8 & 255] << 8 | p3[p6 & 255]) ^ Q[p9++];
            p8 = (p3[p8 >>> 24] << 24 | p3[p5 >>> 16 & 255] << 16 | p3[p6 >>> 8 & 255] << 8 | p3[p7 & 255]) ^ Q[p9++];
            N[o] = pn;
            N[o + 1] = pc;
            N[o + 2] = pa;
            N[o + 3] = p8;
        },
        "keySize": 8
    });
    p.AES = c._createHelper(a);
})();

(function () {
    function c(R, B) {
        var F = (this._lBlock >>> R ^ this._rBlock) & B;
        this._rBlock ^= F;
        this._lBlock ^= F << R;
    }

    function a(R, B) {
        var F = (this._rBlock >>> R ^ this._lBlock) & B;
        this._lBlock ^= F;
        this._rBlock ^= F << R;
    }

    var A = CryptoJS;
    var L = A.lib;
    var S = L.WordArray;
    var L = L.BlockCipher;
    var f = A.algo;
    var Y = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4];
    var J = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32];
    var b = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
    var C = [{
        "0": 8421888,
        268435456: 32768,
        536870912: 8421378,
        805306368: 2,
        1073741824: 512,
        1342177280: 8421890,
        1610612736: 8389122,
        1879048192: 8388608,
        2147483648: 514,
        2415919104: 8389120,
        2684354560: 33280,
        2952790016: 8421376,
        3221225472: 32770,
        3489660928: 8388610,
        3758096384: 0,
        4026531840: 33282,
        134217728: 0,
        402653184: 8421890,
        671088640: 33282,
        939524096: 32768,
        1207959552: 8421888,
        1476395008: 512,
        1744830464: 8421378,
        2013265920: 2,
        2281701376: 8389120,
        2550136832: 33280,
        2818572288: 8421376,
        3087007744: 8389122,
        3355443200: 8388610,
        3623878656: 32770,
        3892314112: 514,
        4160749568: 8388608,
        1: 32768,
        268435457: 2,
        536870913: 8421888,
        805306369: 8388608,
        1073741825: 8421378,
        1342177281: 33280,
        1610612737: 512,
        1879048193: 8389122,
        2147483649: 8421890,
        2415919105: 8421376,
        2684354561: 8388610,
        2952790017: 33282,
        3221225473: 514,
        3489660929: 8389120,
        3758096385: 32770,
        4026531841: 0,
        134217729: 8421890,
        402653185: 8421376,
        671088641: 8388608,
        939524097: 512,
        1207959553: 32768,
        1476395009: 8388610,
        1744830465: 2,
        2013265921: 33282,
        2281701377: 32770,
        2550136833: 8389122,
        2818572289: 514,
        3087007745: 8421888,
        3355443201: 8389120,
        3623878657: 0,
        3892314113: 33280,
        4160749569: 8421378
    }, {
        "0": 1074282512,
        16777216: 16384,
        33554432: 524288,
        50331648: 1074266128,
        67108864: 1073741840,
        83886080: 1074282496,
        100663296: 1073758208,
        117440512: 16,
        134217728: 540672,
        150994944: 1073758224,
        167772160: 1073741824,
        184549376: 540688,
        201326592: 524304,
        218103808: 0,
        234881024: 16400,
        251658240: 1074266112,
        8388608: 1073758208,
        25165824: 540688,
        41943040: 16,
        58720256: 1073758224,
        75497472: 1074282512,
        92274688: 1073741824,
        109051904: 524288,
        125829120: 1074266128,
        142606336: 524304,
        159383552: 0,
        176160768: 16384,
        192937984: 1074266112,
        209715200: 1073741840,
        226492416: 540672,
        243269632: 1074282496,
        260046848: 16400,
        268435456: 0,
        285212672: 1074266128,
        301989888: 1073758224,
        318767104: 1074282496,
        335544320: 1074266112,
        352321536: 16,
        369098752: 540688,
        385875968: 16384,
        402653184: 16400,
        419430400: 524288,
        436207616: 524304,
        452984832: 1073741840,
        469762048: 540672,
        486539264: 1073758208,
        503316480: 1073741824,
        520093696: 1074282512,
        276824064: 540688,
        293601280: 524288,
        310378496: 1074266112,
        327155712: 16384,
        343932928: 1073758208,
        360710144: 1074282512,
        377487360: 16,
        394264576: 1073741824,
        411041792: 1074282496,
        427819008: 1073741840,
        444596224: 1073758224,
        461373440: 524304,
        478150656: 0,
        494927872: 16400,
        511705088: 1074266128,
        528482304: 540672
    }, {
        "0": 260,
        1048576: 0,
        2097152: 67109120,
        3145728: 65796,
        4194304: 65540,
        5242880: 67108868,
        6291456: 67174660,
        7340032: 67174400,
        8388608: 67108864,
        9437184: 67174656,
        10485760: 65792,
        11534336: 67174404,
        12582912: 67109124,
        13631488: 65536,
        14680064: 4,
        15728640: 256,
        524288: 67174656,
        1572864: 67174404,
        2621440: 0,
        3670016: 67109120,
        4718592: 67108868,
        5767168: 65536,
        6815744: 65540,
        7864320: 260,
        8912896: 4,
        9961472: 256,
        11010048: 67174400,
        12058624: 65796,
        13107200: 65792,
        14155776: 67109124,
        15204352: 67174660,
        16252928: 67108864,
        16777216: 67174656,
        17825792: 65540,
        18874368: 65536,
        19922944: 67109120,
        20971520: 256,
        22020096: 67174660,
        23068672: 67108868,
        24117248: 0,
        25165824: 67109124,
        26214400: 67108864,
        27262976: 4,
        28311552: 65792,
        29360128: 67174400,
        30408704: 260,
        31457280: 65796,
        32505856: 67174404,
        17301504: 67108864,
        18350080: 260,
        19398656: 67174656,
        20447232: 0,
        21495808: 65540,
        22544384: 67109120,
        23592960: 256,
        24641536: 67174404,
        25690112: 65536,
        26738688: 67174660,
        27787264: 65796,
        28835840: 67108868,
        29884416: 67109124,
        30932992: 67174400,
        31981568: 4,
        33030144: 65792
    }, {
        "0": 2151682048,
        65536: 2147487808,
        131072: 4198464,
        196608: 2151677952,
        262144: 0,
        327680: 4198400,
        393216: 2147483712,
        458752: 4194368,
        524288: 2147483648,
        589824: 4194304,
        655360: 64,
        720896: 2147487744,
        786432: 2151678016,
        851968: 4160,
        917504: 4096,
        983040: 2151682112,
        32768: 2147487808,
        98304: 64,
        163840: 2151678016,
        229376: 2147487744,
        294912: 4198400,
        360448: 2151682112,
        425984: 0,
        491520: 2151677952,
        557056: 4096,
        622592: 2151682048,
        688128: 4194304,
        753664: 4160,
        819200: 2147483648,
        884736: 4194368,
        950272: 4198464,
        1015808: 2147483712,
        1048576: 4194368,
        1114112: 4198400,
        1179648: 2147483712,
        1245184: 0,
        1310720: 4160,
        1376256: 2151678016,
        1441792: 2151682048,
        1507328: 2147487808,
        1572864: 2151682112,
        1638400: 2147483648,
        1703936: 2151677952,
        1769472: 4198464,
        1835008: 2147487744,
        1900544: 4194304,
        1966080: 64,
        2031616: 4096,
        1081344: 2151677952,
        1146880: 2151682112,
        1212416: 0,
        1277952: 4198400,
        1343488: 4194368,
        1409024: 2147483648,
        1474560: 2147487808,
        1540096: 64,
        1605632: 2147483712,
        1671168: 4096,
        1736704: 2147487744,
        1802240: 2151678016,
        1867776: 4160,
        1933312: 2151682048,
        1998848: 4194304,
        2064384: 4198464
    }, {
        "0": 128,
        4096: 17039360,
        8192: 262144,
        12288: 536870912,
        16384: 537133184,
        20480: 16777344,
        24576: 553648256,
        28672: 262272,
        32768: 16777216,
        36864: 537133056,
        40960: 536871040,
        45056: 553910400,
        49152: 553910272,
        53248: 0,
        57344: 17039488,
        61440: 553648128,
        2048: 17039488,
        6144: 553648256,
        10240: 128,
        14336: 17039360,
        18432: 262144,
        22528: 537133184,
        26624: 553910272,
        30720: 536870912,
        34816: 537133056,
        38912: 0,
        43008: 553910400,
        47104: 16777344,
        51200: 536871040,
        55296: 553648128,
        59392: 16777216,
        63488: 262272,
        65536: 262144,
        69632: 128,
        73728: 536870912,
        77824: 553648256,
        81920: 16777344,
        86016: 553910272,
        90112: 537133184,
        94208: 16777216,
        98304: 553910400,
        102400: 553648128,
        106496: 17039360,
        110592: 537133056,
        114688: 262272,
        118784: 536871040,
        122880: 0,
        126976: 17039488,
        67584: 553648256,
        71680: 16777216,
        75776: 17039360,
        79872: 537133184,
        83968: 536870912,
        88064: 17039488,
        92160: 128,
        96256: 553910272,
        100352: 262272,
        104448: 553910400,
        108544: 0,
        112640: 553648128,
        116736: 16777344,
        120832: 262144,
        124928: 537133056,
        129024: 536871040
    }, {
        "0": 268435464,
        256: 8192,
        512: 270532608,
        768: 270540808,
        1024: 268443648,
        1280: 2097152,
        1536: 2097160,
        1792: 268435456,
        2048: 0,
        2304: 268443656,
        2560: 2105344,
        2816: 8,
        3072: 270532616,
        3328: 2105352,
        3584: 8200,
        3840: 270540800,
        128: 270532608,
        384: 270540808,
        640: 8,
        896: 2097152,
        1152: 2105352,
        1408: 268435464,
        1664: 268443648,
        1920: 8200,
        2176: 2097160,
        2432: 8192,
        2688: 268443656,
        2944: 270532616,
        3200: 0,
        3456: 270540800,
        3712: 2105344,
        3968: 268435456,
        4096: 268443648,
        4352: 270532616,
        4608: 270540808,
        4864: 8200,
        5120: 2097152,
        5376: 268435456,
        5632: 268435464,
        5888: 2105344,
        6144: 2105352,
        6400: 0,
        6656: 8,
        6912: 270532608,
        7168: 8192,
        7424: 268443656,
        7680: 270540800,
        7936: 2097160,
        4224: 8,
        4480: 2105344,
        4736: 2097152,
        4992: 268435464,
        5248: 268443648,
        5504: 8200,
        5760: 270540808,
        6016: 270532608,
        6272: 270540800,
        6528: 270532616,
        6784: 8192,
        7040: 2105352,
        7296: 2097160,
        7552: 0,
        7808: 268435456,
        8064: 268443656
    }, {
        "0": 1048576,
        16: 33555457,
        32: 1024,
        48: 1049601,
        64: 34604033,
        80: 0,
        96: 1,
        112: 34603009,
        128: 33555456,
        144: 1048577,
        160: 33554433,
        176: 34604032,
        192: 34603008,
        208: 1025,
        224: 1049600,
        240: 33554432,
        8: 34603009,
        24: 0,
        40: 33555457,
        56: 34604032,
        72: 1048576,
        88: 33554433,
        104: 33554432,
        120: 1025,
        136: 1049601,
        152: 33555456,
        168: 34603008,
        184: 1048577,
        200: 1024,
        216: 34604033,
        232: 1,
        248: 1049600,
        256: 33554432,
        272: 1048576,
        288: 33555457,
        304: 34603009,
        320: 1048577,
        336: 33555456,
        352: 34604032,
        368: 1049601,
        384: 1025,
        400: 34604033,
        416: 1049600,
        432: 1,
        448: 0,
        464: 34603008,
        480: 33554433,
        496: 1024,
        264: 1049600,
        280: 33555457,
        296: 34603009,
        312: 1,
        328: 33554432,
        344: 1048576,
        360: 1025,
        376: 34604032,
        392: 33554433,
        408: 34603008,
        424: 0,
        440: 34604033,
        456: 1049601,
        472: 1024,
        488: 33555456,
        504: 1048577
    }, {
        "0": 134219808,
        1: 131072,
        2: 134217728,
        3: 32,
        4: 131104,
        5: 134350880,
        6: 134350848,
        7: 2048,
        8: 134348800,
        9: 134219776,
        10: 133120,
        11: 134348832,
        12: 2080,
        13: 0,
        14: 134217760,
        15: 133152,
        2147483648: 2048,
        2147483649: 134350880,
        2147483650: 134219808,
        2147483651: 134217728,
        2147483652: 134348800,
        2147483653: 133120,
        2147483654: 133152,
        2147483655: 32,
        2147483656: 134217760,
        2147483657: 2080,
        2147483658: 131104,
        2147483659: 134350848,
        2147483660: 0,
        2147483661: 134348832,
        2147483662: 134219776,
        2147483663: 131072,
        16: 133152,
        17: 134350848,
        18: 32,
        19: 2048,
        20: 134219776,
        21: 134217760,
        22: 134348832,
        23: 131072,
        24: 0,
        25: 131104,
        26: 134348800,
        27: 134219808,
        28: 134350880,
        29: 133120,
        30: 2080,
        31: 134217728,
        2147483664: 131072,
        2147483665: 2048,
        2147483666: 134348832,
        2147483667: 133152,
        2147483668: 32,
        2147483669: 134348800,
        2147483670: 134217728,
        2147483671: 134219808,
        2147483672: 134350880,
        2147483673: 134217760,
        2147483674: 134219776,
        2147483675: 0,
        2147483676: 133120,
        2147483677: 2080,
        2147483678: 131104,
        2147483679: 134350848
    }];
    var V = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679];
    var W = f.DES = L.extend({
        "_doReset": function () {
            for (var R = this._key.words, B = [], F = 0; 56 > F; F++) {
                var E = Y[F] - 1;
                B[F] = R[E >>> 5] >>> 31 - E % 32 & 1;
            }

            R = this._subKeys = [];

            for (E = 0; 16 > E; E++) {
                for (var I = R[E] = [], K = b[E], F = 0; 24 > F; F++) {
                    I[F / 6 | 0] |= B[(J[F] - 1 + K) % 28] << 31 - F % 6;
                    I[4 + (F / 6 | 0)] |= B[28 + (J[F + 24] - 1 + K) % 28] << 31 - F % 6;
                }

                I[0] = I[0] << 1 | I[0] >>> 31;

                for (F = 1; 7 > F; F++) I[F] >>>= 4 * (F - 1) + 3;

                I[7] = I[7] << 5 | I[7] >>> 27;
            }

            B = this._invSubKeys = [];

            for (F = 0; 16 > F; F++) B[F] = R[15 - F];
        },
        "encryptBlock": function (R, B) {
            this._doCryptBlock(R, B, this._subKeys);
        },
        "decryptBlock": function (R, B) {
            this._doCryptBlock(R, B, this._invSubKeys);
        },
        "_doCryptBlock": function (R, B, F) {
            this._lBlock = R[B];
            this._rBlock = R[B + 1];
            c.call(this, 4, 252645135);
            c.call(this, 16, 65535);
            a.call(this, 2, 858993459);
            a.call(this, 8, 16711935);
            c.call(this, 1, 1431655765);

            for (var E = 0; 16 > E; E++) {
                for (var I = F[E], K = this._lBlock, T = this._rBlock, i = 0, Z = 0; 8 > Z; Z++) i |= C[Z][((T ^ I[Z]) & V[Z]) >>> 0];

                this._lBlock = T;
                this._rBlock = K ^ i;
            }

            F = this._lBlock;
            this._lBlock = this._rBlock;
            this._rBlock = F;
            c.call(this, 1, 1431655765);
            a.call(this, 8, 16711935);
            a.call(this, 2, 858993459);
            c.call(this, 16, 65535);
            c.call(this, 4, 252645135);
            R[B] = this._lBlock;
            R[B + 1] = this._rBlock;
        },
        "keySize": 2,
        "ivSize": 2,
        "blockSize": 2
    });
    A.DES = L._createHelper(W);
    f = f.TripleDES = L.extend({
        "_doReset": function () {
            var R = this._key.words;
            this._des1 = W.createEncryptor(S.create(R.slice(0, 2)));
            this._des2 = W.createEncryptor(S.create(R.slice(2, 4)));
            this._des3 = W.createEncryptor(S.create(R.slice(4, 6)));
        },
        "encryptBlock": function (R, B) {
            this._des1.encryptBlock(R, B);

            this._des2.decryptBlock(R, B);

            this._des3.encryptBlock(R, B);
        },
        "decryptBlock": function (R, B) {
            this._des3.decryptBlock(R, B);

            this._des2.encryptBlock(R, B);

            this._des1.decryptBlock(R, B);
        },
        "keySize": 6,
        "ivSize": 2,
        "blockSize": 2
    });
    A.TripleDES = L._createHelper(f);
})();

(function () {
    var p = CryptoJS;
    var n = p.lib.WordArray;
    p.enc.Base64 = {
        "stringify": function (A) {
            var L = A.words;
            var S = A.sigBytes;
            var Y = this._map;
            A.clamp();
            A = [];

            for (var J = 0; J < S; J += 3) for (var C = (L[J >>> 2] >>> 24 - 8 * (J % 4) & 255) << 16 | (L[J + 1 >>> 2] >>> 24 - 8 * ((J + 1) % 4) & 255) << 8 | L[J + 2 >>> 2] >>> 24 - 8 * ((J + 2) % 4) & 255, V = 0; 4 > V && J + 0.75 * V < S; V++) A.push(Y.charAt(C >>> 6 * (3 - V) & 63));

            if (L = Y.charAt(64)) {
                for (; A.length % 4;) A.push(L);
            }

            return A.join("");
        },
        "parse": function (A) {
            var L = A.length;
            var S = this._map;
            var Y = S.charAt(64);

            if (Y) {
                Y = A.indexOf(Y);
                -1 != Y && (L = Y);
            }

            for (var Y = [], J = 0, C = 0; C < L; C++) if (C % 4) {
                var V = S.indexOf(A.charAt(C - 1)) << 2 * (C % 4);
                var W = S.indexOf(A.charAt(C)) >>> 6 - 2 * (C % 4);
                Y[J >>> 2] |= (V | W) << 24 - 8 * (J % 4);
                J++;
            }

            return n.create(Y, J);
        },
        "_map": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    };
})();

(function (p) {
    function c(V, W, R, B, I, K, T) {
        return V = V + (W & R | ~W & B) + I + T, (V << K | V >>> 32 - K) + W;
    }

    function A(V, W, R, B, I, K, T) {
        return V = V + (W & B | R & ~B) + I + T, (V << K | V >>> 32 - K) + W;
    }

    function L(V, W, R, B, I, K, T) {
        return V = V + (W ^ R ^ B) + I + T, (V << K | V >>> 32 - K) + W;
    }

    function g(V, W, R, B, I, K, T) {
        return V = V + (R ^ (W | ~B)) + I + T, (V << K | V >>> 32 - K) + W;
    }

    for (var S = CryptoJS, f = S.lib, Y = f.WordArray, J = f.Hasher, f = S.algo, b = [], C = 0; 64 > C; C++) b[C] = 4294967296 * p.abs(p.sin(C + 1)) | 0;

    f = f.MD5 = J.extend({
        "_doReset": function () {
            this._hash = new Y.init([1732584193, 4023233417, 2562383102, 271733878]);
        },
        "_doProcessBlock": function (V, W) {
            for (var R = 0; 16 > R; R++) {
                var I = W + R;
                var K = V[I];
                V[I] = (K << 8 | K >>> 24) & 16711935 | (K << 24 | K >>> 8) & 4278255360;
            }

            var R = this._hash.words;
            var I = V[W + 0];
            var K = V[W + 1];
            var T = V[W + 2];
            var i = V[W + 3];
            var Z = V[W + 4];
            var M = V[W + 5];
            var U = V[W + 6];
            var H = V[W + 7];
            var O = V[W + 8];
            var X = V[W + 9];
            var G = V[W + 10];
            var N = V[W + 11];
            var o = V[W + 12];
            var Q = V[W + 13];
            var P = V[W + 14];
            var p0 = V[W + 15];
            var p1 = R[0];
            var p2 = R[1];
            var p3 = R[2];
            var p4 = R[3];
            var p1 = c(p1, p2, p3, p4, I, 7, b[0]);
            var p4 = c(p4, p1, p2, p3, K, 12, b[1]);
            var p3 = c(p3, p4, p1, p2, T, 17, b[2]);
            var p2 = c(p2, p3, p4, p1, i, 22, b[3]);
            var p1 = c(p1, p2, p3, p4, Z, 7, b[4]);
            var p4 = c(p4, p1, p2, p3, M, 12, b[5]);
            var p3 = c(p3, p4, p1, p2, U, 17, b[6]);
            var p2 = c(p2, p3, p4, p1, H, 22, b[7]);
            var p1 = c(p1, p2, p3, p4, O, 7, b[8]);
            var p4 = c(p4, p1, p2, p3, X, 12, b[9]);
            var p3 = c(p3, p4, p1, p2, G, 17, b[10]);
            var p2 = c(p2, p3, p4, p1, N, 22, b[11]);
            var p1 = c(p1, p2, p3, p4, o, 7, b[12]);
            var p4 = c(p4, p1, p2, p3, Q, 12, b[13]);
            var p3 = c(p3, p4, p1, p2, P, 17, b[14]);
            var p2 = c(p2, p3, p4, p1, p0, 22, b[15]);
            var p1 = A(p1, p2, p3, p4, K, 5, b[16]);
            var p4 = A(p4, p1, p2, p3, U, 9, b[17]);
            var p3 = A(p3, p4, p1, p2, N, 14, b[18]);
            var p2 = A(p2, p3, p4, p1, I, 20, b[19]);
            var p1 = A(p1, p2, p3, p4, M, 5, b[20]);
            var p4 = A(p4, p1, p2, p3, G, 9, b[21]);
            var p3 = A(p3, p4, p1, p2, p0, 14, b[22]);
            var p2 = A(p2, p3, p4, p1, Z, 20, b[23]);
            var p1 = A(p1, p2, p3, p4, X, 5, b[24]);
            var p4 = A(p4, p1, p2, p3, P, 9, b[25]);
            var p3 = A(p3, p4, p1, p2, i, 14, b[26]);
            var p2 = A(p2, p3, p4, p1, O, 20, b[27]);
            var p1 = A(p1, p2, p3, p4, Q, 5, b[28]);
            var p4 = A(p4, p1, p2, p3, T, 9, b[29]);
            var p3 = A(p3, p4, p1, p2, H, 14, b[30]);
            var p2 = A(p2, p3, p4, p1, o, 20, b[31]);
            var p1 = L(p1, p2, p3, p4, M, 4, b[32]);
            var p4 = L(p4, p1, p2, p3, O, 11, b[33]);
            var p3 = L(p3, p4, p1, p2, N, 16, b[34]);
            var p2 = L(p2, p3, p4, p1, P, 23, b[35]);
            var p1 = L(p1, p2, p3, p4, K, 4, b[36]);
            var p4 = L(p4, p1, p2, p3, Z, 11, b[37]);
            var p3 = L(p3, p4, p1, p2, H, 16, b[38]);
            var p2 = L(p2, p3, p4, p1, G, 23, b[39]);
            var p1 = L(p1, p2, p3, p4, Q, 4, b[40]);
            var p4 = L(p4, p1, p2, p3, I, 11, b[41]);
            var p3 = L(p3, p4, p1, p2, i, 16, b[42]);
            var p2 = L(p2, p3, p4, p1, U, 23, b[43]);
            var p1 = L(p1, p2, p3, p4, X, 4, b[44]);
            var p4 = L(p4, p1, p2, p3, o, 11, b[45]);
            var p3 = L(p3, p4, p1, p2, p0, 16, b[46]);
            var p2 = L(p2, p3, p4, p1, T, 23, b[47]);
            var p1 = g(p1, p2, p3, p4, I, 6, b[48]);
            var p4 = g(p4, p1, p2, p3, H, 10, b[49]);
            var p3 = g(p3, p4, p1, p2, P, 15, b[50]);
            var p2 = g(p2, p3, p4, p1, M, 21, b[51]);
            var p1 = g(p1, p2, p3, p4, o, 6, b[52]);
            var p4 = g(p4, p1, p2, p3, i, 10, b[53]);
            var p3 = g(p3, p4, p1, p2, G, 15, b[54]);
            var p2 = g(p2, p3, p4, p1, K, 21, b[55]);
            var p1 = g(p1, p2, p3, p4, O, 6, b[56]);
            var p4 = g(p4, p1, p2, p3, p0, 10, b[57]);
            var p3 = g(p3, p4, p1, p2, U, 15, b[58]);
            var p2 = g(p2, p3, p4, p1, Q, 21, b[59]);
            var p1 = g(p1, p2, p3, p4, Z, 6, b[60]);
            var p4 = g(p4, p1, p2, p3, N, 10, b[61]);
            var p3 = g(p3, p4, p1, p2, T, 15, b[62]);
            var p2 = g(p2, p3, p4, p1, X, 21, b[63]);
            R[0] = R[0] + p1 | 0;
            R[1] = R[1] + p2 | 0;
            R[2] = R[2] + p3 | 0;
            R[3] = R[3] + p4 | 0;
        },
        "_doFinalize": function () {
            var V = this._data;
            var W = V.words;
            var R = 8 * this._nDataBytes;
            var B = 8 * V.sigBytes;
            W[B >>> 5] |= 128 << 24 - B % 32;
            var I = p.floor(R / 4294967296);
            W[(B + 64 >>> 9 << 4) + 15] = (I << 8 | I >>> 24) & 16711935 | (I << 24 | I >>> 8) & 4278255360;
            W[(B + 64 >>> 9 << 4) + 14] = (R << 8 | R >>> 24) & 16711935 | (R << 24 | R >>> 8) & 4278255360;
            V.sigBytes = 4 * (W.length + 1);

            this._process();

            V = this._hash;
            W = V.words;

            for (R = 0; 4 > R; R++) {
                B = W[R];
                W[R] = (B << 8 | B >>> 24) & 16711935 | (B << 24 | B >>> 8) & 4278255360;
            }

            return V;
        },
        "clone": function () {
            var V = J.clone.call(this);
            return V._hash = this._hash.clone(), V;
        }
    });
    S.MD5 = J._createHelper(f);
    S.HmacMD5 = J._createHmacHelper(f);
})(Math);

(function () {
    var p = CryptoJS;
    var n = p.lib;
    var c = n.WordArray;
    var a = n.Hasher;
    var A = [];
    var n = p.algo.SHA1 = a.extend({
        "_doReset": function () {
            this._hash = new c.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
        },
        "_doProcessBlock": function (L, S) {
            for (var Y = this._hash.words, J = Y[0], C = Y[1], V = Y[2], W = Y[3], R = Y[4], B = 0; 80 > B; B++) {
                if (16 > B) A[B] = L[S + B] | 0;else {
                    var F = A[B - 3] ^ A[B - 8] ^ A[B - 14] ^ A[B - 16];
                    A[B] = F << 1 | F >>> 31;
                }
                F = (J << 5 | J >>> 27) + R + A[B];
                20 > B ? F = F + ((C & V | ~C & W) + 1518500249) : 40 > B ? F = F + ((C ^ V ^ W) + 1859775393) : 60 > B ? F = F + ((C & V | C & W | V & W) - 1894007588) : F = F + ((C ^ V ^ W) - 899497514);
                R = W;
                W = V;
                V = C << 30 | C >>> 2;
                C = J;
                J = F;
            }

            Y[0] = Y[0] + J | 0;
            Y[1] = Y[1] + C | 0;
            Y[2] = Y[2] + V | 0;
            Y[3] = Y[3] + W | 0;
            Y[4] = Y[4] + R | 0;
        },
        "_doFinalize": function () {
            var L = this._data;
            var g = L.words;
            var S = 8 * this._nDataBytes;
            var f = 8 * L.sigBytes;
            return g[f >>> 5] |= 128 << 24 - f % 32, g[(f + 64 >>> 9 << 4) + 14] = Math.floor(S / 4294967296), g[(f + 64 >>> 9 << 4) + 15] = S, L.sigBytes = 4 * g.length, this._process(), this._hash;
        },
        "clone": function () {
            var L = a.clone.call(this);
            return L._hash = this._hash.clone(), L;
        }
    });
    p.SHA1 = a._createHelper(n);
    p.HmacSHA1 = a._createHmacHelper(n);
})();

(function (p) {
    for (var c = CryptoJS, a = c.lib, A = a.WordArray, L = a.Hasher, a = c.algo, S = [], f = [], Y = function (F) {
        return 4294967296 * (F - (F | 0)) | 0;
    }, J = 2, C = 0; 64 > C;) {
        var V;

        F: {
            V = J;

            for (var W = p.sqrt(V), R = 2; R <= W; R++) if (!(V % R)) {
                V = !1;
                break F;
            }

            V = !0;
        }

        V && (8 > C && (S[C] = Y(p.pow(J, 0.5))), f[C] = Y(p.pow(J, 0.3333333333333333)), C++);
        J++;
    }

    var B = [];
    var a = a.SHA256 = L.extend({
        "_doReset": function () {
            this._hash = new A.init(S.slice(0));
        },
        "_doProcessBlock": function (F, E) {
            for (var I = this._hash.words, K = I[0], T = I[1], i = I[2], Z = I[3], M = I[4], U = I[5], H = I[6], O = I[7], X = 0; 64 > X; X++) {
                if (16 > X) B[X] = F[E + X] | 0;else {
                    var G = B[X - 15];
                    var x = B[X - 2];
                    B[X] = ((G << 25 | G >>> 7) ^ (G << 14 | G >>> 18) ^ G >>> 3) + B[X - 7] + ((x << 15 | x >>> 17) ^ (x << 13 | x >>> 19) ^ x >>> 10) + B[X - 16];
                }
                G = O + ((M << 26 | M >>> 6) ^ (M << 21 | M >>> 11) ^ (M << 7 | M >>> 25)) + (M & U ^ ~M & H) + f[X] + B[X];
                x = ((K << 30 | K >>> 2) ^ (K << 19 | K >>> 13) ^ (K << 10 | K >>> 22)) + (K & T ^ K & i ^ T & i);
                O = H;
                H = U;
                U = M;
                M = Z + G | 0;
                Z = i;
                i = T;
                T = K;
                K = G + x | 0;
            }

            I[0] = I[0] + K | 0;
            I[1] = I[1] + T | 0;
            I[2] = I[2] + i | 0;
            I[3] = I[3] + Z | 0;
            I[4] = I[4] + M | 0;
            I[5] = I[5] + U | 0;
            I[6] = I[6] + H | 0;
            I[7] = I[7] + O | 0;
        },
        "_doFinalize": function () {
            var F = this._data;
            var E = F.words;
            var I = 8 * this._nDataBytes;
            var K = 8 * F.sigBytes;
            return E[K >>> 5] |= 128 << 24 - K % 32, E[(K + 64 >>> 9 << 4) + 14] = p.floor(I / 4294967296), E[(K + 64 >>> 9 << 4) + 15] = I, F.sigBytes = 4 * E.length, this._process(), this._hash;
        },
        "clone": function () {
            var F = L.clone.call(this);
            return F._hash = this._hash.clone(), F;
        }
    });
    c.SHA256 = L._createHelper(a);
    c.HmacSHA256 = L._createHmacHelper(a);
})(Math);

(function () {
    var p = CryptoJS;
    var n = p.lib.WordArray;
    var A = p.algo;
    var L = A.SHA256;
    var A = A.SHA224 = L.extend({
        "_doReset": function () {
            this._hash = new n.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]);
        },
        "_doFinalize": function () {
            var g = L._doFinalize.call(this);

            return g.sigBytes -= 4, g;
        }
    });
    p.SHA224 = L._createHelper(A);
    p.HmacSHA224 = L._createHmacHelper(A);
})();

(function () {
    function p() {
        return g.create.apply(g, arguments);
    }

    for (var c = CryptoJS, A = c.lib.Hasher, L = c.x64, g = L.Word, S = L.WordArray, L = c.algo, f = [p(1116352408, 3609767458), p(1899447441, 602891725), p(3049323471, 3964484399), p(3921009573, 2173295548), p(961987163, 4081628472), p(1508970993, 3053834265), p(2453635748, 2937671579), p(2870763221, 3664609560), p(3624381080, 2734883394), p(310598401, 1164996542), p(607225278, 1323610764), p(1426881987, 3590304994), p(1925078388, 4068182383), p(2162078206, 991336113), p(2614888103, 633803317), p(3248222580, 3479774868), p(3835390401, 2666613458), p(4022224774, 944711139), p(264347078, 2341262773), p(604807628, 2007800933), p(770255983, 1495990901), p(1249150122, 1856431235), p(1555081692, 3175218132), p(1996064986, 2198950837), p(2554220882, 3999719339), p(2821834349, 766784016), p(2952996808, 2566594879), p(3210313671, 3203337956), p(3336571891, 1034457026), p(3584528711, 2466948901), p(113926993, 3758326383), p(338241895, 168717936), p(666307205, 1188179964), p(773529912, 1546045734), p(1294757372, 1522805485), p(1396182291, 2643833823), p(1695183700, 2343527390), p(1986661051, 1014477480), p(2177026350, 1206759142), p(2456956037, 344077627), p(2730485921, 1290863460), p(2820302411, 3158454273), p(3259730800, 3505952657), p(3345764771, 106217008), p(3516065817, 3606008344), p(3600352804, 1432725776), p(4094571909, 1467031594), p(275423344, 851169720), p(430227734, 3100823752), p(506948616, 1363258195), p(659060556, 3750685593), p(883997877, 3785050280), p(958139571, 3318307427), p(1322822218, 3812723403), p(1537002063, 2003034995), p(1747873779, 3602036899), p(1955562222, 1575990012), p(2024104815, 1125592928), p(2227730452, 2716904306), p(2361852424, 442776044), p(2428436474, 593698344), p(2756734187, 3733110249), p(3204031479, 2999351573), p(3329325298, 3815920427), p(3391569614, 3928383900), p(3515267271, 566280711), p(3940187606, 3454069534), p(4118630271, 4000239992), p(116418474, 1914138554), p(174292421, 2731055270), p(289380356, 3203993006), p(460393269, 320620315), p(685471733, 587496836), p(852142971, 1086792851), p(1017036298, 365543100), p(1126000580, 2618297676), p(1288033470, 3409855158), p(1501505948, 4234509866), p(1607167915, 987167468), p(1816402316, 1246189591)], Y = [], J = 0; 80 > J; J++) Y[J] = p();

    L = L.SHA512 = A.extend({
        "_doReset": function () {
            this._hash = new S.init([new g.init(1779033703, 4089235720), new g.init(3144134277, 2227873595), new g.init(1013904242, 4271175723), new g.init(2773480762, 1595750129), new g.init(1359893119, 2917565137), new g.init(2600822924, 725511199), new g.init(528734635, 4215389547), new g.init(1541459225, 327033209)]);
        },
        "_doProcessBlock": function (i, o) {
            for (var p0 = this._hash.words, p1 = p0[0], p2 = p0[1], p3 = p0[2], p4 = p0[3], p5 = p0[4], p6 = p0[5], p7 = p0[6], p0 = p0[7], p8 = p1.high, p9 = p1.low, pp = p2.high, pn = p2.low, pc = p3.high, pa = p3.low, pA = p4.high, pL = p4.low, pg = p5.high, pS = p5.low, pf = p6.high, pY = p6.low, pJ = p7.high, pb = p7.low, pC = p0.high, pV = p0.low, pW = p8, pl = p9, pR = pp, pB = pn, pF = pc, pE = pa, ps = pA, pI = pL, pK = pg, pT = pS, pi = pf, pe = pY, pZ = pJ, pw = pb, pM = pC, pu = pV, pk = 0; 80 > pk; pk++) {
                var pq = Y[pk];

                if (16 > pk) {
                    var pU = pq.high = i[o + 2 * pk] | 0;
                    var pz = pq.low = i[o + 2 * pk + 1] | 0;
                } else {
                    var pU = Y[pk - 15];
                    var pz = pU.high;
                    var ph = pU.low;
                    var pU = (pz >>> 1 | ph << 31) ^ (pz >>> 8 | ph << 24) ^ pz >>> 7;
                    var ph = (ph >>> 1 | pz << 31) ^ (ph >>> 8 | pz << 24) ^ (ph >>> 7 | pz << 25);
                    var pH = Y[pk - 2];
                    var pz = pH.high;
                    var pj = pH.low;
                    var pH = (pz >>> 19 | pj << 13) ^ (pz << 3 | pj >>> 29) ^ pz >>> 6;
                    var pj = (pj >>> 19 | pz << 13) ^ (pj << 3 | pz >>> 29) ^ (pj >>> 6 | pz << 26);
                    var pz = Y[pk - 7];
                    var pO = pz.high;
                    var pt = Y[pk - 16];
                    var pX = pt.high;
                    var pt = pt.low;
                    var pz = ph + pz.low;
                    var pU = pU + pO + (pz >>> 0 < ph >>> 0 ? 1 : 0);
                    var pz = pz + pj;
                    var pU = pU + pH + (pz >>> 0 < pj >>> 0 ? 1 : 0);
                    var pz = pz + pt;
                    var pU = pU + pX + (pz >>> 0 < pt >>> 0 ? 1 : 0);
                    pq.high = pU;
                    pq.low = pz;
                }

                var pO = pK & pi ^ ~pK & pZ;
                var pt = pT & pe ^ ~pT & pw;
                var pq = pW & pR ^ pW & pF ^ pR & pF;
                var pG = pl & pB ^ pl & pE ^ pB & pE;
                var ph = (pW >>> 28 | pl << 4) ^ (pW << 30 | pl >>> 2) ^ (pW << 25 | pl >>> 7);
                var pH = (pl >>> 28 | pW << 4) ^ (pl << 30 | pW >>> 2) ^ (pl << 25 | pW >>> 7);
                var pj = f[pk];
                var px = pj.high;
                var pN = pj.low;
                var pj = pu + ((pT >>> 14 | pK << 18) ^ (pT >>> 18 | pK << 14) ^ (pT << 23 | pK >>> 9));
                var pX = pM + ((pK >>> 14 | pT << 18) ^ (pK >>> 18 | pT << 14) ^ (pK << 23 | pT >>> 9)) + (pj >>> 0 < pu >>> 0 ? 1 : 0);
                var pj = pj + pt;
                var pX = pX + pO + (pj >>> 0 < pt >>> 0 ? 1 : 0);
                var pj = pj + pN;
                var pX = pX + px + (pj >>> 0 < pN >>> 0 ? 1 : 0);
                var pj = pj + pz;
                var pX = pX + pU + (pj >>> 0 < pz >>> 0 ? 1 : 0);
                var pz = pH + pG;
                var pq = ph + pq + (pz >>> 0 < pH >>> 0 ? 1 : 0);
                var pM = pZ;
                var pu = pw;
                var pZ = pi;
                var pw = pe;
                var pi = pK;
                var pe = pT;
                var pT = pI + pj | 0;
                var pK = ps + pX + (pT >>> 0 < pI >>> 0 ? 1 : 0) | 0;
                var ps = pF;
                var pI = pE;
                var pF = pR;
                var pE = pB;
                var pR = pW;
                var pB = pl;
                var pl = pj + pz | 0;
                var pW = pX + pq + (pl >>> 0 < pj >>> 0 ? 1 : 0) | 0;
            }

            p9 = p1.low = p9 + pl;
            p1.high = p8 + pW + (p9 >>> 0 < pl >>> 0 ? 1 : 0);
            pn = p2.low = pn + pB;
            p2.high = pp + pR + (pn >>> 0 < pB >>> 0 ? 1 : 0);
            pa = p3.low = pa + pE;
            p3.high = pc + pF + (pa >>> 0 < pE >>> 0 ? 1 : 0);
            pL = p4.low = pL + pI;
            p4.high = pA + ps + (pL >>> 0 < pI >>> 0 ? 1 : 0);
            pS = p5.low = pS + pT;
            p5.high = pg + pK + (pS >>> 0 < pT >>> 0 ? 1 : 0);
            pY = p6.low = pY + pe;
            p6.high = pf + pi + (pY >>> 0 < pe >>> 0 ? 1 : 0);
            pb = p7.low = pb + pw;
            p7.high = pJ + pZ + (pb >>> 0 < pw >>> 0 ? 1 : 0);
            pV = p0.low = pV + pu;
            p0.high = pC + pM + (pV >>> 0 < pu >>> 0 ? 1 : 0);
        },
        "_doFinalize": function () {
            var b = this._data;
            var C = b.words;
            var V = 8 * this._nDataBytes;
            var W = 8 * b.sigBytes;
            return C[W >>> 5] |= 128 << 24 - W % 32, C[(W + 128 >>> 10 << 5) + 30] = Math.floor(V / 4294967296), C[(W + 128 >>> 10 << 5) + 31] = V, b.sigBytes = 4 * C.length, this._process(), this._hash.toX32();
        },
        "clone": function () {
            var b = A.clone.call(this);
            return b._hash = this._hash.clone(), b;
        },
        "blockSize": 32
    });
    c.SHA512 = A._createHelper(L);
    c.HmacSHA512 = A._createHmacHelper(L);
})();

(function () {
    var p = CryptoJS;
    var n = p.x64;
    var A = n.Word;
    var L = n.WordArray;
    var n = p.algo;
    var g = n.SHA512;
    var n = n.SHA384 = g.extend({
        "_doReset": function () {
            this._hash = new L.init([new A.init(3418070365, 3238371032), new A.init(1654270250, 914150663), new A.init(2438529370, 812702999), new A.init(355462360, 4144912697), new A.init(1731405415, 4290775857), new A.init(2394180231, 1750603025), new A.init(3675008525, 1694076839), new A.init(1203062813, 3204075428)]);
        },
        "_doFinalize": function () {
            var S = g._doFinalize.call(this);

            return S.sigBytes -= 16, S;
        }
    });
    p.SHA384 = g._createHelper(n);
    p.HmacSHA384 = g._createHmacHelper(n);
})();

(function () {
    var c = CryptoJS;
    var a = c.lib;
    var L = a.WordArray;
    var g = a.Hasher;
    var a = c.algo;
    var S = L.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
    var f = L.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
    var Y = L.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]);
    var J = L.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]);
    var b = L.create([0, 1518500249, 1859775393, 2400959708, 2840853838]);
    var V = L.create([1352829926, 1548603684, 1836072691, 2053994217, 0]);
    var a = a.RIPEMD160 = g.extend({
        "_doReset": function () {
            this._hash = L.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
        },
        "_doProcessBlock": function (W, R) {
            for (var F = 0; 16 > F; F++) {
                var E = R + F;
                var I = W[E];
                W[E] = (I << 8 | I >>> 24) & 16711935 | (I << 24 | I >>> 8) & 4278255360;
            }

            var E = this._hash.words;
            var I = b.words;
            var K = V.words;
            var T = S.words;
            var i = f.words;
            var Z = Y.words;
            var M = J.words;
            var U;
            var H;
            var O;
            var X;
            var G;
            var N;
            var D;
            var o;
            var Q;
            var P;
            N = U = E[0];
            D = H = E[1];
            o = O = E[2];
            Q = X = E[3];
            P = G = E[4];

            for (var p0, F = 0; 80 > F; F += 1) {
                p0 = U + W[R + T[F]] | 0;
                16 > F ? p0 = p0 + ((H ^ O ^ X) + I[0]) : 32 > F ? p0 = p0 + ((H & O | ~H & X) + I[1]) : 48 > F ? p0 = p0 + (((H | ~O) ^ X) + I[2]) : 64 > F ? p0 = p0 + ((H & X | O & ~X) + I[3]) : p0 = p0 + ((H ^ (O | ~X)) + I[4]);
                p0 |= 0;
                p0 = p0 << Z[F] | p0 >>> 32 - Z[F];
                p0 = p0 + G | 0;
                U = G;
                G = X;
                X = O << 10 | O >>> 22;
                O = H;
                H = p0;
                p0 = N + W[R + i[F]] | 0;
                16 > F ? p0 = p0 + ((D ^ (o | ~Q)) + K[0]) : 32 > F ? p0 = p0 + ((D & Q | o & ~Q) + K[1]) : 48 > F ? p0 = p0 + (((D | ~o) ^ Q) + K[2]) : 64 > F ? p0 = p0 + ((D & o | ~D & Q) + K[3]) : p0 = p0 + ((D ^ o ^ Q) + K[4]);
                p0 |= 0;
                p0 = p0 << M[F] | p0 >>> 32 - M[F];
                p0 = p0 + P | 0;
                N = P;
                P = Q;
                Q = o << 10 | o >>> 22;
                o = D;
                D = p0;
            }

            p0 = E[1] + O + Q | 0;
            E[1] = E[2] + X + P | 0;
            E[2] = E[3] + G + N | 0;
            E[3] = E[4] + U + D | 0;
            E[4] = E[0] + H + o | 0;
            E[0] = p0;
        },
        "_doFinalize": function () {
            var W = this._data;
            var l = W.words;
            var R = 8 * this._nDataBytes;
            var F = 8 * W.sigBytes;
            l[F >>> 5] |= 128 << 24 - F % 32;
            l[(F + 64 >>> 9 << 4) + 14] = (R << 8 | R >>> 24) & 16711935 | (R << 24 | R >>> 8) & 4278255360;
            W.sigBytes = 4 * (l.length + 1);

            this._process();

            W = this._hash;
            l = W.words;

            for (R = 0; 5 > R; R++) {
                F = l[R];
                l[R] = (F << 8 | F >>> 24) & 16711935 | (F << 24 | F >>> 8) & 4278255360;
            }

            return W;
        },
        "clone": function () {
            var W = g.clone.call(this);
            return W._hash = this._hash.clone(), W;
        }
    });
    c.RIPEMD160 = g._createHelper(a);
    c.HmacRIPEMD160 = g._createHmacHelper(a);
})(Math);

(function () {
    var p = CryptoJS;
    var n = p.enc.Utf8;
    p.algo.HMAC = p.lib.Base.extend({
        "init": function (A, L) {
            A = this._hasher = new A.init();
            "string" == typeof L && (L = n.parse(L));
            var S = A.blockSize;
            var Y = 4 * S;
            L.sigBytes > Y && (L = A.finalize(L));
            L.clamp();

            for (var J = this._oKey = L.clone(), C = this._iKey = L.clone(), V = J.words, W = C.words, l = 0; l < S; l++) {
                V[l] ^= 1549556828;
                W[l] ^= 909522486;
            }

            J.sigBytes = C.sigBytes = Y;
            this.reset();
        },
        "reset": function () {
            var A = this._hasher;
            A.reset();
            A.update(this._iKey);
        },
        "update": function (A) {
            return this._hasher.update(A), this;
        },
        "finalize": function (A) {
            var L = this._hasher;
            return A = L.finalize(A), L.reset(), L.finalize(this._oKey.clone().concat(A));
        }
    });
})();

(function () {
    var p = CryptoJS;
    var n = p.lib;
    var c = n.Base;
    var A = n.WordArray;
    var n = p.algo;
    var L = n.HMAC;
    var g = n.PBKDF2 = c.extend({
        "cfg": c.extend({
            "keySize": 4,
            "hasher": n.SHA1,
            "iterations": 1
        }),
        "init": function (S) {
            this.cfg = this.cfg.extend(S);
        },
        "compute": function (S, Y) {
            for (var J = this.cfg, C = L.create(J.hasher, S), V = A.create(), W = A.create([1]), R = V.words, B = W.words, F = J.keySize, J = J.iterations; R.length < F;) {
                var E = C.update(Y).finalize(W);
                C.reset();

                for (var I = E.words, K = I.length, T = E, i = 1; i < J; i++) {
                    T = C.finalize(T);
                    C.reset();

                    for (var Z = T.words, w = 0; w < K; w++) I[w] ^= Z[w];
                }

                V.concat(E);
                B[0]++;
            }

            return V.sigBytes = 4 * F, V;
        }
    });

    p.PBKDF2 = function (S, f, Y) {
        return g.create(Y).compute(S, f);
    };
})();

var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";

function hex2b64(p) {
    var n;
    var c;
    var A = "";

    for (n = 0; n + 3 <= p.length; n += 3) {
        c = parseInt(p.substring(n, n + 3), 16);
        A += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
    }

    if (n + 1 == p.length) {
        c = parseInt(p.substring(n, n + 1), 16);
        A += b64map.charAt(c << 2);
    } else {
        if (n + 2 == p.length) {
            c = parseInt(p.substring(n, n + 2), 16);
            A += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
        }
    }

    if (b64pad) while ((A.length & 3) > 0) {
        A += b64pad;
    }
    return A;
}

function b64tohex(p) {
    var n = "";
    var A;
    var L = 0;
    var g;
    var S;

    for (A = 0; A < p.length; ++A) {
        if (p.charAt(A) == b64pad) break;
        S = b64map.indexOf(p.charAt(A));
        if (S < 0) continue;

        if (L == 0) {
            n += int2char(S >> 2);
            g = S & 3;
            L = 1;
        } else {
            if (L == 1) {
                n += int2char(g << 2 | S >> 4);
                g = S & 15;
                L = 2;
            } else {
                if (L == 2) {
                    n += int2char(g);
                    n += int2char(S >> 2);
                    g = S & 3;
                    L = 3;
                } else {
                    n += int2char(g << 2 | S >> 4);
                    n += int2char(S & 15);
                    L = 0;
                }
            }
        }
    }

    return L == 1 && (n += int2char(g << 2)), n;
}

function b64toBA(p) {
    var n = b64tohex(p);
    var a;
    var A = new Array();

    for (a = 0; 2 * a < n.length; ++a) {
        A[a] = parseInt(n.substring(2 * a, 2 * a + 2), 16);
    }

    return A;
}

;
var dbits;
var canary = 244837814094590;
var j_lm = (canary & 16777215) == 15715070;

function BigInteger(p, n, c) {
    if (p != null) {
        "number" == typeof p ? this.fromNumber(p, n, c) : n == null && "string" != typeof p ? this.fromString(p, 256) : this.fromString(p, n);
    }
}

function nbi() {
    return new BigInteger(null);
}

function am1(p, n, c, A, L, S) {
    while (--S >= 0) {
        var Y = n * this[p++] + c[A] + L;
        L = Math.floor(Y / 67108864);
        c[A++] = Y & 67108863;
    }

    return L;
}

function am2(n, c, A, L, S, Y) {
    var J = c & 32767;
    var C = c >> 15;

    while (--Y >= 0) {
        var V = this[n] & 32767;
        var W = this[n++] >> 15;
        var l = C * V + W * J;
        V = J * V + ((l & 32767) << 15) + A[L] + (S & 1073741823);
        S = (V >>> 30) + (l >>> 15) + C * W + (S >>> 30);
        A[L++] = V & 1073741823;
    }

    return S;
}

function am3(n, c, A, L, S, Y) {
    var J = c & 16383;
    var C = c >> 14;

    while (--Y >= 0) {
        var V = this[n] & 16383;
        var W = this[n++] >> 14;
        var l = C * V + W * J;
        V = J * V + ((l & 16383) << 14) + A[L] + S;
        S = (V >> 28) + (l >> 14) + C * W;
        A[L++] = V & 268435455;
    }

    return S;
}

if (j_lm && navigator.appName == "Microsoft Internet Explorer") {
    BigInteger.prototype.am = am2;
    dbits = 30;
} else {
    if (j_lm && navigator.appName != "Netscape") {
        BigInteger.prototype.am = am1;
        dbits = 26;
    } else {
        BigInteger.prototype.am = am3;
        dbits = 28;
    }
}

BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = (1 << dbits) - 1;
BigInteger.prototype.DV = 1 << dbits;
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr;
var vv;
rr = "0".charCodeAt(0);

for (vv = 0; vv <= 9; ++vv) {
    BI_RC[rr++] = vv;
}

rr = "a".charCodeAt(0);

for (vv = 10; vv < 36; ++vv) {
    BI_RC[rr++] = vv;
}

rr = "A".charCodeAt(0);

for (vv = 10; vv < 36; ++vv) {
    BI_RC[rr++] = vv;
}

function int2char(p) {
    return BI_RM.charAt(p);
}

function intAt(p, n) {
    var c = BI_RC[p.charCodeAt(n)];
    return c == null ? -1 : c;
}

function bnpCopyTo(p) {
    for (var n = this.t - 1; n >= 0; --n) {
        p[n] = this[n];
    }

    p.t = this.t;
    p.s = this.s;
}

function bnpFromInt(p) {
    this.t = 1;
    p < 0 ? this.s = -1 : this.s = 0;
    p > 0 ? this[0] = p : p < -1 ? this[0] = p + this.DV : this.t = 0;
}

function nbv(p) {
    var n = nbi();
    return n.fromInt(p), n;
}

function bnpFromString(p, n) {
    var A;
    if (n == 16) A = 4;else {
        if (n == 8) A = 3;else {
            if (n == 256) A = 8;else {
                if (n == 2) A = 1;else {
                    if (n == 32) A = 5;else {
                        if (n == 4) A = 2;else {
                            this.fromRadix(p, n);
                            return;
                        }
                    }
                }
            }
        }
    }
    this.t = 0;
    this.s = 0;
    var L = p.length;
    var S = ![];
    var Y = 0;

    while (--L >= 0) {
        if (A == 8) {
            var J = p[L] & 255;
        } else {
            var J = intAt(p, L);
        }

        if (J < 0) {
            if (p.charAt(L) == "-") {
                S = !![];
            }

            continue;
        }

        S = ![];
        Y == 0 ? this[this.t++] = J : Y + A > this.DB ? (this[this.t - 1] |= (J & (1 << this.DB - Y) - 1) << Y, this[this.t++] = J >> this.DB - Y) : this[this.t - 1] |= J << Y;
        Y += A;
        Y >= this.DB && (Y -= this.DB);
    }

    A == 8 && (p[0] & 128) != 0 && (this.s = -1, Y > 0 && (this[this.t - 1] |= (1 << this.DB - Y) - 1 << Y));
    this.clamp();
    S && BigInteger.ZERO.subTo(this, this);
}

function bnpClamp() {
    var p = this.s & this.DM;

    while (this.t > 0 && this[this.t - 1] == p) {
        --this.t;
    }
}

function bnToString(p) {
    if (this.s < 0) return "-" + this.negate().toString(p);
    var n;
    if (p == 16) n = 4;else {
        if (p == 8) n = 3;else {
            if (p == 2) n = 1;else {
                if (p == 32) n = 5;else {
                    if (p == 4) n = 2;else return this.toRadix(p);
                }
            }
        }
    }
    var A = (1 << n) - 1;
    var L;
    var S = ![];
    var Y = "";
    var J = this.t;
    var b = this.DB - J * this.DB % n;

    if (J-- > 0) {
        if (b < this.DB && (L = this[J] >> b) > 0) {
            S = !![];
            Y = int2char(L);
        }

        while (J >= 0) {
            b < n ? (L = (this[J] & (1 << b) - 1) << n - b, L |= this[--J] >> (b += this.DB - n)) : (L = this[J] >> (b -= n) & A, b <= 0 && (b += this.DB, --J));
            L > 0 && (S = !![]);
            S && (Y += int2char(L));
        }
    }

    return S ? Y : "0";
}

function bnNegate() {
    var p = nbi();
    return BigInteger.ZERO.subTo(this, p), p;
}

function bnAbs() {
    return this.s < 0 ? this.negate() : this;
}

function bnCompareTo(p) {
    var n = this.s - p.s;
    if (n != 0) return n;
    var a = this.t;
    n = a - p.t;
    if (n != 0) return this.s < 0 ? -n : n;

    while (--a >= 0) {
        if ((n = this[a] - p[a]) != 0) return n;
    }

    return 0;
}

function nbits(p) {
    var n = 1;
    var A;
    return (A = p >>> 16) != 0 && (p = A, n += 16), (A = p >> 8) != 0 && (p = A, n += 8), (A = p >> 4) != 0 && (p = A, n += 4), (A = p >> 2) != 0 && (p = A, n += 2), (A = p >> 1) != 0 && (p = A, n += 1), n;
}

function bnBitLength() {
    if (this.t <= 0) return 0;
    return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM);
}

function bnpDLShiftTo(p, n) {
    var A;

    for (A = this.t - 1; A >= 0; --A) {
        n[A + p] = this[A];
    }

    for (A = p - 1; A >= 0; --A) {
        n[A] = 0;
    }

    n.t = this.t + p;
    n.s = this.s;
}

function bnpDRShiftTo(p, n) {
    for (var A = p; A < this.t; ++A) {
        n[A - p] = this[A];
    }

    n.t = Math.max(this.t - p, 0);
    n.s = this.s;
}

function bnpLShiftTo(p, n) {
    var c = p % this.DB;
    var A = this.DB - c;
    var L = (1 << A) - 1;
    var S = Math.floor(p / this.DB);
    var Y = this.s << c & this.DM;
    var J;

    for (J = this.t - 1; J >= 0; --J) {
        n[J + S + 1] = this[J] >> A | Y;
        Y = (this[J] & L) << c;
    }

    for (J = S - 1; J >= 0; --J) {
        n[J] = 0;
    }

    n[S] = Y;
    n.t = this.t + S + 1;
    n.s = this.s;
    n.clamp();
}

function bnpRShiftTo(p, n) {
    n.s = this.s;
    var A = Math.floor(p / this.DB);

    if (A >= this.t) {
        n.t = 0;
        return;
    }

    var L = p % this.DB;
    var S = this.DB - L;
    var Y = (1 << L) - 1;
    n[0] = this[A] >> L;

    for (var J = A + 1; J < this.t; ++J) {
        n[J - A - 1] |= (this[J] & Y) << S;
        n[J - A] = this[J] >> L;
    }

    L > 0 && (n[this.t - A - 1] |= (this.s & Y) << S);
    n.t = this.t - A;
    n.clamp();
}

function bnpSubTo(p, n) {
    var c = 0;
    var a = 0;
    var A = Math.min(p.t, this.t);

    while (c < A) {
        a += this[c] - p[c];
        n[c++] = a & this.DM;
        a >>= this.DB;
    }

    if (p.t < this.t) {
        a -= p.s;

        while (c < this.t) {
            a += this[c];
            n[c++] = a & this.DM;
            a >>= this.DB;
        }

        a += this.s;
    } else {
        a += this.s;

        while (c < p.t) {
            a -= p[c];
            n[c++] = a & this.DM;
            a >>= this.DB;
        }

        a -= p.s;
    }

    a < 0 ? n.s = -1 : n.s = 0;
    a < -1 ? n[c++] = this.DV + a : a > 0 && (n[c++] = a);
    n.t = c;
    n.clamp();
}

function bnpMultiplyTo(p, n) {
    var a = this.abs();
    var A = p.abs();
    var L = a.t;
    n.t = L + A.t;

    while (--L >= 0) {
        n[L] = 0;
    }

    for (L = 0; L < A.t; ++L) {
        n[L + a.t] = a.am(0, A[L], n, L, 0, a.t);
    }

    n.s = 0;
    n.clamp();
    this.s != p.s && BigInteger.ZERO.subTo(n, n);
}

function bnpSquareTo(p) {
    var n = this.abs();
    var c = p.t = 2 * n.t;

    while (--c >= 0) {
        p[c] = 0;
    }

    for (c = 0; c < n.t - 1; ++c) {
        var A = n.am(c, n[c], p, 2 * c, 0, 1);

        if ((p[c + n.t] += n.am(c + 1, 2 * n[c], p, 2 * c + 1, A, n.t - c - 1)) >= n.DV) {
            p[c + n.t] -= n.DV;
            p[c + n.t + 1] = 1;
        }
    }

    p.t > 0 && (p[p.t - 1] += n.am(c, n[c], p, 2 * c, 0, 1));
    p.s = 0;
    p.clamp();
}

function bnpDivRemTo(L, S, Y) {
    var J = L.abs();
    if (J.t <= 0) return;
    var C = this.abs();

    if (C.t < J.t) {
        if (S != null) {
            S.fromInt(0);
        }

        if (Y != null) {
            this.copyTo(Y);
        }

        return;
    }

    if (Y == null) {
        Y = nbi();
    }

    var V = nbi();
    var W = this.s;
    var R = L.s;
    var B = this.DB - nbits(J[J.t - 1]);

    if (B > 0) {
        J.lShiftTo(B, V);
        C.lShiftTo(B, Y);
    } else {
        J.copyTo(V);
        C.copyTo(Y);
    }

    var F = V.t;
    var E = V[F - 1];
    if (E == 0) return;
    var I = E * (1 << this.F1) + (F > 1 ? V[F - 2] >> this.F2 : 0);
    var K = this.FV / I;
    var T = (1 << this.F1) / I;
    var i = 1 << this.F2;
    var e = Y.t;
    var Z = e - F;

    if (S == null) {
        var M = nbi();
    } else {
        var M = S;
    }

    V.dlShiftTo(Z, M);

    if (Y.compareTo(M) >= 0) {
        Y[Y.t++] = 1;
        Y.subTo(M, Y);
    }

    BigInteger.ONE.dlShiftTo(F, M);
    M.subTo(V, V);

    while (V.t < F) {
        V[V.t++] = 0;
    }

    while (--Z >= 0) {
        var q = Y[--e] == E ? this.DM : Math.floor(Y[e] * K + (Y[e - 1] + i) * T);

        if ((Y[e] += V.am(0, q, Y, Z, 0, F)) < q) {
            V.dlShiftTo(Z, M);
            Y.subTo(M, Y);

            while (Y[e] < --q) {
                Y.subTo(M, Y);
            }
        }
    }

    S != null && (Y.drShiftTo(F, S), W != R && BigInteger.ZERO.subTo(S, S));
    Y.t = F;
    Y.clamp();
    B > 0 && Y.rShiftTo(B, Y);
    W < 0 && BigInteger.ZERO.subTo(Y, Y);
}

function bnMod(p) {
    var n = nbi();
    return this.abs().divRemTo(p, null, n), this.s < 0 && n.compareTo(BigInteger.ZERO) > 0 && p.subTo(n, n), n;
}

function Classic(p) {
    this.m = p;
}

function cConvert(p) {
    return p.s < 0 || p.compareTo(this.m) >= 0 ? p.mod(this.m) : p;
}

function cRevert(p) {
    return p;
}

function cReduce(p) {
    p.divRemTo(this.m, null, p);
}

function cMulTo(p, n, A) {
    p.multiplyTo(n, A);
    this.reduce(A);
}

function cSqrTo(p, n) {
    p.squareTo(n);
    this.reduce(n);
}

Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;

function bnpInvDigit() {
    if (this.t < 1) return 0;
    var p = this[0];
    if ((p & 1) == 0) return 0;
    var n = p & 3;
    return n = n * (2 - (p & 15) * n) & 15, n = n * (2 - (p & 255) * n) & 255, n = n * (2 - ((p & 65535) * n & 65535)) & 65535, n = n * (2 - p * n % this.DV) % this.DV, n > 0 ? this.DV - n : -n;
}

function Montgomery(p) {
    this.m = p;
    this.mp = p.invDigit();
    this.mpl = this.mp & 32767;
    this.mph = this.mp >> 15;
    this.um = (1 << p.DB - 15) - 1;
    this.mt2 = 2 * p.t;
}

function montConvert(p) {
    var n = nbi();
    return p.abs().dlShiftTo(this.m.t, n), n.divRemTo(this.m, null, n), p.s < 0 && n.compareTo(BigInteger.ZERO) > 0 && this.m.subTo(n, n), n;
}

function montRevert(p) {
    var n = nbi();
    return p.copyTo(n), this.reduce(n), n;
}

function montReduce(p) {
    while (p.t <= this.mt2) {
        p[p.t++] = 0;
    }

    for (var n = 0; n < this.m.t; ++n) {
        var A = p[n] & 32767;
        var L = A * this.mpl + ((A * this.mph + (p[n] >> 15) * this.mpl & this.um) << 15) & p.DM;
        A = n + this.m.t;
        p[A] += this.m.am(0, L, p, n, 0, this.m.t);

        while (p[A] >= p.DV) {
            p[A] -= p.DV;
            p[++A]++;
        }
    }

    p.clamp();
    p.drShiftTo(this.m.t, p);
    p.compareTo(this.m) >= 0 && p.subTo(this.m, p);
}

function montSqrTo(p, n) {
    p.squareTo(n);
    this.reduce(n);
}

function montMulTo(p, n, A) {
    p.multiplyTo(n, A);
    this.reduce(A);
}

Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;

function bnpIsEven() {
    return (this.t > 0 ? this[0] & 1 : this.s) == 0;
}

function bnpExp(p, n) {
    if (p > 4294967295 || p < 1) return BigInteger.ONE;
    var A = nbi();
    var L = nbi();
    var g = n.convert(this);
    var S = nbits(p) - 1;
    g.copyTo(A);

    while (--S >= 0) {
        n.sqrTo(A, L);
        if ((p & 1 << S) > 0) n.mulTo(L, g, A);else {
            var Y = A;
            A = L;
            L = Y;
        }
    }

    return n.revert(A);
}

function bnModPowInt(p, n) {
    var A;
    return p < 256 || n.isEven() ? A = new Classic(n) : A = new Montgomery(n), this.exp(p, A);
}

BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);

function bnClone() {
    var p = nbi();
    return this.copyTo(p), p;
}

function bnIntValue() {
    if (this.s < 0) {
        if (this.t == 1) return this[0] - this.DV;else {
            if (this.t == 0) return -1;
        }
    } else {
        if (this.t == 1) return this[0];else {
            if (this.t == 0) return 0;
        }
    }

    return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
}

function bnByteValue() {
    return this.t == 0 ? this.s : this[0] << 24 >> 24;
}

function bnShortValue() {
    return this.t == 0 ? this.s : this[0] << 16 >> 16;
}

function bnpChunkSize(p) {
    return Math.floor(Math.LN2 * this.DB / Math.log(p));
}

function bnSigNum() {
    return this.s < 0 ? -1 : this.t <= 0 || this.t == 1 && this[0] <= 0 ? 0 : 1;
}

function bnpToRadix(p) {
    if (p == null) {
        p = 10;
    }

    if (this.signum() == 0 || p < 2 || p > 36) return "0";
    var n = this.chunkSize(p);
    var a = Math.pow(p, n);
    var A = nbv(a);
    var L = nbi();
    var S = nbi();
    var Y = "";
    this.divRemTo(A, L, S);

    while (L.signum() > 0) {
        Y = (a + S.intValue()).toString(p).substr(1) + Y;
        L.divRemTo(A, L, S);
    }

    return S.intValue().toString(p) + Y;
}

function bnpFromRadix(p, n) {
    this.fromInt(0);

    if (n == null) {
        n = 10;
    }

    var A = this.chunkSize(n);
    var L = Math.pow(n, A);
    var S = ![];
    var Y = 0;
    var J = 0;

    for (var b = 0; b < p.length; ++b) {
        var C = intAt(p, b);

        if (C < 0) {
            if (p.charAt(b) == "-" && this.signum() == 0) {
                S = !![];
            }

            continue;
        }

        J = n * J + C;
        ++Y >= A && (this.dMultiply(L), this.dAddOffset(J, 0), Y = 0, J = 0);
    }

    Y > 0 && (this.dMultiply(Math.pow(n, Y)), this.dAddOffset(J, 0));
    S && BigInteger.ZERO.subTo(this, this);
}

function bnpFromNumber(p, n, c) {
    if ("number" == typeof n) {
        if (p < 2) this.fromInt(1);else {
            this.fromNumber(p, c);

            if (!this.testBit(p - 1)) {
                this.bitwiseTo(BigInteger.ONE.shiftLeft(p - 1), op_or, this);
            }

            if (this.isEven()) {
                this.dAddOffset(1, 0);
            }

            while (!this.isProbablePrime(n)) {
                this.dAddOffset(2, 0);
                this.bitLength() > p && this.subTo(BigInteger.ONE.shiftLeft(p - 1), this);
            }
        }
    } else {
        var a = new Array();
        var A = p & 7;
        a.length = (p >> 3) + 1;
        n.nextBytes(a);
        A > 0 ? a[0] &= (1 << A) - 1 : a[0] = 0;
        this.fromString(a, 256);
    }
}

function bnToByteArray() {
    var p = this.t;
    var n = new Array();
    n[0] = this.s;
    var A = this.DB - p * this.DB % 8;
    var L;
    var g = 0;

    if (p-- > 0) {
        if (A < this.DB && (L = this[p] >> A) != (this.s & this.DM) >> A) {
            n[g++] = L | this.s << this.DB - A;
        }

        while (p >= 0) {
            A < 8 ? (L = (this[p] & (1 << A) - 1) << 8 - A, L |= this[--p] >> (A += this.DB - 8)) : (L = this[p] >> (A -= 8) & 255, A <= 0 && (A += this.DB, --p));
            (L & 128) != 0 && (L |= -256);
            g == 0 && (this.s & 128) != (L & 128) && ++g;
            (g > 0 || L != this.s) && (n[g++] = L);
        }
    }

    return n;
}

function bnEquals(p) {
    return this.compareTo(p) == 0;
}

function bnMin(p) {
    return this.compareTo(p) < 0 ? this : p;
}

function bnMax(p) {
    return this.compareTo(p) > 0 ? this : p;
}

function bnpBitwiseTo(p, n, a) {
    var A;
    var L;
    var S = Math.min(p.t, this.t);

    for (A = 0; A < S; ++A) {
        a[A] = n(this[A], p[A]);
    }

    if (p.t < this.t) {
        L = p.s & this.DM;

        for (A = S; A < this.t; ++A) {
            a[A] = n(this[A], L);
        }

        a.t = this.t;
    } else {
        L = this.s & this.DM;

        for (A = S; A < p.t; ++A) {
            a[A] = n(L, p[A]);
        }

        a.t = p.t;
    }

    a.s = n(this.s, p.s);
    a.clamp();
}

function op_and(p, n) {
    return p & n;
}

function bnAnd(p) {
    var n = nbi();
    return this.bitwiseTo(p, op_and, n), n;
}

function op_or(p, n) {
    return p | n;
}

function bnOr(p) {
    var n = nbi();
    return this.bitwiseTo(p, op_or, n), n;
}

function op_xor(p, n) {
    return p ^ n;
}

function bnXor(p) {
    var n = nbi();
    return this.bitwiseTo(p, op_xor, n), n;
}

function op_andnot(p, n) {
    return p & ~n;
}

function bnAndNot(p) {
    var n = nbi();
    return this.bitwiseTo(p, op_andnot, n), n;
}

function bnNot() {
    var p = nbi();

    for (var n = 0; n < this.t; ++n) {
        p[n] = this.DM & ~this[n];
    }

    return p.t = this.t, p.s = ~this.s, p;
}

function bnShiftLeft(p) {
    var n = nbi();
    return p < 0 ? this.rShiftTo(-p, n) : this.lShiftTo(p, n), n;
}

function bnShiftRight(p) {
    var n = nbi();
    return p < 0 ? this.lShiftTo(-p, n) : this.rShiftTo(p, n), n;
}

function lbit(p) {
    if (p == 0) return -1;
    var n = 0;
    return (p & 65535) == 0 && (p >>= 16, n += 16), (p & 255) == 0 && (p >>= 8, n += 8), (p & 15) == 0 && (p >>= 4, n += 4), (p & 3) == 0 && (p >>= 2, n += 2), (p & 1) == 0 && ++n, n;
}

function bnGetLowestSetBit() {
    for (var p = 0; p < this.t; ++p) {
        if (this[p] != 0) return p * this.DB + lbit(this[p]);
    }

    if (this.s < 0) return this.t * this.DB;
    return -1;
}

function cbit(p) {
    var n = 0;

    while (p != 0) {
        p &= p - 1;
        ++n;
    }

    return n;
}

function bnBitCount() {
    var p = 0;
    var n = this.s & this.DM;

    for (var A = 0; A < this.t; ++A) {
        p += cbit(this[A] ^ n);
    }

    return p;
}

function bnTestBit(p) {
    var n = Math.floor(p / this.DB);
    if (n >= this.t) return this.s != 0;
    return (this[n] & 1 << p % this.DB) != 0;
}

function bnpChangeBit(p, n) {
    var A = BigInteger.ONE.shiftLeft(p);
    return this.bitwiseTo(A, n, A), A;
}

function bnSetBit(p) {
    return this.changeBit(p, op_or);
}

function bnClearBit(p) {
    return this.changeBit(p, op_andnot);
}

function bnFlipBit(p) {
    return this.changeBit(p, op_xor);
}

function bnpAddTo(p, n) {
    var c = 0;
    var a = 0;
    var A = Math.min(p.t, this.t);

    while (c < A) {
        a += this[c] + p[c];
        n[c++] = a & this.DM;
        a >>= this.DB;
    }

    if (p.t < this.t) {
        a += p.s;

        while (c < this.t) {
            a += this[c];
            n[c++] = a & this.DM;
            a >>= this.DB;
        }

        a += this.s;
    } else {
        a += this.s;

        while (c < p.t) {
            a += p[c];
            n[c++] = a & this.DM;
            a >>= this.DB;
        }

        a += p.s;
    }

    a < 0 ? n.s = -1 : n.s = 0;
    a > 0 ? n[c++] = a : a < -1 && (n[c++] = this.DV + a);
    n.t = c;
    n.clamp();
}

function bnAdd(p) {
    var n = nbi();
    return this.addTo(p, n), n;
}

function bnSubtract(p) {
    var n = nbi();
    return this.subTo(p, n), n;
}

function bnMultiply(p) {
    var n = nbi();
    return this.multiplyTo(p, n), n;
}

function bnSquare() {
    var p = nbi();
    return this.squareTo(p), p;
}

function bnDivide(p) {
    var n = nbi();
    return this.divRemTo(p, n, null), n;
}

function bnRemainder(p) {
    var n = nbi();
    return this.divRemTo(p, null, n), n;
}

function bnDivideAndRemainder(p) {
    var n = nbi();
    var a = nbi();
    return this.divRemTo(p, n, a), new Array(n, a);
}

function bnpDMultiply(p) {
    this[this.t] = this.am(0, p - 1, this, 0, 0, this.t);
    ++this.t;
    this.clamp();
}

function bnpDAddOffset(p, n) {
    if (p == 0) return;

    while (this.t <= n) {
        this[this.t++] = 0;
    }

    this[n] += p;

    while (this[n] >= this.DV) {
        this[n] -= this.DV;
        ++n >= this.t && (this[this.t++] = 0);
        ++this[n];
    }
}

function NullExp() {}

function nNop(p) {
    return p;
}

function nMulTo(p, n, A) {
    p.multiplyTo(n, A);
}

function nSqrTo(p, n) {
    p.squareTo(n);
}

NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;

function bnPow(p) {
    return this.exp(p, new NullExp());
}

function bnpMultiplyLowerTo(p, n, a) {
    var A = Math.min(this.t + p.t, n);
    a.s = 0;
    a.t = A;

    while (A > 0) {
        a[--A] = 0;
    }

    var L;

    for (L = a.t - this.t; A < L; ++A) {
        a[A + this.t] = this.am(0, p[A], a, A, 0, this.t);
    }

    for (L = Math.min(p.t, n); A < L; ++A) {
        this.am(0, p[A], a, A, 0, n - A);
    }

    a.clamp();
}

function bnpMultiplyUpperTo(p, n, a) {
    --n;
    var A = a.t = this.t + p.t - n;
    a.s = 0;

    while (--A >= 0) {
        a[A] = 0;
    }

    for (A = Math.max(n - this.t, 0); A < p.t; ++A) {
        a[this.t + A - n] = this.am(n - A, p[A], a, 0, 0, this.t + A - n);
    }

    a.clamp();
    a.drShiftTo(1, a);
}

function Barrett(p) {
    this.r2 = nbi();
    this.q3 = nbi();
    BigInteger.ONE.dlShiftTo(2 * p.t, this.r2);
    this.mu = this.r2.divide(p);
    this.m = p;
}

function barrettConvert(p) {
    if (p.s < 0 || p.t > 2 * this.m.t) return p.mod(this.m);else {
        if (p.compareTo(this.m) < 0) return p;else {
            var n = nbi();
            return p.copyTo(n), this.reduce(n), n;
        }
    }
}

function barrettRevert(p) {
    return p;
}

function barrettReduce(p) {
    p.drShiftTo(this.m.t - 1, this.r2);

    if (p.t > this.m.t + 1) {
        p.t = this.m.t + 1;
        p.clamp();
    }

    this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
    this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);

    while (p.compareTo(this.r2) < 0) {
        p.dAddOffset(1, this.m.t + 1);
    }

    p.subTo(this.r2, p);

    while (p.compareTo(this.m) >= 0) {
        p.subTo(this.m, p);
    }
}

function barrettSqrTo(p, n) {
    p.squareTo(n);
    this.reduce(n);
}

function barrettMulTo(p, n, A) {
    p.multiplyTo(n, A);
    this.reduce(A);
}

Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;

function bnModPow(n, L) {
    var g = n.bitLength();
    var S;
    var Y = nbv(1);
    var J;
    if (g <= 0) return Y;else if (g < 18) {
        S = 1;
    } else {
        if (g < 48) {
            S = 3;
        } else {
            if (g < 144) {
                S = 4;
            } else {
                if (g < 768) {
                    S = 5;
                } else {
                    S = 6;
                }
            }
        }
    }

    if (g < 8) {
        J = new Classic(L);
    } else {
        if (L.isEven()) {
            J = new Barrett(L);
        } else {
            J = new Montgomery(L);
        }
    }

    var C = new Array();
    var V = 3;
    var W = S - 1;
    var R = (1 << S) - 1;
    C[1] = J.convert(this);

    if (S > 1) {
        var B = nbi();
        J.sqrTo(C[1], B);

        while (V <= R) {
            C[V] = nbi();
            J.mulTo(B, C[V - 2], C[V]);
            V += 2;
        }
    }

    var F = n.t - 1;
    var E;
    var I = !![];
    var K = nbi();
    var T;
    g = nbits(n[F]) - 1;

    while (F >= 0) {
        if (g >= W) {
            E = n[F] >> g - W & R;
        } else {
            E = (n[F] & (1 << g + 1) - 1) << W - g;
            F > 0 && (E |= n[F - 1] >> this.DB + g - W);
        }

        V = S;

        while ((E & 1) == 0) {
            E >>= 1;
            --V;
        }

        if ((g -= V) < 0) {
            g += this.DB;
            --F;
        }

        if (I) {
            C[E].copyTo(Y);
            I = ![];
        } else {
            while (V > 1) {
                J.sqrTo(Y, K);
                J.sqrTo(K, Y);
                V -= 2;
            }

            V > 0 ? J.sqrTo(Y, K) : (T = Y, Y = K, K = T);
            J.mulTo(K, C[E], Y);
        }

        while (F >= 0 && (n[F] & 1 << g) == 0) {
            J.sqrTo(Y, K);
            T = Y;
            Y = K;
            K = T;
            --g < 0 && (g = this.DB - 1, --F);
        }
    }

    return J.revert(Y);
}

function bnGCD(p) {
    if (this.s < 0) {
        var n = this.negate();
    } else {
        var n = this.clone();
    }

    if (p.s < 0) {
        var a = p.negate();
    } else {
        var a = p.clone();
    }

    if (n.compareTo(a) < 0) {
        var A = n;
        n = a;
        a = A;
    }

    var L = n.getLowestSetBit();
    var g = a.getLowestSetBit();
    if (g < 0) return n;

    if (L < g) {
        g = L;
    }

    if (g > 0) {
        n.rShiftTo(g, n);
        a.rShiftTo(g, a);
    }

    while (n.signum() > 0) {
        (L = n.getLowestSetBit()) > 0 && n.rShiftTo(L, n);
        (L = a.getLowestSetBit()) > 0 && a.rShiftTo(L, a);
        n.compareTo(a) >= 0 ? (n.subTo(a, n), n.rShiftTo(1, n)) : (a.subTo(n, a), a.rShiftTo(1, a));
    }

    return g > 0 && a.lShiftTo(g, a), a;
}

function bnpModInt(p) {
    if (p <= 0) return 0;
    var n = this.DV % p;

    if (this.s < 0) {
        var A = p - 1;
    } else {
        var A = 0;
    }

    if (this.t > 0) {
        if (n == 0) A = this[0] % p;else for (var L = this.t - 1; L >= 0; --L) {
            A = (n * A + this[L]) % p;
        }
    }

    return A;
}

function bnModInverse(p) {
    var n = p.isEven();
    if (this.isEven() && n || p.signum() == 0) return BigInteger.ZERO;
    var c = p.clone();
    var a = this.clone();
    var A = nbv(1);
    var L = nbv(0);
    var S = nbv(0);
    var Y = nbv(1);

    while (c.signum() != 0) {
        while (c.isEven()) {
            c.rShiftTo(1, c);
            n ? ((!A.isEven() || !L.isEven()) && (A.addTo(this, A), L.subTo(p, L)), A.rShiftTo(1, A)) : !L.isEven() && L.subTo(p, L);
            L.rShiftTo(1, L);
        }

        while (a.isEven()) {
            a.rShiftTo(1, a);
            n ? ((!S.isEven() || !Y.isEven()) && (S.addTo(this, S), Y.subTo(p, Y)), S.rShiftTo(1, S)) : !Y.isEven() && Y.subTo(p, Y);
            Y.rShiftTo(1, Y);
        }

        if (c.compareTo(a) >= 0) {
            c.subTo(a, c);
            n && A.subTo(S, A);
            L.subTo(Y, L);
        } else {
            a.subTo(c, a);
            n && S.subTo(A, S);
            Y.subTo(L, Y);
        }
    }

    if (a.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
    if (Y.compareTo(p) >= 0) return Y.subtract(p);
    if (Y.signum() < 0) Y.addTo(p, Y);else return Y;
    return Y.signum() < 0 ? Y.add(p) : Y;
}

var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
var lplim = 67108864 / lowprimes[lowprimes.length - 1];

function bnIsProbablePrime(p) {
    var n;
    var A = this.abs();

    if (A.t == 1 && A[0] <= lowprimes[lowprimes.length - 1]) {
        for (n = 0; n < lowprimes.length; ++n) {
            if (A[0] == lowprimes[n]) return !![];
        }

        return ![];
    }

    if (A.isEven()) return ![];
    n = 1;

    while (n < lowprimes.length) {
        var L = lowprimes[n];
        var g = n + 1;

        while (g < lowprimes.length && L < lplim) {
            L *= lowprimes[g++];
        }

        L = A.modInt(L);

        while (n < g) {
            if (L % lowprimes[n++] == 0) return ![];
        }
    }

    return A.millerRabin(p);
}

function bnpMillerRabin(p) {
    var n = this.subtract(BigInteger.ONE);
    var a = n.getLowestSetBit();
    if (a <= 0) return ![];
    var A = n.shiftRight(a);
    p = p + 1 >> 1;

    if (p > lowprimes.length) {
        p = lowprimes.length;
    }

    var L = nbi();

    for (var S = 0; S < p; ++S) {
        L.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
        var Y = L.modPow(A, this);

        if (Y.compareTo(BigInteger.ONE) != 0 && Y.compareTo(n) != 0) {
            var J = 1;

            while (J++ < a && Y.compareTo(n) != 0) {
                Y = Y.modPowInt(2, this);
                if (Y.compareTo(BigInteger.ONE) == 0) return ![];
            }

            if (Y.compareTo(n) != 0) return ![];
        }
    }

    return !![];
}

BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;

function Arcfour() {
    this.i = 0;
    this.j = 0;
    this.S = new Array();
}

function ARC4init(p) {
    var n;
    var A;
    var L;

    for (n = 0; n < 256; ++n) {
        this.S[n] = n;
    }

    A = 0;

    for (n = 0; n < 256; ++n) {
        A = A + this.S[n] + p[n % p.length] & 255;
        L = this.S[n];
        this.S[n] = this.S[A];
        this.S[A] = L;
    }

    this.i = 0;
    this.j = 0;
}

function ARC4next() {
    var p;
    return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, p = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = p, this.S[p + this.S[this.i] & 255];
}

Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;

function prng_newstate() {
    return new Arcfour();
}

var rng_psize = 256;
var rng_state;
var rng_pool;
var rng_pptr;

function rng_seed_int(p) {
    rng_pool[rng_pptr++] ^= p & 255;
    rng_pool[rng_pptr++] ^= p >> 8 & 255;
    rng_pool[rng_pptr++] ^= p >> 16 & 255;
    rng_pool[rng_pptr++] ^= p >> 24 & 255;
    rng_pptr >= rng_psize && (rng_pptr -= rng_psize);
}

function rng_seed_time() {
    rng_seed_int(new Date().getTime());
}

if (rng_pool == null) {
    rng_pool = new Array();
    rng_pptr = 0;
    var t;

    if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) {
        var crypto = window.crypto || window.msCrypto;

        if (crypto.getRandomValues) {
            var ua = new Uint8Array(32);
            crypto.getRandomValues(ua);

            for (t = 0; t < 32; ++t) {
                rng_pool[rng_pptr++] = ua[t];
            }
        } else {
            if (navigator.appName == "Netscape" && navigator.appVersion < "5") {
                var z = window.crypto.random(32);

                for (t = 0; t < z.length; ++t) {
                    rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
                }
            }
        }
    }

    while (rng_pptr < rng_psize) {
        t = Math.floor(65536 * Math.random());
        rng_pool[rng_pptr++] = t >>> 8;
        rng_pool[rng_pptr++] = t & 255;
    }

    rng_pptr = 0;
    rng_seed_time();
}

function rng_get_byte() {
    if (rng_state == null) {
        rng_seed_time();
        rng_state = prng_newstate();
        rng_state.init(rng_pool);

        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
            rng_pool[rng_pptr] = 0;
        }

        rng_pptr = 0;
    }

    return rng_state.next();
}

function rng_get_bytes(p) {
    var n;

    for (n = 0; n < p.length; ++n) {
        p[n] = rng_get_byte();
    }
}

function SecureRandom() {}

SecureRandom.prototype.nextBytes = rng_get_bytes;

function parseBigInt(p, n) {
    return new BigInteger(p, n);
}

function linebrk(p, n) {
    var A = "";
    var L = 0;

    while (L + n < p.length) {
        A += p.substring(L, L + n) + "\n";
        L += n;
    }

    return A + p.substring(L, p.length);
}

function byte2Hex(p) {
    return p < 16 ? "0" + p.toString(16) : p.toString(16);
}

function pkcs1pad2(p, n) {
    if (n < p.length + 11) {
        throw "Message too long for RSA";
        return null;
    }

    var c = new Array();
    var A = p.length - 1;

    while (A >= 0 && n > 0) {
        var L = p.charCodeAt(A--);

        if (L < 128) {
            c[--n] = L;
        } else {
            if (L > 127 && L < 2048) {
                c[--n] = L & 63 | 128;
                c[--n] = L >> 6 | 192;
            } else {
                c[--n] = L & 63 | 128;
                c[--n] = L >> 6 & 63 | 128;
                c[--n] = L >> 12 | 224;
            }
        }
    }

    c[--n] = 0;
    var S = new SecureRandom();
    var Y = new Array();

    while (n > 2) {
        Y[0] = 0;

        while (Y[0] == 0) {
            S.nextBytes(Y);
        }

        c[--n] = Y[0];
    }

    return c[--n] = 2, c[--n] = 0, new BigInteger(c);
}

function oaep_mgf1_arr(p, n, A) {
    var L = "";
    var g = 0;

    while (L.length < n) {
        L += A(String.fromCharCode.apply(String, p.concat([(g & 4278190080) >> 24, (g & 16711680) >> 16, (g & 65280) >> 8, g & 255])));
        g += 1;
    }

    return L;
}

function oaep_pad(n, A, L, S) {
    var Y = KJUR.crypto.MessageDigest;
    var J = KJUR.crypto.Util;
    var C = null;

    if (!L) {
        L = "sha1";
    }

    if (typeof L === "string") {
        C = Y.getCanonicalAlgName(L);
        S = Y.getHashLength(C);

        L = function (K) {
            return hextorstr(J.hashHex(rstrtohex(K), C));
        };
    }

    if (n.length + 2 * S + 2 > A) throw "Message too long for RSA";
    var V = "";
    var W;

    for (W = 0; W < A - n.length - 2 * S - 2; W += 1) {
        V += "\0";
    }

    var R = L("") + V + "" + n;
    var B = new Array(S);
    new SecureRandom().nextBytes(B);
    var F = oaep_mgf1_arr(B, R.length, L);
    var E = [];

    for (W = 0; W < R.length; W += 1) {
        E[W] = R.charCodeAt(W) ^ F.charCodeAt(W);
    }

    var s = oaep_mgf1_arr(E, B.length, L);
    var I = [0];

    for (W = 0; W < B.length; W += 1) {
        I[W + 1] = B[W] ^ s.charCodeAt(W);
    }

    return new BigInteger(I.concat(E));
}

function RSAKey() {
    this.n = null;
    this.e = 0;
    this.d = null;
    this.p = null;
    this.q = null;
    this.dmp1 = null;
    this.dmq1 = null;
    this.coeff = null;
}

function RSASetPublic(p, n) {
    this.isPublic = !![];
    this.isPrivate = ![];

    if (typeof p !== "string") {
        this.n = p;
        this.e = n;
    } else {
        if (p != null && n != null && p.length > 0 && n.length > 0) {
            this.n = parseBigInt(p, 16);
            this.e = parseInt(n, 16);
        } else throw "Invalid RSA public key";
    }
}

function RSADoPublic(p) {
    return p.modPowInt(this.e, this.n);
}

function RSAEncrypt(p) {
    var n = pkcs1pad2(p, this.n.bitLength() + 7 >> 3);
    if (n == null) return null;
    var c = this.doPublic(n);
    if (c == null) return null;
    var A = c.toString(16);
    return (A.length & 1) == 0 ? A : "0" + A;
}

function RSAEncryptOAEP(p, n, c) {
    var A = oaep_pad(p, this.n.bitLength() + 7 >> 3, n, c);
    if (A == null) return null;
    var L = this.doPublic(A);
    if (L == null) return null;
    var S = L.toString(16);
    return (S.length & 1) == 0 ? S : "0" + S;
}

RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
RSAKey.prototype.type = "RSA";

function pkcs1unpad2(p, n) {
    var c = p.toByteArray();
    var A = 0;

    while (A < c.length && c[A] == 0) {
        ++A;
    }

    if (c.length - A != n - 1 || c[A] != 2) return null;
    ++A;

    while (c[A] != 0) {
        if (++A >= c.length) return null;
    }

    var L = "";

    while (++A < c.length) {
        var S = c[A] & 255;

        if (S < 128) {
            L += String.fromCharCode(S);
        } else {
            if (S > 191 && S < 224) {
                L += String.fromCharCode((S & 31) << 6 | c[A + 1] & 63);
                ++A;
            } else {
                L += String.fromCharCode((S & 15) << 12 | (c[A + 1] & 63) << 6 | c[A + 2] & 63);
                A += 2;
            }
        }
    }

    return L;
}

function oaep_mgf1_str(p, n, A) {
    var L = "";
    var g = 0;

    while (L.length < n) {
        L += A(p + String.fromCharCode.apply(String, [(g & 4278190080) >> 24, (g & 16711680) >> 16, (g & 65280) >> 8, g & 255]));
        g += 1;
    }

    return L;
}

function oaep_unpad(n, A, L, S) {
    var Y = KJUR.crypto.MessageDigest;
    var J = KJUR.crypto.Util;
    var C = null;

    if (!L) {
        L = "sha1";
    }

    if (typeof L === "string") {
        C = Y.getCanonicalAlgName(L);
        S = Y.getHashLength(C);

        L = function (i) {
            return hextorstr(J.hashHex(rstrtohex(i), C));
        };
    }

    n = n.toByteArray();
    var V;

    for (V = 0; V < n.length; V += 1) {
        n[V] &= 255;
    }

    while (n.length < A) {
        n.unshift(0);
    }

    n = String.fromCharCode.apply(String, n);
    if (n.length < 2 * S + 2) throw "Cipher too short";
    var W = n.substr(1, S);
    var R = n.substr(S + 1);
    var B = oaep_mgf1_str(R, S, L);
    var F = [];
    var V;

    for (V = 0; V < W.length; V += 1) {
        F[V] = W.charCodeAt(V) ^ B.charCodeAt(V);
    }

    var E = oaep_mgf1_str(String.fromCharCode.apply(String, F), n.length - S, L);
    var I = [];

    for (V = 0; V < R.length; V += 1) {
        I[V] = R.charCodeAt(V) ^ E.charCodeAt(V);
    }

    I = String.fromCharCode.apply(String, I);
    if (I.substr(0, S) !== L("")) throw "Hash mismatch";
    I = I.substr(S);
    var K = I.indexOf("");

    if (K != -1) {
        var T = I.substr(0, K).lastIndexOf("\0");
    } else {
        var T = -1;
    }

    if (T + 1 != K) throw "Malformed data";
    return I.substr(K + 1);
}

function RSASetPrivate(p, n, A) {
    this.isPrivate = !![];

    if (typeof p !== "string") {
        this.n = p;
        this.e = n;
        this.d = A;
    } else {
        if (p != null && n != null && p.length > 0 && n.length > 0) {
            this.n = parseBigInt(p, 16);
            this.e = parseInt(n, 16);
            this.d = parseBigInt(A, 16);
        } else throw "Invalid RSA private key";
    }
}

function RSASetPrivateEx(p, n, A, L, S, Y, J, C) {
    this.isPrivate = !![];
    this.isPublic = ![];
    if (p == null) throw "RSASetPrivateEx N == null";
    if (n == null) throw "RSASetPrivateEx E == null";
    if (p.length == 0) throw "RSASetPrivateEx N.length == 0";
    if (n.length == 0) throw "RSASetPrivateEx E.length == 0";

    if (p != null && n != null && p.length > 0 && n.length > 0) {
        this.n = parseBigInt(p, 16);
        this.e = parseInt(n, 16);
        this.d = parseBigInt(A, 16);
        this.p = parseBigInt(L, 16);
        this.q = parseBigInt(S, 16);
        this.dmp1 = parseBigInt(Y, 16);
        this.dmq1 = parseBigInt(J, 16);
        this.coeff = parseBigInt(C, 16);
    } else throw "Invalid RSA private key in RSASetPrivateEx";
}

function RSAGenerate(p, n) {
    var A = new SecureRandom();
    var L = p >> 1;
    this.e = parseInt(n, 16);
    var S = new BigInteger(n, 16);

    for (;;) {
        for (;;) {
            this.p = new BigInteger(p - L, 1, A);
            if (this.p.subtract(BigInteger.ONE).gcd(S).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
        }

        for (;;) {
            this.q = new BigInteger(L, 1, A);
            if (this.q.subtract(BigInteger.ONE).gcd(S).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) break;
        }

        if (this.p.compareTo(this.q) <= 0) {
            var Y = this.p;
            this.p = this.q;
            this.q = Y;
        }

        var J = this.p.subtract(BigInteger.ONE);
        var C = this.q.subtract(BigInteger.ONE);
        var V = J.multiply(C);

        if (V.gcd(S).compareTo(BigInteger.ONE) == 0) {
            this.n = this.p.multiply(this.q);

            if (this.n.bitLength() == p) {
                this.d = S.modInverse(V);
                this.dmp1 = this.d.mod(J);
                this.dmq1 = this.d.mod(C);
                this.coeff = this.q.modInverse(this.p);
                break;
            }
        }
    }

    this.isPrivate = !![];
}

function RSADoPrivate(p) {
    if (this.p == null || this.q == null) return p.modPow(this.d, this.n);
    var n = p.mod(this.p).modPow(this.dmp1, this.p);
    var A = p.mod(this.q).modPow(this.dmq1, this.q);

    while (n.compareTo(A) < 0) {
        n = n.add(this.p);
    }

    return n.subtract(A).multiply(this.coeff).mod(this.p).multiply(this.q).add(A);
}

function RSADecrypt(p) {
    if (p.length != Math.ceil(this.n.bitLength() / 4)) throw new Error("wrong ctext length");
    var n = parseBigInt(p, 16);
    var c = this.doPrivate(n);
    if (c == null) return null;
    return pkcs1unpad2(c, this.n.bitLength() + 7 >> 3);
}

function RSADecryptOAEP(p, n, c) {
    if (p.length != Math.ceil(this.n.bitLength() / 4)) throw new Error("wrong ctext length");
    var A = parseBigInt(p, 16);
    var L = this.doPrivate(A);
    if (L == null) return null;
    return oaep_unpad(L, this.n.bitLength() + 7 >> 3, n, c);
}

RSAKey.prototype.doPrivate = RSADoPrivate;
RSAKey.prototype.setPrivate = RSASetPrivate;
RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
RSAKey.prototype.generate = RSAGenerate;
RSAKey.prototype.decrypt = RSADecrypt;
RSAKey.prototype.decryptOAEP = RSADecryptOAEP;

function ECFieldElementFp(p, n) {
    this.x = n;
    this.q = p;
}

function feFpEquals(p) {
    if (p == this) return !![];
    return this.q.equals(p.q) && this.x.equals(p.x);
}

function feFpToBigInteger() {
    return this.x;
}

function feFpNegate() {
    return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
}

function feFpAdd(p) {
    return new ECFieldElementFp(this.q, this.x.add(p.toBigInteger()).mod(this.q));
}

function feFpSubtract(p) {
    return new ECFieldElementFp(this.q, this.x.subtract(p.toBigInteger()).mod(this.q));
}

function feFpMultiply(p) {
    return new ECFieldElementFp(this.q, this.x.multiply(p.toBigInteger()).mod(this.q));
}

function feFpSquare() {
    return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
}

function feFpDivide(p) {
    return new ECFieldElementFp(this.q, this.x.multiply(p.toBigInteger().modInverse(this.q)).mod(this.q));
}

ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;

function ECPointFp(p, n, A, L) {
    this.curve = p;
    this.x = n;
    this.y = A;
    L == null ? this.z = BigInteger.ONE : this.z = L;
    this.zinv = null;
}

function pointFpGetX() {
    return this.zinv == null && (this.zinv = this.z.modInverse(this.curve.q)), this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}

function pointFpGetY() {
    return this.zinv == null && (this.zinv = this.z.modInverse(this.curve.q)), this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}

function pointFpEquals(p) {
    if (p == this) return !![];
    if (this.isInfinity()) return p.isInfinity();
    if (p.isInfinity()) return this.isInfinity();
    var n;
    var A;
    n = p.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(p.z)).mod(this.curve.q);
    if (!n.equals(BigInteger.ZERO)) return ![];
    return A = p.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(p.z)).mod(this.curve.q), A.equals(BigInteger.ZERO);
}

function pointFpIsInfinity() {
    if (this.x == null && this.y == null) return !![];
    return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
}

function pointFpNegate() {
    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}

function pointFpAdd(A) {
    if (this.isInfinity()) return A;
    if (A.isInfinity()) return this;
    var L = A.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(A.z)).mod(this.curve.q);
    var S = A.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(A.z)).mod(this.curve.q);

    if (BigInteger.ZERO.equals(S)) {
        if (BigInteger.ZERO.equals(L)) return this.twice();
        return this.curve.getInfinity();
    }

    var Y = new BigInteger("3");
    var J = this.x.toBigInteger();
    var b = this.y.toBigInteger();
    var C = A.x.toBigInteger();
    var V = A.y.toBigInteger();
    var W = S.square();
    var R = W.multiply(S);
    var B = J.multiply(W);
    var F = L.square().multiply(this.z);
    var E = F.subtract(B.shiftLeft(1)).multiply(A.z).subtract(R).multiply(S).mod(this.curve.q);
    var s = B.multiply(Y).multiply(L).subtract(b.multiply(R)).subtract(F.multiply(L)).multiply(A.z).add(L.multiply(R)).mod(this.curve.q);
    var I = R.multiply(this.z).multiply(A.z).mod(this.curve.q);
    return new ECPointFp(this.curve, this.curve.fromBigInteger(E), this.curve.fromBigInteger(s), I);
}

function pointFpTwice() {
    if (this.isInfinity()) return this;
    if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
    var p = new BigInteger("3");
    var n = this.x.toBigInteger();
    var a = this.y.toBigInteger();
    var A = a.multiply(this.z);
    var L = A.multiply(a).mod(this.curve.q);
    var S = this.curve.a.toBigInteger();
    var Y = n.square().multiply(p);

    if (!BigInteger.ZERO.equals(S)) {
        Y = Y.add(this.z.square().multiply(S));
    }

    Y = Y.mod(this.curve.q);
    var J = Y.square().subtract(n.shiftLeft(3).multiply(L)).shiftLeft(1).multiply(A).mod(this.curve.q);
    var C = Y.multiply(p).multiply(n).subtract(L.shiftLeft(1)).shiftLeft(2).multiply(L).subtract(Y.square().multiply(Y)).mod(this.curve.q);
    var V = A.square().multiply(A).shiftLeft(3).mod(this.curve.q);
    return new ECPointFp(this.curve, this.curve.fromBigInteger(J), this.curve.fromBigInteger(C), V);
}

function pointFpMultiply(A) {
    if (this.isInfinity()) return this;
    if (A.signum() == 0) return this.curve.getInfinity();
    var L = A;
    var S = L.multiply(new BigInteger("3"));
    var Y = this.negate();
    var J = this;
    var C = this.curve.q.subtract(A);
    var V = C.multiply(new BigInteger("3"));
    var W = new ECPointFp(this.curve, this.x, this.y);
    var R = W.negate();
    var B;

    for (B = S.bitLength() - 2; B > 0; --B) {
        J = J.twice();
        var F = S.testBit(B);
        var E = L.testBit(B);

        if (F != E) {
            J = J.add(F ? this : Y);
        }
    }

    for (B = V.bitLength() - 2; B > 0; --B) {
        W = W.twice();
        var s = V.testBit(B);
        var I = C.testBit(B);

        if (s != I) {
            W = W.add(s ? W : R);
        }
    }

    return J;
}

function pointFpMultiplyTwo(p, n, A) {
    var L;

    if (p.bitLength() > A.bitLength()) {
        L = p.bitLength() - 1;
    } else {
        L = A.bitLength() - 1;
    }

    var g = this.curve.getInfinity();
    var S = this.add(n);

    while (L >= 0) {
        g = g.twice();
        p.testBit(L) ? A.testBit(L) ? g = g.add(S) : g = g.add(this) : A.testBit(L) && (g = g.add(n));
        --L;
    }

    return g;
}

ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;

function ECCurveFp(p, n, a) {
    this.q = p;
    this.a = this.fromBigInteger(n);
    this.b = this.fromBigInteger(a);
    this.infinity = new ECPointFp(this, null, null);
}

function curveFpGetQ() {
    return this.q;
}

function curveFpGetA() {
    return this.a;
}

function curveFpGetB() {
    return this.b;
}

function curveFpEquals(p) {
    if (p == this) return !![];
    return this.q.equals(p.q) && this.a.equals(p.a) && this.b.equals(p.b);
}

function curveFpGetInfinity() {
    return this.infinity;
}

function curveFpFromBigInteger(p) {
    return new ECFieldElementFp(this.q, p);
}

function curveFpDecodePointHex(p) {
    switch (parseInt(p.substr(0, 2), 16)) {
        case 0:
            return this.infinity;

        case 2:
        case 3:
            return null;

        case 4:
        case 6:
        case 7:
            var n = (p.length - 2) / 2;
            var A = p.substr(2, n);
            var L = p.substr(n + 2, n);
            return new ECPointFp(this, this.fromBigInteger(new BigInteger(A, 16)), this.fromBigInteger(new BigInteger(L, 16)));

        default:
            return null;
    }
}

ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;

ECFieldElementFp.prototype.getByteLength = function () {
    return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
};

ECPointFp.prototype.getEncoded = function (p) {
    var n = function (S, Y) {
        var J = S.toByteArrayUnsigned();
        if (Y < J.length) J = J.slice(J.length - Y);else while (Y > J.length) {
            J.unshift(0);
        }
        return J;
    };

    var A = this.getX().toBigInteger();
    var L = this.getY().toBigInteger();
    var g = n(A, 32);
    return p ? L.isEven() ? g.unshift(2) : g.unshift(3) : (g.unshift(4), g = g.concat(n(L, 32))), g;
};

ECPointFp.decodeFrom = function (p, n) {
    var A = n[0];
    var L = n.length - 1;
    var S = n.slice(1, 1 + L / 2);
    var Y = n.slice(1 + L / 2, 1 + L);
    S.unshift(0);
    Y.unshift(0);
    var J = new BigInteger(S);
    var C = new BigInteger(Y);
    return new ECPointFp(p, p.fromBigInteger(J), p.fromBigInteger(C));
};

ECPointFp.decodeFromHex = function (p, n) {
    var A = n.substr(0, 2);
    var L = n.length - 2;
    var S = n.substr(2, L / 2);
    var Y = n.substr(2 + L / 2, L / 2);
    var J = new BigInteger(S, 16);
    var C = new BigInteger(Y, 16);
    return new ECPointFp(p, p.fromBigInteger(J), p.fromBigInteger(C));
};

ECPointFp.prototype.add2D = function (p) {
    if (this.isInfinity()) return p;
    if (p.isInfinity()) return this;

    if (this.x.equals(p.x)) {
        if (this.y.equals(p.y)) return this.twice();
        return this.curve.getInfinity();
    }

    var n = p.x.subtract(this.x);
    var A = p.y.subtract(this.y);
    var L = A.divide(n);
    var S = L.square().subtract(this.x).subtract(p.x);
    var Y = L.multiply(this.x.subtract(S)).subtract(this.y);
    return new ECPointFp(this.curve, S, Y);
};

ECPointFp.prototype.twice2D = function () {
    if (this.isInfinity()) return this;
    if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
    var p = this.curve.fromBigInteger(BigInteger.valueOf(2));
    var n = this.curve.fromBigInteger(BigInteger.valueOf(3));
    var A = this.x.square().multiply(n).add(this.curve.a).divide(this.y.multiply(p));
    var L = A.square().subtract(this.x.multiply(p));
    var g = A.multiply(this.x.subtract(L)).subtract(this.y);
    return new ECPointFp(this.curve, L, g);
};

ECPointFp.prototype.multiply2D = function (p) {
    if (this.isInfinity()) return this;
    if (p.signum() == 0) return this.curve.getInfinity();
    var n = p;
    var A = n.multiply(new BigInteger("3"));
    var L = this.negate();
    var S = this;
    var Y;

    for (Y = A.bitLength() - 2; Y > 0; --Y) {
        S = S.twice();
        var J = A.testBit(Y);
        var C = n.testBit(Y);

        if (J != C) {
            S = S.add2D(J ? this : L);
        }
    }

    return S;
};

ECPointFp.prototype.isOnCurve = function () {
    var p = this.getX().toBigInteger();
    var n = this.getY().toBigInteger();
    var a = this.curve.getA().toBigInteger();
    var A = this.curve.getB().toBigInteger();
    var L = this.curve.getQ();
    var S = n.multiply(n).mod(L);
    var Y = p.multiply(p).multiply(p).add(a.multiply(p)).add(A).mod(L);
    return S.equals(Y);
};

ECPointFp.prototype.toString = function () {
    return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")";
};

ECPointFp.prototype.validate = function () {
    var p = this.curve.getQ();
    if (this.isInfinity()) throw new Error("Point is at infinity.");
    var n = this.getX().toBigInteger();
    var A = this.getY().toBigInteger();
    if (n.compareTo(BigInteger.ONE) < 0 || n.compareTo(p.subtract(BigInteger.ONE)) > 0) throw new Error("x coordinate out of bounds");
    if (A.compareTo(BigInteger.ONE) < 0 || A.compareTo(p.subtract(BigInteger.ONE)) > 0) throw new Error("y coordinate out of bounds");
    if (!this.isOnCurve()) throw new Error("Point is not on the curve.");
    if (this.multiply(p).isInfinity()) throw new Error("Point is not a scalar multiple of G.");
    return !![];
};

var jsonParse = function () {
    var p = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";
    var n = "(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))";
    var A = "(?:\"" + n + "*\")";
    var L = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + p + "|" + A + ")", "g");
    var S = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");
    var Y = {
        "\"": "\"",
        "/": "/",
        "\\": "\\",
        "b": "\b",
        "f": "\f",
        "n": "\n",
        "r": "\r",
        "t": "\t"
    };

    function J(R, B, F) {
        return B ? Y[B] : String.fromCharCode(parseInt(F, 16));
    }

    var C = new String("");
    var V = "\\";
    var W = {
        "{": Object,
        "[": Array
    };
    var l = Object.hasOwnProperty;
    return function (R, B) {
        var F = R.match(L);
        var E;
        var I = F[0];
        var K = ![];

        if ("{" === I) {
            E = {};
        } else {
            if ("[" === I) {
                E = [];
            } else {
                E = [];
                K = !![];
            }
        }

        var T;
        var Z = [E];

        for (var M = 1 - K, U = F.length; M < U; ++M) {
            I = F[M];
            var H;

            switch (I.charCodeAt(0)) {
                default:
                    H = Z[0];
                    H[T || H.length] = +I;
                    T = void 0;
                    break;

                case 34:
                    I = I.substring(1, I.length - 1);

                    if (I.indexOf(V) !== -1) {
                        I = I.replace(S, J);
                    }

                    H = Z[0];

                    if (!T) {
                        if (H instanceof Array) T = H.length;else {
                            T = I || C;
                            break;
                        }
                    }

                    H[T] = I;
                    T = void 0;
                    break;

                case 91:
                    H = Z[0];
                    Z.unshift(H[T || H.length] = []);
                    T = void 0;
                    break;

                case 93:
                    Z.shift();
                    break;

                case 102:
                    H = Z[0];
                    H[T || H.length] = ![];
                    T = void 0;
                    break;

                case 110:
                    H = Z[0];
                    H[T || H.length] = null;
                    T = void 0;
                    break;

                case 116:
                    H = Z[0];
                    H[T || H.length] = !![];
                    T = void 0;
                    break;

                case 123:
                    H = Z[0];
                    Z.unshift(H[T || H.length] = {});
                    T = void 0;
                    break;

                case 125:
                    Z.shift();
                    break;
            }
        }

        if (K) {
            if (Z.length !== 1) throw new Error();
            E = E[0];
        } else {
            if (Z.length) throw new Error();
        }

        if (B) {
            var O = function (X, G) {
                var N = X[G];

                if (N && typeof N === "object") {
                    var Q = null;

                    for (var P in N) {
                        if (l.call(N, P) && N !== X) {
                            var p0 = O(N, P);

                            if (p0 !== void 0) {
                                N[P] = p0;
                            } else {
                                !Q && (Q = []);
                                Q.push(P);
                            }
                        }
                    }

                    if (Q) for (var p1 = Q.length; --p1 >= 0;) {
                        delete N[Q[p1]];
                    }
                }

                return B.call(X, G, N);
            };

            E = O({
                "": E
            }, "");
        }

        return E;
    };
}();

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

KJUR.asn1.ASN1Util = new function () {
    this.integerToByteHex = function (p) {
        var n = p.toString(16);
        return n.length % 2 == 1 && (n = "0" + n), n;
    };

    this.bigIntToMinTwosComplementsHex = function (p) {
        var n = p.toString(16);
        if (n.substr(0, 1) != "-") {
            if (n.length % 2 == 1) {
                n = "0" + n;
            } else {
                if (!n.match(/^[0-7]/)) {
                    n = "00" + n;
                }
            }
        } else {
            var A = n.substr(1);
            var L = A.length;

            if (L % 2 == 1) {
                L += 1;
            } else {
                if (!n.match(/^[0-7]/)) {
                    L += 2;
                }
            }

            var S = "";

            for (var Y = 0; Y < L; Y++) {
                S += "f";
            }

            var J = new BigInteger(S, 16);
            var C = J.xor(p).add(BigInteger.ONE);
            n = C.toString(16).replace(/^-/, "");
        }
        return n;
    };

    this.getPEMStringFromHex = function (p, n) {
        return hextopem(p, n);
    };

    this.newObject = function (a) {
        var L = KJUR;
        var S = L.asn1;
        var Y = S.DERBoolean;
        var J = S.DERInteger;
        var V = S.DERBitString;
        var W = S.DEROctetString;
        var R = S.DERNull;
        var I = S.DERObjectIdentifier;
        var K = S.DEREnumerated;
        var T = S.DERUTF8String;
        var i = S.DERNumericString;
        var Z = S.DERPrintableString;
        var M = S.DERTeletexString;
        var U = S.DERIA5String;
        var H = S.DERUTCTime;
        var O = S.DERGeneralizedTime;
        var X = S.DERSequence;
        var G = S.DERSet;
        var N = S.DERTaggedObject;
        var Q = S.ASN1Util.newObject;
        var P = Object.keys(a);
        if (P.length != 1) throw "key of param shall be only one.";
        var p0 = P[0];
        if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + p0 + ":") == -1) throw "undefined key: " + p0;
        if (p0 == "bool") return new Y(a[p0]);
        if (p0 == "int") return new J(a[p0]);
        if (p0 == "bitstr") return new V(a[p0]);
        if (p0 == "octstr") return new W(a[p0]);
        if (p0 == "null") return new R(a[p0]);
        if (p0 == "oid") return new I(a[p0]);
        if (p0 == "enum") return new K(a[p0]);
        if (p0 == "utf8str") return new T(a[p0]);
        if (p0 == "numstr") return new i(a[p0]);
        if (p0 == "prnstr") return new Z(a[p0]);
        if (p0 == "telstr") return new M(a[p0]);
        if (p0 == "ia5str") return new U(a[p0]);
        if (p0 == "utctime") return new H(a[p0]);
        if (p0 == "gentime") return new O(a[p0]);

        if (p0 == "seq") {
            var p1 = a[p0];
            var p2 = [];

            for (var p3 = 0; p3 < p1.length; p3++) {
                var p4 = Q(p1[p3]);
                p2.push(p4);
            }

            return new X({
                "array": p2
            });
        }

        if (p0 == "set") {
            var p1 = a[p0];
            var p2 = [];

            for (var p3 = 0; p3 < p1.length; p3++) {
                var p4 = Q(p1[p3]);
                p2.push(p4);
            }

            return new G({
                "array": p2
            });
        }

        if (p0 == "tag") {
            var p5 = a[p0];

            if (Object.prototype.toString.call(p5) === "[object Array]" && p5.length == 3) {
                var p6 = Q(p5[2]);
                return new N({
                    "tag": p5[0],
                    "explicit": p5[1],
                    "obj": p6
                });
            } else {
                var p7 = {};

                if (p5.explicit !== undefined) {
                    p7.explicit = p5.explicit;
                }

                if (p5.tag !== undefined) {
                    p7.tag = p5.tag;
                }

                if (p5.obj === undefined) throw "obj shall be specified for 'tag'.";
                return p7.obj = Q(p5.obj), new N(p7);
            }
        }
    };

    this.jsonToASN1HEX = function (p) {
        var n = this.newObject(p);
        return n.getEncodedHex();
    };
}();

KJUR.asn1.ASN1Util.oidHexToInt = function (p) {
    var n = "";
    var A = parseInt(p.substr(0, 2), 16);
    var L = Math.floor(A / 40);
    var S = A % 40;
    var n = L + "." + S;
    var Y = "";

    for (var J = 2; J < p.length; J += 2) {
        var C = parseInt(p.substr(J, 2), 16);
        var V = ("00000000" + C.toString(2)).slice(-8);
        Y = Y + V.substr(1, 7);

        if (V.substr(0, 1) == "0") {
            var W = new BigInteger(Y, 2);
            n = n + "." + W.toString(10);
            Y = "";
        }
    }

    return n;
};

KJUR.asn1.ASN1Util.oidIntToHex = function (p) {
    var n = function (J) {
        var C = J.toString(16);
        return C.length == 1 && (C = "0" + C), C;
    };

    var a = function (J) {
        var C = "";
        var V = new BigInteger(J, 10);
        var W = V.toString(2);
        var R = 7 - W.length % 7;

        if (R == 7) {
            R = 0;
        }

        var B = "";

        for (var F = 0; F < R; F++) {
            B += "0";
        }

        W = B + W;

        for (var F = 0; F < W.length - 1; F += 7) {
            var E = W.substr(F, 7);
            F != W.length - 7 && (E = "1" + E);
            C += n(parseInt(E, 2));
        }

        return C;
    };

    if (!p.match(/^[0-9.]+$/)) throw "malformed oid string: " + p;
    var A = "";
    var L = p.split(".");
    var S = parseInt(L[0]) * 40 + parseInt(L[1]);
    A += n(S);
    L.splice(0, 2);

    for (var Y = 0; Y < L.length; Y++) {
        A += a(L[Y]);
    }

    return A;
};

KJUR.asn1.ASN1Object = function () {
    var p = !![];
    var n = null;
    var A = "00";
    var L = "00";
    var g = "";

    this.getLengthHexFromValue = function () {
        if (typeof this.hV == "undefined" || this.hV == null) throw "this.hV is null or undefined.";
        if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + g.length + ",v=" + this.hV;
        var S = this.hV.length / 2;
        var Y = S.toString(16);

        if (Y.length % 2 == 1) {
            Y = "0" + Y;
        }

        if (S < 128) return Y;else {
            var J = Y.length / 2;
            if (J > 15) throw "ASN.1 length too long to represent by 8x: n = " + S.toString(16);
            var C = 128 + J;
            return C.toString(16) + Y;
        }
    };

    this.getEncodedHex = function () {
        return (this.hTLV == null || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = ![]), this.hTLV;
    };

    this.getValueHex = function () {
        return this.getEncodedHex(), this.hV;
    };

    this.getFreshValueHex = function () {
        return "";
    };
};

KJUR.asn1.DERAbstractString = function (p) {
    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
    var n = null;
    var A = null;

    this.getString = function () {
        return this.s;
    };

    this.setString = function (L) {
        this.hTLV = null;
        this.isModified = !![];
        this.s = L;
        this.hV = utf8tohex(this.s).toLowerCase();
    };

    this.setStringHex = function (L) {
        this.hTLV = null;
        this.isModified = !![];
        this.s = null;
        this.hV = L;
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    typeof p != "undefined" && (typeof p == "string" ? this.setString(p) : typeof p.str != "undefined" ? this.setString(p.str) : typeof p.hex != "undefined" && this.setStringHex(p.hex));
};

YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);

KJUR.asn1.DERAbstractTime = function (p) {
    KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
    var n = null;
    var A = null;

    this.localDateToUTC = function (L) {
        var S = L.getTime() + L.getTimezoneOffset() * 60000;
        var Y = new Date(S);
        return Y;
    };

    this.formatDate = function (L, S, Y) {
        var J = this.zeroPadding;
        var C = this.localDateToUTC(L);
        var V = String(C.getFullYear());

        if (S == "utc") {
            V = V.substr(2, 2);
        }

        var W = J(String(C.getMonth() + 1), 2);
        var R = J(String(C.getDate()), 2);
        var B = J(String(C.getHours()), 2);
        var F = J(String(C.getMinutes()), 2);
        var E = J(String(C.getSeconds()), 2);
        var s = V + W + R + B + F + E;

        if (Y === !![]) {
            var I = C.getMilliseconds();

            if (I != 0) {
                var K = J(String(I), 3);
                K = K.replace(/[0]+$/, "");
                s = s + "." + K;
            }
        }

        return s + "Z";
    };

    this.zeroPadding = function (L, g) {
        if (L.length >= g) return L;
        return new Array(g - L.length + 1).join("0") + L;
    };

    this.getString = function () {
        return this.s;
    };

    this.setString = function (L) {
        this.hTLV = null;
        this.isModified = !![];
        this.s = L;
        this.hV = stohex(L);
    };

    this.setByDateValue = function (L, S, Y, J, C, V) {
        var W = new Date(Date.UTC(L, S - 1, Y, J, C, V, 0));
        this.setByDate(W);
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };
};

YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);

KJUR.asn1.DERAbstractStructured = function (p) {
    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
    var n = null;

    this.setByASN1ObjectArray = function (A) {
        this.hTLV = null;
        this.isModified = !![];
        this.asn1Array = A;
    };

    this.appendASN1Object = function (A) {
        this.hTLV = null;
        this.isModified = !![];
        this.asn1Array.push(A);
    };

    this.asn1Array = new Array();
    typeof p != "undefined" && typeof p.array != "undefined" && (this.asn1Array = p.array);
};

YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);

KJUR.asn1.DERBoolean = function () {
    KJUR.asn1.DERBoolean.superclass.constructor.call(this);
    this.hT = "01";
    this.hTLV = "0101ff";
};

YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);

KJUR.asn1.DERInteger = function (p) {
    KJUR.asn1.DERInteger.superclass.constructor.call(this);
    this.hT = "02";

    this.setByBigInteger = function (n) {
        this.hTLV = null;
        this.isModified = !![];
        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(n);
    };

    this.setByInteger = function (n) {
        var A = new BigInteger(String(n), 10);
        this.setByBigInteger(A);
    };

    this.setValueHex = function (n) {
        this.hV = n;
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    typeof p != "undefined" && (typeof p.bigint != "undefined" ? this.setByBigInteger(p.bigint) : typeof p.int != "undefined" ? this.setByInteger(p.int) : typeof p == "number" ? this.setByInteger(p) : typeof p.hex != "undefined" && this.setValueHex(p.hex));
};

YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);

KJUR.asn1.DERBitString = function (p) {
    if (p !== undefined && typeof p.obj !== "undefined") {
        var n = KJUR.asn1.ASN1Util.newObject(p.obj);
        p.hex = "00" + n.getEncodedHex();
    }

    KJUR.asn1.DERBitString.superclass.constructor.call(this);
    this.hT = "03";

    this.setHexValueIncludingUnusedBits = function (A) {
        this.hTLV = null;
        this.isModified = !![];
        this.hV = A;
    };

    this.setUnusedBitsAndHexValue = function (A, L) {
        if (A < 0 || 7 < A) throw "unused bits shall be from 0 to 7: u = " + A;
        var g = "0" + A;
        this.hTLV = null;
        this.isModified = !![];
        this.hV = g + L;
    };

    this.setByBinaryString = function (A) {
        A = A.replace(/0+$/, "");
        var L = 8 - A.length % 8;

        if (L == 8) {
            L = 0;
        }

        for (var S = 0; S <= L; S++) {
            A += "0";
        }

        var Y = "";

        for (var S = 0; S < A.length - 1; S += 8) {
            var J = A.substr(S, 8);
            var C = parseInt(J, 2).toString(16);
            C.length == 1 && (C = "0" + C);
            Y += C;
        }

        this.hTLV = null;
        this.isModified = !![];
        this.hV = "0" + L + Y;
    };

    this.setByBooleanArray = function (A) {
        var L = "";

        for (var g = 0; g < A.length; g++) {
            if (A[g] == !![]) {
                L += "1";
            } else {
                L += "0";
            }
        }

        this.setByBinaryString(L);
    };

    this.newFalseArray = function (A) {
        var L = new Array(A);

        for (var g = 0; g < A; g++) {
            L[g] = ![];
        }

        return L;
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    typeof p != "undefined" && (typeof p == "string" && p.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits(p) : typeof p.hex != "undefined" ? this.setHexValueIncludingUnusedBits(p.hex) : typeof p.bin != "undefined" ? this.setByBinaryString(p.bin) : typeof p.array != "undefined" && this.setByBooleanArray(p.array));
};

YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);

KJUR.asn1.DEROctetString = function (p) {
    if (p !== undefined && typeof p.obj !== "undefined") {
        var n = KJUR.asn1.ASN1Util.newObject(p.obj);
        p.hex = n.getEncodedHex();
    }

    KJUR.asn1.DEROctetString.superclass.constructor.call(this, p);
    this.hT = "04";
};

YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERNull = function () {
    KJUR.asn1.DERNull.superclass.constructor.call(this);
    this.hT = "05";
    this.hTLV = "0500";
};

YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);

KJUR.asn1.DERObjectIdentifier = function (p) {
    var n = function (L) {
        var g = L.toString(16);
        return g.length == 1 && (g = "0" + g), g;
    };

    var A = function (L) {
        var S = "";
        var Y = new BigInteger(L, 10);
        var J = Y.toString(2);
        var C = 7 - J.length % 7;

        if (C == 7) {
            C = 0;
        }

        var V = "";

        for (var W = 0; W < C; W++) {
            V += "0";
        }

        J = V + J;

        for (var W = 0; W < J.length - 1; W += 7) {
            var R = J.substr(W, 7);
            W != J.length - 7 && (R = "1" + R);
            S += n(parseInt(R, 2));
        }

        return S;
    };

    KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
    this.hT = "06";

    this.setValueHex = function (L) {
        this.hTLV = null;
        this.isModified = !![];
        this.s = null;
        this.hV = L;
    };

    this.setValueOidString = function (L) {
        if (!L.match(/^[0-9.]+$/)) throw "malformed oid string: " + L;
        var S = "";
        var Y = L.split(".");
        var J = parseInt(Y[0]) * 40 + parseInt(Y[1]);
        S += n(J);
        Y.splice(0, 2);

        for (var C = 0; C < Y.length; C++) {
            S += A(Y[C]);
        }

        this.hTLV = null;
        this.isModified = !![];
        this.s = null;
        this.hV = S;
    };

    this.setValueName = function (L) {
        var g = KJUR.asn1.x509.OID.name2oid(L);
        if (g !== "") this.setValueOidString(g);else throw "DERObjectIdentifier oidName undefined: " + L;
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    p !== undefined && (typeof p === "string" ? p.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(p) : this.setValueName(p) : p.oid !== undefined ? this.setValueOidString(p.oid) : p.hex !== undefined ? this.setValueHex(p.hex) : p.name !== undefined && this.setValueName(p.name));
};

YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);

KJUR.asn1.DEREnumerated = function (p) {
    KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
    this.hT = "0a";

    this.setByBigInteger = function (n) {
        this.hTLV = null;
        this.isModified = !![];
        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(n);
    };

    this.setByInteger = function (n) {
        var A = new BigInteger(String(n), 10);
        this.setByBigInteger(A);
    };

    this.setValueHex = function (n) {
        this.hV = n;
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    typeof p != "undefined" && (typeof p.int != "undefined" ? this.setByInteger(p.int) : typeof p == "number" ? this.setByInteger(p) : typeof p.hex != "undefined" && this.setValueHex(p.hex));
};

YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);

KJUR.asn1.DERUTF8String = function (p) {
    KJUR.asn1.DERUTF8String.superclass.constructor.call(this, p);
    this.hT = "0c";
};

YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERNumericString = function (p) {
    KJUR.asn1.DERNumericString.superclass.constructor.call(this, p);
    this.hT = "12";
};

YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERPrintableString = function (p) {
    KJUR.asn1.DERPrintableString.superclass.constructor.call(this, p);
    this.hT = "13";
};

YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERTeletexString = function (p) {
    KJUR.asn1.DERTeletexString.superclass.constructor.call(this, p);
    this.hT = "14";
};

YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERIA5String = function (p) {
    KJUR.asn1.DERIA5String.superclass.constructor.call(this, p);
    this.hT = "16";
};

YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);

KJUR.asn1.DERUTCTime = function (p) {
    KJUR.asn1.DERUTCTime.superclass.constructor.call(this, p);
    this.hT = "17";

    this.setByDate = function (n) {
        this.hTLV = null;
        this.isModified = !![];
        this.date = n;
        this.s = this.formatDate(this.date, "utc");
        this.hV = stohex(this.s);
    };

    this.getFreshValueHex = function () {
        return typeof this.date == "undefined" && typeof this.s == "undefined" && (this.date = new Date(), this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s)), this.hV;
    };

    p !== undefined && (p.str !== undefined ? this.setString(p.str) : typeof p == "string" && p.match(/^[0-9]{12}Z$/) ? this.setString(p) : p.hex !== undefined ? this.setStringHex(p.hex) : p.date !== undefined && this.setByDate(p.date));
};

YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);

KJUR.asn1.DERGeneralizedTime = function (p) {
    KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, p);
    this.hT = "18";
    this.withMillis = ![];

    this.setByDate = function (n) {
        this.hTLV = null;
        this.isModified = !![];
        this.date = n;
        this.s = this.formatDate(this.date, "gen", this.withMillis);
        this.hV = stohex(this.s);
    };

    this.getFreshValueHex = function () {
        return this.date === undefined && this.s === undefined && (this.date = new Date(), this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s)), this.hV;
    };

    p !== undefined && (p.str !== undefined ? this.setString(p.str) : typeof p == "string" && p.match(/^[0-9]{14}Z$/) ? this.setString(p) : p.hex !== undefined ? this.setStringHex(p.hex) : p.date !== undefined && this.setByDate(p.date), p.millis === !![] && (this.withMillis = !![]));
};

YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);

KJUR.asn1.DERSequence = function (p) {
    KJUR.asn1.DERSequence.superclass.constructor.call(this, p);
    this.hT = "30";

    this.getFreshValueHex = function () {
        var n = "";

        for (var A = 0; A < this.asn1Array.length; A++) {
            var L = this.asn1Array[A];
            n += L.getEncodedHex();
        }

        return this.hV = n, this.hV;
    };
};

YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);

KJUR.asn1.DERSet = function (p) {
    KJUR.asn1.DERSet.superclass.constructor.call(this, p);
    this.hT = "31";
    this.sortFlag = !![];

    this.getFreshValueHex = function () {
        var n = new Array();

        for (var A = 0; A < this.asn1Array.length; A++) {
            var L = this.asn1Array[A];
            n.push(L.getEncodedHex());
        }

        return this.sortFlag == !![] && n.sort(), this.hV = n.join(""), this.hV;
    };

    typeof p != "undefined" && typeof p.sortflag != "undefined" && p.sortflag == ![] && (this.sortFlag = ![]);
};

YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);

KJUR.asn1.DERTaggedObject = function (p) {
    KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
    this.hT = "a0";
    this.hV = "";
    this.isExplicit = !![];
    this.asn1Object = null;

    this.setASN1Object = function (n, A, L) {
        this.hT = A;
        this.isExplicit = n;
        this.asn1Object = L;
        this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !![]) : (this.hV = null, this.hTLV = L.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, A), this.isModified = ![]);
    };

    this.getFreshValueHex = function () {
        return this.hV;
    };

    typeof p != "undefined" && (typeof p.tag != "undefined" && (this.hT = p.tag), typeof p.explicit != "undefined" && (this.isExplicit = p.explicit), typeof p.obj != "undefined" && (this.asn1Object = p.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)));
};

YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
var ASN1HEX = new function () {}();

ASN1HEX.getLblen = function (p, n) {
    if (p.substr(n + 2, 1) != "8") return 1;
    var A = parseInt(p.substr(n + 3, 1));
    if (A == 0) return -1;
    if (0 < A && A < 10) return A + 1;
    return -2;
};

ASN1HEX.getL = function (p, n) {
    var A = ASN1HEX.getLblen(p, n);
    if (A < 1) return "";
    return p.substr(n + 2, A * 2);
};

ASN1HEX.getVblen = function (p, n) {
    var A;
    var L;
    A = ASN1HEX.getL(p, n);
    if (A == "") return -1;
    return A.substr(0, 1) === "8" ? L = new BigInteger(A.substr(2), 16) : L = new BigInteger(A, 16), L.intValue();
};

ASN1HEX.getVidx = function (p, n) {
    var A = ASN1HEX.getLblen(p, n);
    if (A < 0) return A;
    return n + (A + 1) * 2;
};

ASN1HEX.getV = function (p, n) {
    var A = ASN1HEX.getVidx(p, n);
    var L = ASN1HEX.getVblen(p, n);
    return p.substr(A, L * 2);
};

ASN1HEX.getTLV = function (p, n) {
    return p.substr(n, 2) + ASN1HEX.getL(p, n) + ASN1HEX.getV(p, n);
};

ASN1HEX.getNextSiblingIdx = function (p, n) {
    var A = ASN1HEX.getVidx(p, n);
    var L = ASN1HEX.getVblen(p, n);
    return A + L * 2;
};

ASN1HEX.getChildIdx = function (p, n) {
    var a = ASN1HEX;
    var A = new Array();
    var L = a.getVidx(p, n);

    if (p.substr(n, 2) == "03") {
        A.push(L + 2);
    } else {
        A.push(L);
    }

    var S = a.getVblen(p, n);
    var Y = L;
    var J = 0;

    while (1) {
        var C = a.getNextSiblingIdx(p, Y);
        if (C == null || C - L >= S * 2) break;
        if (J >= 200) break;
        A.push(C);
        Y = C;
        J++;
    }

    return A;
};

ASN1HEX.getNthChildIdx = function (p, n, a) {
    var A = ASN1HEX.getChildIdx(p, n);
    return A[a];
};

ASN1HEX.getIdxbyList = function (p, n, a, A) {
    var L = ASN1HEX;
    var S;
    var Y;

    if (a.length == 0) {
        if (A !== undefined) {
            if (p.substr(n, 2) !== A) throw Error("checking tag doesn't match: " + p.substr(n, 2) + "!=" + A);
        }

        return n;
    }

    return S = a.shift(), Y = L.getChildIdx(p, n), L.getIdxbyList(p, Y[S], a, A);
};

ASN1HEX.getTLVbyList = function (p, n, A, L) {
    var g = ASN1HEX;
    var S = g.getIdxbyList(p, n, A);
    if (S === undefined) throw "can't find nthList object";

    if (L !== undefined) {
        if (p.substr(S, 2) != L) throw "checking tag doesn't match: " + p.substr(S, 2) + "!=" + L;
    }

    return g.getTLV(p, S);
};

ASN1HEX.getVbyList = function (p, n, A, L, S) {
    var Y = ASN1HEX;
    var J;
    var C;
    J = Y.getIdxbyList(p, n, A, L);
    if (J === undefined) throw "can't find nthList object";
    return C = Y.getV(p, J), S === !![] && (C = C.substr(2)), C;
};

ASN1HEX.hextooidstr = function (p) {
    var c = function (W, R) {
        if (W.length >= R) return W;
        return new Array(R - W.length + 1).join("0") + W;
    };

    var a = [];
    var A = p.substr(0, 2);
    var L = parseInt(A, 16);
    a[0] = new String(Math.floor(L / 40));
    a[1] = new String(L % 40);
    var S = p.substr(2);
    var Y = [];

    for (var J = 0; J < S.length / 2; J++) {
        Y.push(parseInt(S.substr(J * 2, 2), 16));
    }

    var b = [];
    var C = "";

    for (var J = 0; J < Y.length; J++) {
        if (Y[J] & 128) {
            C = C + c((Y[J] & 127).toString(2), 7);
        } else {
            C = C + c((Y[J] & 127).toString(2), 7);
            b.push(new String(parseInt(C, 2)));
            C = "";
        }
    }

    var V = a.join(".");
    return b.length > 0 && (V = V + "." + b.join(".")), V;
};

ASN1HEX.dump = function (A, L, S, Y) {
    var J = ASN1HEX;
    var C = J.getV;
    var V = J.dump;
    var W = J.getChildIdx;
    var R = A;

    if (A instanceof KJUR.asn1.ASN1Object) {
        R = A.getEncodedHex();
    }

    var B = function (G, N) {
        if (G.length <= N * 2) return G;else {
            var D = G.substr(0, N) + "..(total " + G.length / 2 + "bytes).." + G.substr(G.length - N, N);
            return D;
        }
    };

    if (L === undefined) {
        L = {
            "ommit_long_octet": 32
        };
    }

    if (S === undefined) {
        S = 0;
    }

    if (Y === undefined) {
        Y = "";
    }

    var F = L.ommit_long_octet;

    if (R.substr(S, 2) == "01") {
        var E = C(R, S);
        return E == "00" ? Y + "BOOLEAN FALSE\n" : Y + "BOOLEAN TRUE\n";
    }

    if (R.substr(S, 2) == "02") {
        var E = C(R, S);
        return Y + "INTEGER " + B(E, F) + "\n";
    }

    if (R.substr(S, 2) == "03") {
        var E = C(R, S);
        return Y + "BITSTRING " + B(E, F) + "\n";
    }

    if (R.substr(S, 2) == "04") {
        var E = C(R, S);

        if (J.isASN1HEX(E)) {
            var s = Y + "OCTETSTRING, encapsulates\n";
            return s = s + V(E, L, 0, Y + "  "), s;
        } else return Y + "OCTETSTRING " + B(E, F) + "\n";
    }

    if (R.substr(S, 2) == "05") return Y + "NULL\n";

    if (R.substr(S, 2) == "06") {
        var I = C(R, S);
        var K = KJUR.asn1.ASN1Util.oidHexToInt(I);
        var T = KJUR.asn1.x509.OID.oid2name(K);
        var i = K.replace(/\./g, " ");
        return T != "" ? Y + "ObjectIdentifier " + T + " (" + i + ")\n" : Y + "ObjectIdentifier (" + i + ")\n";
    }

    if (R.substr(S, 2) == "0c") return Y + "UTF8String '" + hextoutf8(C(R, S)) + "'\n";
    if (R.substr(S, 2) == "13") return Y + "PrintableString '" + hextoutf8(C(R, S)) + "'\n";
    if (R.substr(S, 2) == "14") return Y + "TeletexString '" + hextoutf8(C(R, S)) + "'\n";
    if (R.substr(S, 2) == "16") return Y + "IA5String '" + hextoutf8(C(R, S)) + "'\n";
    if (R.substr(S, 2) == "17") return Y + "UTCTime " + hextoutf8(C(R, S)) + "\n";
    if (R.substr(S, 2) == "18") return Y + "GeneralizedTime " + hextoutf8(C(R, S)) + "\n";

    if (R.substr(S, 2) == "30") {
        if (R.substr(S, 4) == "3000") return Y + "SEQUENCE {}\n";
        var s = Y + "SEQUENCE\n";
        var Z = W(R, S);
        var M = L;

        if ((Z.length == 2 || Z.length == 3) && R.substr(Z[0], 2) == "06" && R.substr(Z[Z.length - 1], 2) == "04") {
            var T = J.oidname(C(R, Z[0]));
            var U = JSON.parse(JSON.stringify(L));
            U.x509ExtName = T;
            M = U;
        }

        for (var H = 0; H < Z.length; H++) {
            s = s + V(R, M, Z[H], Y + "  ");
        }

        return s;
    }

    if (R.substr(S, 2) == "31") {
        var s = Y + "SET\n";
        var Z = W(R, S);

        for (var H = 0; H < Z.length; H++) {
            s = s + V(R, L, Z[H], Y + "  ");
        }

        return s;
    }

    var O = parseInt(R.substr(S, 2), 16);

    if ((O & 128) != 0) {
        var X = O & 31;

        if ((O & 32) != 0) {
            var s = Y + "[" + X + "]\n";
            var Z = W(R, S);

            for (var H = 0; H < Z.length; H++) {
                s = s + V(R, L, Z[H], Y + "  ");
            }

            return s;
        } else {
            var E = C(R, S);

            if (E.substr(0, 8) == "68747470") {
                E = hextoutf8(E);
            }

            if (L.x509ExtName === "subjectAltName" && X == 2) {
                E = hextoutf8(E);
            }

            var s = Y + "[" + X + "] " + E + "\n";
            return s;
        }
    }

    return Y + "UNKNOWN(" + R.substr(S, 2) + ") " + C(R, S) + "\n";
};

ASN1HEX.isASN1HEX = function (p) {
    var n = ASN1HEX;
    if (p.length % 2 == 1) return ![];
    var A = n.getVblen(p, 0);
    var L = p.substr(0, 2);
    var g = n.getL(p, 0);
    var S = p.length - L.length - g.length;
    if (S == A * 2) return !![];
    return ![];
};

ASN1HEX.checkStrictDER = function (A, L, S, Y, J) {
    var C = ASN1HEX;

    if (S === undefined) {
        if (typeof A != "string") throw new Error("not hex string");
        A = A.toLowerCase();
        if (!KJUR.lang.String.isHex(A)) throw new Error("not hex string");
        S = A.length;
        Y = A.length / 2;
        Y < 128 ? J = 1 : J = Math.ceil(Y.toString(16)) + 1;
    }

    var V = C.getL(A, L);
    if (V.length > J * 2) throw new Error("L of TLV too long: idx=" + L);
    var W = C.getVblen(A, L);
    if (W > Y) throw new Error("value of L too long than hex: idx=" + L);
    var R = C.getTLV(A, L);
    var B = R.length - 2 - C.getL(A, L).length;
    if (B !== W * 2) throw new Error("V string length and L's value not the same:" + B + "/" + W * 2);

    if (L === 0) {
        if (A.length != R.length) throw new Error("total length and TLV length unmatch:" + A.length + "!=" + R.length);
    }

    var F = A.substr(L, 2);

    if (F === "02") {
        var E = C.getVidx(A, L);
        if (A.substr(E, 2) == "00" && A.charCodeAt(E + 2) < 56) throw new Error("not least zeros for DER INTEGER");
    }

    if (parseInt(F, 16) & 32) {
        var I = C.getVblen(A, L);
        var K = 0;
        var T = C.getChildIdx(A, L);

        for (var i = 0; i < T.length; i++) {
            var Z = C.getTLV(A, T[i]);
            K += Z.length;
            C.checkStrictDER(A, T[i], S, Y, J);
        }

        if (I * 2 != K) throw new Error("sum of children's TLV length and L unmatch: " + I * 2 + "!=" + K);
    }
};

ASN1HEX.oidname = function (p) {
    var n = KJUR.asn1;

    if (KJUR.lang.String.isHex(p)) {
        p = n.ASN1Util.oidHexToInt(p);
    }

    var A = n.x509.OID.oid2name(p);
    return A === "" && (A = p), A;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

if (typeof KJUR.asn1.x509 == "undefined" || !KJUR.asn1.x509) {
    KJUR.asn1.x509 = {};
}

KJUR.asn1.x509.Certificate = function (p) {
    KJUR.asn1.x509.Certificate.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = null;
    var S = null;
    var Y = null;
    var J = KJUR;
    var C = J.crypto;
    var V = J.asn1;
    var W = V.DERSequence;
    var l = V.DERBitString;

    this.sign = function () {
        this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
        var R = new KJUR.crypto.Signature({
            "alg": this.asn1SignatureAlg.nameAlg
        });
        R.init(this.prvKey);
        R.updateHex(this.asn1TBSCert.getEncodedHex());
        this.hexSig = R.sign();
        this.asn1Sig = new l({
            "hex": "00" + this.hexSig
        });
        var B = new W({
            "array": [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = B.getEncodedHex();
        this.isModified = ![];
    };

    this.setSignatureHex = function (R) {
        this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
        this.hexSig = R;
        this.asn1Sig = new l({
            "hex": "00" + this.hexSig
        });
        var B = new W({
            "array": [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = B.getEncodedHex();
        this.isModified = ![];
    };

    this.getEncodedHex = function () {
        if (this.isModified == ![] && this.hTLV != null) return this.hTLV;
        throw "not signed yet";
    };

    this.getPEMString = function () {
        var R = hextob64nl(this.getEncodedHex());
        return "-----BEGIN CERTIFICATE-----\r\n" + R + "\r\n-----END CERTIFICATE-----\r\n";
    };

    p !== undefined && (p.tbscertobj !== undefined && (this.asn1TBSCert = p.tbscertobj), p.prvkeyobj !== undefined && (this.prvKey = p.prvkeyobj));
};

YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.TBSCertificate = function (p) {
    KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.DERInteger;
    var Y = A.DERTaggedObject;
    var J = A.x509;
    var C = J.Time;
    var V = J.X500Name;
    var W = J.SubjectPublicKeyInfo;

    this._initialize = function () {
        this.asn1Array = new Array();
        this.asn1Version = new Y({
            "obj": new S({
                "int": 2
            })
        });
        this.asn1SerialNumber = null;
        this.asn1SignatureAlg = null;
        this.asn1Issuer = null;
        this.asn1NotBefore = null;
        this.asn1NotAfter = null;
        this.asn1Subject = null;
        this.asn1SubjPKey = null;
        this.extensionsArray = new Array();
    };

    this.setSerialNumberByParam = function (l) {
        this.asn1SerialNumber = new S(l);
    };

    this.setSignatureAlgByParam = function (l) {
        this.asn1SignatureAlg = new J.AlgorithmIdentifier(l);
    };

    this.setIssuerByParam = function (l) {
        this.asn1Issuer = new V(l);
    };

    this.setNotBeforeByParam = function (l) {
        this.asn1NotBefore = new C(l);
    };

    this.setNotAfterByParam = function (l) {
        this.asn1NotAfter = new C(l);
    };

    this.setSubjectByParam = function (l) {
        this.asn1Subject = new V(l);
    };

    this.setSubjectPublicKey = function (l) {
        this.asn1SubjPKey = new W(l);
    };

    this.setSubjectPublicKeyByGetKey = function (R) {
        var B = KEYUTIL.getKey(R);
        this.asn1SubjPKey = new W(B);
    };

    this.appendExtension = function (l) {
        this.extensionsArray.push(l);
    };

    this.appendExtensionByName = function (R, B) {
        KJUR.asn1.x509.Extension.appendByNameToArray(R, B, this.extensionsArray);
    };

    this.getEncodedHex = function () {
        if (this.asn1NotBefore == null || this.asn1NotAfter == null) throw "notBefore and/or notAfter not set";
        var R = new L({
            "array": [this.asn1NotBefore, this.asn1NotAfter]
        });
        this.asn1Array = new Array();
        this.asn1Array.push(this.asn1Version);
        this.asn1Array.push(this.asn1SerialNumber);
        this.asn1Array.push(this.asn1SignatureAlg);
        this.asn1Array.push(this.asn1Issuer);
        this.asn1Array.push(R);
        this.asn1Array.push(this.asn1Subject);
        this.asn1Array.push(this.asn1SubjPKey);

        if (this.extensionsArray.length > 0) {
            var B = new L({
                "array": this.extensionsArray
            });
            var F = new Y({
                "explicit": !![],
                "tag": "a3",
                "obj": B
            });
            this.asn1Array.push(F);
        }

        var E = new L({
            "array": this.asn1Array
        });
        return this.hTLV = E.getEncodedHex(), this.isModified = ![], this.hTLV;
    };

    this._initialize();
};

YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.Extension = function (p) {
    KJUR.asn1.x509.Extension.superclass.constructor.call(this);
    var n = null;
    var A = KJUR;
    var L = A.asn1;
    var S = L.DERObjectIdentifier;
    var Y = L.DEROctetString;
    var J = L.DERBitString;
    var C = L.DERBoolean;
    var V = L.DERSequence;

    this.getEncodedHex = function () {
        var W = new S({
            "oid": this.oid
        });
        var R = new Y({
            "hex": this.getExtnValueHex()
        });
        var B = new Array();
        B.push(W);

        if (this.critical) {
            B.push(new C());
        }

        B.push(R);
        var F = new V({
            "array": B
        });
        return F.getEncodedHex();
    };

    this.critical = ![];
    p !== undefined && p.critical !== undefined && (this.critical = p.critical);
};

YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.Extension.appendByNameToArray = function (p, n, a) {
    var A = p.toLowerCase();
    var L = KJUR.asn1.x509;

    if (A == "basicconstraints") {
        var S = new L.BasicConstraints(n);
        a.push(S);
    } else {
        if (A == "keyusage") {
            var S = new L.KeyUsage(n);
            a.push(S);
        } else {
            if (A == "crldistributionpoints") {
                var S = new L.CRLDistributionPoints(n);
                a.push(S);
            } else {
                if (A == "extkeyusage") {
                    var S = new L.ExtKeyUsage(n);
                    a.push(S);
                } else {
                    if (A == "authoritykeyidentifier") {
                        var S = new L.AuthorityKeyIdentifier(n);
                        a.push(S);
                    } else {
                        if (A == "subjectkeyidentifier") {
                            var S = new L.SubjectKeyIdentifier(n);
                            a.push(S);
                        } else {
                            if (A == "authorityinfoaccess") {
                                var S = new L.AuthorityInfoAccess(n);
                                a.push(S);
                            } else {
                                if (A == "subjectaltname") {
                                    var S = new L.SubjectAltName(n);
                                    a.push(S);
                                } else {
                                    if (A == "issueraltname") {
                                        var S = new L.IssuerAltName(n);
                                        a.push(S);
                                    } else throw "unsupported extension name: " + p;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
};

KJUR.asn1.x509.KeyUsage = function (p) {
    KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, p);
    var n = X509.KEYUSAGE_NAME;

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "2.5.29.15";

    if (p !== undefined) {
        if (p.bin !== undefined) {
            this.asn1ExtnValue = new KJUR.asn1.DERBitString(p);
        }

        if (p.names !== undefined && p.names.length !== undefined) {
            var A = p.names;
            var L = "000000000";

            for (var g = 0; g < A.length; g++) {
                for (var S = 0; S < n.length; S++) {
                    if (A[g] === n[S]) {
                        L = L.substring(0, S) + "1" + L.substring(S + 1, L.length);
                    }
                }
            }

            this.asn1ExtnValue = new KJUR.asn1.DERBitString({
                "bin": L
            });
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.BasicConstraints = function (p) {
    KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, p);
    var n = ![];
    var A = -1;

    this.getExtnValueHex = function () {
        var L = new Array();

        if (this.cA) {
            L.push(new KJUR.asn1.DERBoolean());
        }

        if (this.pathLen > -1) {
            L.push(new KJUR.asn1.DERInteger({
                "int": this.pathLen
            }));
        }

        var g = new KJUR.asn1.DERSequence({
            "array": L
        });
        return this.asn1ExtnValue = g, this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "2.5.29.19";
    this.cA = ![];
    this.pathLen = -1;
    p !== undefined && (p.cA !== undefined && (this.cA = p.cA), p.pathLen !== undefined && (this.pathLen = p.pathLen));
};

YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.CRLDistributionPoints = function (p) {
    KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, p);
    var n = KJUR;
    var A = n.asn1;
    var L = A.x509;

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.setByDPArray = function (g) {
        this.asn1ExtnValue = new A.DERSequence({
            "array": g
        });
    };

    this.setByOneURI = function (S) {
        var Y = new L.GeneralNames([{
            "uri": S
        }]);
        var J = new L.DistributionPointName(Y);
        var C = new L.DistributionPoint({
            "dpobj": J
        });
        this.setByDPArray([C]);
    };

    this.oid = "2.5.29.31";
    p !== undefined && (p.array !== undefined ? this.setByDPArray(p.array) : p.uri !== undefined && this.setByOneURI(p.uri));
};

YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.ExtKeyUsage = function (p) {
    KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, p);
    var n = KJUR;
    var A = n.asn1;

    this.setPurposeArray = function (L) {
        this.asn1ExtnValue = new A.DERSequence();

        for (var g = 0; g < L.length; g++) {
            var S = new A.DERObjectIdentifier(L[g]);
            this.asn1ExtnValue.appendASN1Object(S);
        }
    };

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "2.5.29.37";
    p !== undefined && p.array !== undefined && this.setPurposeArray(p.array);
};

YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.AuthorityKeyIdentifier = function (p) {
    KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, p);
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERTaggedObject;
    var g = A.x509.GeneralNames;
    var S = n.crypto.Util.isKey;
    this.asn1KID = null;
    this.asn1CertIssuer = null;
    this.asn1CertSN = null;

    this.getExtnValueHex = function () {
        var Y = new Array();

        if (this.asn1KID) {
            Y.push(new L({
                "explicit": ![],
                "tag": "80",
                "obj": this.asn1KID
            }));
        }

        if (this.asn1CertIssuer) {
            Y.push(new L({
                "explicit": ![],
                "tag": "a1",
                "obj": new g([{
                    "dn": this.asn1CertIssuer
                }])
            }));
        }

        if (this.asn1CertSN) {
            Y.push(new L({
                "explicit": ![],
                "tag": "82",
                "obj": this.asn1CertSN
            }));
        }

        var J = new A.DERSequence({
            "array": Y
        });
        return this.asn1ExtnValue = J, this.asn1ExtnValue.getEncodedHex();
    };

    this.setKIDByParam = function (Y) {
        if (Y.str !== undefined || Y.hex !== undefined) this.asn1KID = new KJUR.asn1.DEROctetString(Y);else {
            if (typeof Y === "object" && KJUR.crypto.Util.isKey(Y) || typeof Y === "string" && Y.indexOf("BEGIN ") != -1) {
                var J = Y;

                if (typeof Y === "string") {
                    J = KEYUTIL.getKey(Y);
                }

                var C = KEYUTIL.getKeyID(J);
                this.asn1KID = new KJUR.asn1.DEROctetString({
                    "hex": C
                });
            }
        }
    };

    this.setCertIssuerByParam = function (Y) {
        if (Y.str !== undefined || Y.ldapstr !== undefined || Y.hex !== undefined || Y.certsubject !== undefined || Y.certissuer !== undefined) {
            this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(Y);
        } else {
            if (typeof Y === "string" && Y.indexOf("BEGIN ") != -1 && Y.indexOf("CERTIFICATE") != -1) {
                this.asn1CertIssuer = new KJUR.asn1.x509.X500Name({
                    "certissuer": Y
                });
            }
        }
    };

    this.setCertSNByParam = function (Y) {
        if (Y.str !== undefined || Y.bigint !== undefined || Y.hex !== undefined) this.asn1CertSN = new KJUR.asn1.DERInteger(Y);else {
            if (typeof Y === "string" && Y.indexOf("BEGIN ") != -1 && Y.indexOf("CERTIFICATE")) {
                var J = new X509();
                J.readCertPEM(Y);
                var C = J.getSerialNumberHex();
                this.asn1CertSN = new KJUR.asn1.DERInteger({
                    "hex": C
                });
            }
        }
    };

    this.oid = "2.5.29.35";
    p !== undefined && (p.kid !== undefined && this.setKIDByParam(p.kid), p.issuer !== undefined && this.setCertIssuerByParam(p.issuer), p.sn !== undefined && this.setCertSNByParam(p.sn), p.issuersn !== undefined && typeof p.issuersn === "string" && p.issuersn.indexOf("BEGIN ") != -1 && p.issuersn.indexOf("CERTIFICATE") && (this.setCertSNByParam(p.issuersn), this.setCertIssuerByParam(p.issuersn)));
};

YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.SubjectKeyIdentifier = function (p) {
    KJUR.asn1.x509.SubjectKeyIdentifier.superclass.constructor.call(this, p);
    var n = KJUR;
    var A = n.asn1;
    var L = A.DEROctetString;
    this.asn1KID = null;

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue = this.asn1KID, this.asn1ExtnValue.getEncodedHex();
    };

    this.setKIDByParam = function (S) {
        if (S.str !== undefined || S.hex !== undefined) this.asn1KID = new L(S);else {
            if (typeof S === "object" && KJUR.crypto.Util.isKey(S) || typeof S === "string" && S.indexOf("BEGIN") != -1) {
                var Y = S;

                if (typeof S === "string") {
                    Y = KEYUTIL.getKey(S);
                }

                var J = KEYUTIL.getKeyID(Y);
                this.asn1KID = new KJUR.asn1.DEROctetString({
                    "hex": J
                });
            }
        }
    };

    this.oid = "2.5.29.14";
    p !== undefined && p.kid !== undefined && this.setKIDByParam(p.kid);
};

YAHOO.lang.extend(KJUR.asn1.x509.SubjectKeyIdentifier, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.AuthorityInfoAccess = function (p) {
    KJUR.asn1.x509.AuthorityInfoAccess.superclass.constructor.call(this, p);

    this.setAccessDescriptionArray = function (n) {
        var A = new Array();
        var L = KJUR;
        var S = L.asn1;
        var Y = S.DERSequence;

        for (var J = 0; J < n.length; J++) {
            var C = new S.DERObjectIdentifier(n[J].accessMethod);
            var V = new S.x509.GeneralName(n[J].accessLocation);
            var W = new Y({
                "array": [C, V]
            });
            A.push(W);
        }

        this.asn1ExtnValue = new Y({
            "array": A
        });
    };

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "1.3.6.1.5.5.7.1.1";
    p !== undefined && p.array !== undefined && this.setAccessDescriptionArray(p.array);
};

YAHOO.lang.extend(KJUR.asn1.x509.AuthorityInfoAccess, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.SubjectAltName = function (p) {
    KJUR.asn1.x509.SubjectAltName.superclass.constructor.call(this, p);

    this.setNameArray = function (n) {
        this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(n);
    };

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "2.5.29.17";
    p !== undefined && p.array !== undefined && this.setNameArray(p.array);
};

YAHOO.lang.extend(KJUR.asn1.x509.SubjectAltName, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.IssuerAltName = function (p) {
    KJUR.asn1.x509.IssuerAltName.superclass.constructor.call(this, p);

    this.setNameArray = function (n) {
        this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(n);
    };

    this.getExtnValueHex = function () {
        return this.asn1ExtnValue.getEncodedHex();
    };

    this.oid = "2.5.29.18";
    p !== undefined && p.array !== undefined && this.setNameArray(p.array);
};

YAHOO.lang.extend(KJUR.asn1.x509.IssuerAltName, KJUR.asn1.x509.Extension);

KJUR.asn1.x509.CRL = function (p) {
    KJUR.asn1.x509.CRL.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = null;
    var g = null;
    var S = null;

    this.sign = function () {
        this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg;
        sig = new KJUR.crypto.Signature({
            "alg": this.asn1SignatureAlg.nameAlg,
            "prov": "cryptojs/jsrsa"
        });
        sig.init(this.prvKey);
        sig.updateHex(this.asn1TBSCertList.getEncodedHex());
        this.hexSig = sig.sign();
        this.asn1Sig = new KJUR.asn1.DERBitString({
            "hex": "00" + this.hexSig
        });
        var Y = new KJUR.asn1.DERSequence({
            "array": [this.asn1TBSCertList, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = Y.getEncodedHex();
        this.isModified = ![];
    };

    this.getEncodedHex = function () {
        if (this.isModified == ![] && this.hTLV != null) return this.hTLV;
        throw "not signed yet";
    };

    this.getPEMString = function () {
        var Y = hextob64nl(this.getEncodedHex());
        return "-----BEGIN X509 CRL-----\r\n" + Y + "\r\n-----END X509 CRL-----\r\n";
    };

    p !== undefined && (p.tbsobj !== undefined && (this.asn1TBSCertList = p.tbsobj), p.prvkeyobj !== undefined && (this.prvKey = p.prvkeyobj));
};

YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.TBSCertList = function (p) {
    KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);
    var n = null;
    var A = KJUR;
    var L = A.asn1;
    var S = L.DERSequence;
    var Y = L.x509;
    var J = Y.Time;

    this.setSignatureAlgByParam = function (C) {
        this.asn1SignatureAlg = new Y.AlgorithmIdentifier(C);
    };

    this.setIssuerByParam = function (C) {
        this.asn1Issuer = new Y.X500Name(C);
    };

    this.setThisUpdateByParam = function (C) {
        this.asn1ThisUpdate = new J(C);
    };

    this.setNextUpdateByParam = function (C) {
        this.asn1NextUpdate = new J(C);
    };

    this.addRevokedCert = function (C, V) {
        var W = {};

        if (C != undefined && C != null) {
            W.sn = C;
        }

        if (V != undefined && V != null) {
            W.time = V;
        }

        var l = new Y.CRLEntry(W);
        this.aRevokedCert.push(l);
    };

    this.getEncodedHex = function () {
        this.asn1Array = new Array();

        if (this.asn1Version != null) {
            this.asn1Array.push(this.asn1Version);
        }

        this.asn1Array.push(this.asn1SignatureAlg);
        this.asn1Array.push(this.asn1Issuer);
        this.asn1Array.push(this.asn1ThisUpdate);

        if (this.asn1NextUpdate != null) {
            this.asn1Array.push(this.asn1NextUpdate);
        }

        if (this.aRevokedCert.length > 0) {
            var C = new S({
                "array": this.aRevokedCert
            });
            this.asn1Array.push(C);
        }

        var V = new S({
            "array": this.asn1Array
        });
        return this.hTLV = V.getEncodedHex(), this.isModified = ![], this.hTLV;
    };

    this._initialize = function () {
        this.asn1Version = null;
        this.asn1SignatureAlg = null;
        this.asn1Issuer = null;
        this.asn1ThisUpdate = null;
        this.asn1NextUpdate = null;
        this.aRevokedCert = new Array();
    };

    this._initialize();
};

YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.CRLEntry = function (p) {
    KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = KJUR;
    var g = L.asn1;

    this.setCertSerial = function (S) {
        this.sn = new g.DERInteger(S);
    };

    this.setRevocationDate = function (S) {
        this.time = new g.x509.Time(S);
    };

    this.getEncodedHex = function () {
        var S = new g.DERSequence({
            "array": [this.sn, this.time]
        });
        return this.TLV = S.getEncodedHex(), this.TLV;
    };

    p !== undefined && (p.time !== undefined && this.setRevocationDate(p.time), p.sn !== undefined && this.setCertSerial(p.sn));
};

YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.X500Name = function (p) {
    KJUR.asn1.x509.X500Name.superclass.constructor.call(this);
    this.asn1Array = new Array();
    var n = KJUR;
    var A = n.asn1;
    var L = A.x509;
    var g = pemtohex;

    this.setByString = function (Y) {
        var J = Y.split("/");
        J.shift();
        var C = [];

        for (var V = 0; V < J.length; V++) {
            if (J[V].match(/^[^=]+=.+$/)) C.push(J[V]);else {
                var W = C.length - 1;
                C[W] = C[W] + "/" + J[V];
            }
        }

        for (var V = 0; V < C.length; V++) {
            this.asn1Array.push(new L.RDN({
                "str": C[V]
            }));
        }
    };

    this.setByLdapString = function (Y) {
        var J = L.X500Name.ldapToCompat(Y);
        this.setByString(J);
    };

    this.setByObject = function (Y) {
        for (var J in Y) {
            if (Y.hasOwnProperty(J)) {
                var C = new KJUR.asn1.x509.RDN({
                    "str": J + "=" + Y[J]
                });

                if (this.asn1Array) {
                    this.asn1Array.push(C);
                } else {
                    this.asn1Array = [C];
                }
            }
        }
    };

    this.getEncodedHex = function () {
        if (typeof this.hTLV == "string") return this.hTLV;
        var Y = new A.DERSequence({
            "array": this.asn1Array
        });
        return this.hTLV = Y.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (p.str !== undefined) this.setByString(p.str);else {
            if (p.ldapstr !== undefined) this.setByLdapString(p.ldapstr);else {
                if (p.hex !== undefined) this.hTLV = p.hex;else {
                    if (p.certissuer !== undefined) {
                        var S = new X509();
                        S.readCertPEM(p.certissuer);
                        this.hTLV = S.getIssuerHex();
                    } else {
                        if (p.certsubject !== undefined) {
                            var S = new X509();
                            S.readCertPEM(p.certsubject);
                            this.hTLV = S.getSubjectHex();
                        } else if (typeof p === "object" && p.certsubject === undefined && p.certissuer === undefined) {
                            this.setByObject(p);
                        }
                    }
                }
            }
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.X500Name.compatToLDAP = function (p) {
    if (p.substr(0, 1) !== "/") throw "malformed input";
    var n = "";
    p = p.substr(1);
    var a = p.split("/");
    return a.reverse(), a = a.map(function (A) {
        return A.replace(/,/, "\\,");
    }), a.join(",");
};

KJUR.asn1.x509.X500Name.onelineToLDAP = function (p) {
    return KJUR.asn1.x509.X500Name.compatToLDAP(p);
};

KJUR.asn1.x509.X500Name.ldapToCompat = function (p) {
    var n = p.split(",");
    var a = ![];
    var A = [];

    for (var L = 0; n.length > 0; L++) {
        var S = n.shift();

        if (a === !![]) {
            var Y = A.pop();
            var J = (Y + "," + S).replace(/\\,/g, ",");
            A.push(J);
            a = ![];
        } else A.push(S);

        if (S.substr(-1, 1) === "\\") {
            a = !![];
        }
    }

    return A = A.map(function (C) {
        return C.replace("/", "\\/");
    }), A.reverse(), "/" + A.join("/");
};

KJUR.asn1.x509.X500Name.ldapToOneline = function (p) {
    return KJUR.asn1.x509.X500Name.ldapToCompat(p);
};

KJUR.asn1.x509.RDN = function (p) {
    KJUR.asn1.x509.RDN.superclass.constructor.call(this);
    this.asn1Array = new Array();

    this.addByString = function (n) {
        this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({
            "str": n
        }));
    };

    this.addByMultiValuedString = function (n) {
        var A = KJUR.asn1.x509.RDN.parseString(n);

        for (var L = 0; L < A.length; L++) {
            this.addByString(A[L]);
        }
    };

    this.getEncodedHex = function () {
        var n = new KJUR.asn1.DERSet({
            "array": this.asn1Array
        });
        return this.TLV = n.getEncodedHex(), this.TLV;
    };

    p !== undefined && p.str !== undefined && this.addByMultiValuedString(p.str);
};

YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.RDN.parseString = function (p) {
    var n = p.split(/\+/);
    var a = ![];
    var A = [];

    for (var L = 0; n.length > 0; L++) {
        var S = n.shift();

        if (a === !![]) {
            var Y = A.pop();
            var J = (Y + "+" + S).replace(/\\\+/g, "+");
            A.push(J);
            a = ![];
        } else A.push(S);

        if (S.substr(-1, 1) === "\\") {
            a = !![];
        }
    }

    var C = ![];
    var V = [];

    for (var L = 0; A.length > 0; L++) {
        var S = A.shift();

        if (C === !![]) {
            var W = V.pop();

            if (S.match(/"$/)) {
                var J = (W + "+" + S).replace(/^([^=]+)="(.*)"$/, "$1=$2");
                V.push(J);
                C = ![];
            } else V.push(W + "+" + S);
        } else V.push(S);

        if (S.match(/^[^=]+="/)) {
            C = !![];
        }
    }

    return V;
};

KJUR.asn1.x509.AttributeTypeAndValue = function (p) {
    KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = "utf8";
    var g = KJUR;
    var S = g.asn1;

    this.setByString = function (Y) {
        var J = Y.match(/^([^=]+)=(.+)$/);
        if (J) this.setByAttrTypeAndValueStr(J[1], J[2]);else throw "malformed attrTypeAndValueStr: " + Y;
    };

    this.setByAttrTypeAndValueStr = function (Y, J) {
        this.typeObj = KJUR.asn1.x509.OID.atype2obj(Y);
        var C = L;
        Y == "C" && (C = "prn");
        this.valueObj = this.getValueObj(C, J);
    };

    this.getValueObj = function (Y, J) {
        if (Y == "utf8") return new S.DERUTF8String({
            "str": J
        });
        if (Y == "prn") return new S.DERPrintableString({
            "str": J
        });
        if (Y == "tel") return new S.DERTeletexString({
            "str": J
        });
        if (Y == "ia5") return new S.DERIA5String({
            "str": J
        });
        throw "unsupported directory string type: type=" + Y + " value=" + J;
    };

    this.getEncodedHex = function () {
        var Y = new S.DERSequence({
            "array": [this.typeObj, this.valueObj]
        });
        return this.TLV = Y.getEncodedHex(), this.TLV;
    };

    p !== undefined && p.str !== undefined && this.setByString(p.str);
};

YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.SubjectPublicKeyInfo = function (p) {
    KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);
    var A = null;
    var L = null;
    var S = KJUR;
    var Y = S.asn1;
    var J = Y.DERInteger;
    var C = Y.DERBitString;
    var V = Y.DERObjectIdentifier;
    var W = Y.DERSequence;
    var R = Y.ASN1Util.newObject;
    var B = Y.x509;
    var F = B.AlgorithmIdentifier;
    var E = S.crypto;
    var s = E.ECDSA;
    var I = E.DSA;

    this.getASN1Object = function () {
        if (this.asn1AlgId == null || this.asn1SubjPKey == null) throw "algId and/or subjPubKey not set";
        var K = new W({
            "array": [this.asn1AlgId, this.asn1SubjPKey]
        });
        return K;
    };

    this.getEncodedHex = function () {
        var K = this.getASN1Object();
        return this.hTLV = K.getEncodedHex(), this.hTLV;
    };

    this.setPubKey = function (K) {
        try {
            if (K instanceof RSAKey) {
                var T = R({
                    "seq": [{
                        "int": {
                            "bigint": K.n
                        }
                    }, {
                        "int": {
                            "int": K.e
                        }
                    }]
                });
                var Z = T.getEncodedHex();
                this.asn1AlgId = new F({
                    "name": "rsaEncryption"
                });
                this.asn1SubjPKey = new C({
                    "hex": "00" + Z
                });
            }
        } catch (U) {
            console.log(U);
        }

        try {
            if (K instanceof KJUR.crypto.ECDSA) {
                var w = new V({
                    "name": K.curveName
                });
                this.asn1AlgId = new F({
                    "name": "ecPublicKey",
                    "asn1params": w
                });
                this.asn1SubjPKey = new C({
                    "hex": "00" + K.pubKeyHex
                });
            }
        } catch (H) {
            console.log(H);
        }

        try {
            if (K instanceof KJUR.crypto.DSA) {
                var w = new R({
                    "seq": [{
                        "int": {
                            "bigint": K.p
                        }
                    }, {
                        "int": {
                            "bigint": K.q
                        }
                    }, {
                        "int": {
                            "bigint": K.g
                        }
                    }]
                });
                this.asn1AlgId = new F({
                    "name": "dsa",
                    "asn1params": w
                });
                var M = new J({
                    "bigint": K.y
                });
                this.asn1SubjPKey = new C({
                    "hex": "00" + M.getEncodedHex()
                });
            }
        } catch (O) {
            console.log(O);
        }
    };

    p !== undefined && this.setPubKey(p);
};

YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.Time = function (p) {
    KJUR.asn1.x509.Time.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = KJUR;
    var S = L.asn1;
    var Y = S.DERUTCTime;
    var J = S.DERGeneralizedTime;

    this.setTimeParams = function (C) {
        this.timeParams = C;
    };

    this.getEncodedHex = function () {
        var C = null;
        return this.timeParams != null ? this.type == "utc" ? C = new Y(this.timeParams) : C = new J(this.timeParams) : this.type == "utc" ? C = new Y() : C = new J(), this.TLV = C.getEncodedHex(), this.TLV;
    };

    this.type = "utc";
    p !== undefined && (p.type !== undefined ? this.type = p.type : p.str !== undefined && (p.str.match(/^[0-9]{12}Z$/) && (this.type = "utc"), p.str.match(/^[0-9]{14}Z$/) && (this.type = "gen")), this.timeParams = p);
};

YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.AlgorithmIdentifier = function (p) {
    KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);
    this.nameAlg = null;
    this.asn1Alg = null;
    this.asn1Params = null;
    this.paramEmpty = ![];
    var n = KJUR;
    var A = n.asn1;

    this.getEncodedHex = function () {
        if (this.nameAlg === null && this.asn1Alg === null) throw "algorithm not specified";

        if (this.nameAlg !== null && this.asn1Alg === null) {
            this.asn1Alg = A.x509.OID.name2obj(this.nameAlg);
        }

        var g = [this.asn1Alg];

        if (this.asn1Params !== null) {
            g.push(this.asn1Params);
        }

        var S = new A.DERSequence({
            "array": g
        });
        return this.hTLV = S.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        p.name !== undefined && (this.nameAlg = p.name);
        p.asn1params !== undefined && (this.asn1Params = p.asn1params);
        p.paramempty !== undefined && (this.paramEmpty = p.paramempty);
    }

    if (this.asn1Params === null && this.paramEmpty === ![] && this.nameAlg !== null) {
        var L = this.nameAlg.toLowerCase();

        if (L.substr(-7, 7) !== "withdsa" && L.substr(-9, 9) !== "withecdsa") {
            this.asn1Params = new A.DERNull();
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.GeneralName = function (p) {
    KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = {
        "rfc822": "81",
        "dns": "82",
        "dn": "a4",
        "uri": "86",
        "ip": "87"
    };
    var S = KJUR;
    var Y = S.asn1;
    var J = Y.DERSequence;
    var C = Y.DEROctetString;
    var V = Y.DERIA5String;
    var W = Y.DERTaggedObject;
    var R = Y.ASN1Object;
    var B = Y.x509.X500Name;
    var F = pemtohex;
    this.explicit = ![];

    this.setByParam = function (E) {
        var I = null;
        var K = null;
        if (E === undefined) return;

        if (E.rfc822 !== undefined) {
            this.type = "rfc822";
            K = new V({
                "str": E[this.type]
            });
        }

        if (E.dns !== undefined) {
            this.type = "dns";
            K = new V({
                "str": E[this.type]
            });
        }

        if (E.uri !== undefined) {
            this.type = "uri";
            K = new V({
                "str": E[this.type]
            });
        }

        if (E.dn !== undefined) {
            this.type = "dn";
            this.explicit = !![];
            typeof E.dn === "string" ? K = new B({
                "str": E.dn
            }) : E.dn instanceof KJUR.asn1.x509.X500Name ? K = E.dn : K = new B(E.dn);
        }

        if (E.ldapdn !== undefined) {
            this.type = "dn";
            this.explicit = !![];
            K = new B({
                "ldapstr": E.ldapdn
            });
        }

        if (E.certissuer !== undefined) {
            this.type = "dn";
            this.explicit = !![];
            var T = E.certissuer;
            var Z = null;

            if (T.match(/^[0-9A-Fa-f]+$/)) {
                Z == T;
            }

            if (T.indexOf("-----BEGIN ") != -1) {
                Z = F(T);
            }

            if (Z == null) throw "certissuer param not cert";
            var M = new X509();
            M.hex = Z;
            var U = M.getIssuerHex();
            K = new R();
            K.hTLV = U;
        }

        if (E.certsubj !== undefined) {
            this.type = "dn";
            this.explicit = !![];
            var T = E.certsubj;
            var Z = null;

            if (T.match(/^[0-9A-Fa-f]+$/)) {
                Z == T;
            }

            if (T.indexOf("-----BEGIN ") != -1) {
                Z = F(T);
            }

            if (Z == null) throw "certsubj param not cert";
            var M = new X509();
            M.hex = Z;
            var U = M.getSubjectHex();
            K = new R();
            K.hTLV = U;
        }

        if (E.ip !== undefined) {
            this.type = "ip";
            this.explicit = ![];
            var H = E.ip;
            var O;
            var X = "malformed IP address";

            if (H.match(/^[0-9.]+[.][0-9.]+$/)) {
                O = intarystrtohex("[" + H.split(".").join(",") + "]");
                if (O.length !== 8) throw X;
            } else {
                if (H.match(/^[0-9A-Fa-f:]+:[0-9A-Fa-f:]+$/)) O = ipv6tohex(H);else {
                    if (H.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) O = H;else throw X;
                }
            }

            K = new C({
                "hex": O
            });
        }

        if (this.type == null) throw "unsupported type in params=" + E;
        this.asn1Obj = new W({
            "explicit": this.explicit,
            "tag": L[this.type],
            "obj": K
        });
    };

    this.getEncodedHex = function () {
        return this.asn1Obj.getEncodedHex();
    };

    p !== undefined && this.setByParam(p);
};

YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.GeneralNames = function (p) {
    KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);
    var n = null;
    var A = KJUR;
    var L = A.asn1;

    this.setByParamArray = function (S) {
        for (var Y = 0; Y < S.length; Y++) {
            var J = new L.x509.GeneralName(S[Y]);
            this.asn1Array.push(J);
        }
    };

    this.getEncodedHex = function () {
        var g = new L.DERSequence({
            "array": this.asn1Array
        });
        return g.getEncodedHex();
    };

    this.asn1Array = new Array();
    typeof p != "undefined" && this.setByParamArray(p);
};

YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.DistributionPointName = function (p) {
    KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);
    var n = null;
    var A = null;
    var L = null;
    var S = null;
    var Y = KJUR;
    var J = Y.asn1;
    var C = J.DERTaggedObject;

    this.getEncodedHex = function () {
        if (this.type != "full") throw "currently type shall be 'full': " + this.type;
        return this.asn1Obj = new C({
            "explicit": ![],
            "tag": this.tag,
            "obj": this.asn1V
        }), this.hTLV = this.asn1Obj.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (J.x509.GeneralNames.prototype.isPrototypeOf(p)) {
            this.type = "full";
            this.tag = "a0";
            this.asn1V = p;
        } else throw "This class supports GeneralNames only as argument";
    }
};

YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object);

KJUR.asn1.x509.DistributionPoint = function (p) {
    KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);
    var n = null;
    var A = KJUR;
    var L = A.asn1;

    this.getEncodedHex = function () {
        var g = new L.DERSequence();

        if (this.asn1DP != null) {
            var S = new L.DERTaggedObject({
                "explicit": !![],
                "tag": "a0",
                "obj": this.asn1DP
            });
            g.appendASN1Object(S);
        }

        return this.hTLV = g.getEncodedHex(), this.hTLV;
    };

    p !== undefined && p.dpobj !== undefined && (this.asn1DP = p.dpobj);
};

YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.OID = new function (p) {
    this.atype2oidList = {
        "CN": "2.5.4.3",
        "L": "2.5.4.7",
        "ST": "2.5.4.8",
        "O": "2.5.4.10",
        "OU": "2.5.4.11",
        "C": "2.5.4.6",
        "STREET": "2.5.4.9",
        "DC": "0.9.2342.19200300.100.1.25",
        "UID": "0.9.2342.19200300.100.1.1",
        "SN": "2.5.4.4",
        "T": "2.5.4.12",
        "DN": "2.5.4.49",
        "E": "1.2.840.113549.1.9.1",
        "description": "2.5.4.13",
        "businessCategory": "2.5.4.15",
        "postalCode": "2.5.4.17",
        "serialNumber": "2.5.4.5",
        "uniqueIdentifier": "2.5.4.45",
        "organizationIdentifier": "2.5.4.97",
        "jurisdictionOfIncorporationL": "1.3.6.1.4.1.311.60.2.1.1",
        "jurisdictionOfIncorporationSP": "1.3.6.1.4.1.311.60.2.1.2",
        "jurisdictionOfIncorporationC": "1.3.6.1.4.1.311.60.2.1.3"
    };
    this.name2oidList = {
        "sha1": "1.3.14.3.2.26",
        "sha256": "2.16.840.1.101.3.4.2.1",
        "sha384": "2.16.840.1.101.3.4.2.2",
        "sha512": "2.16.840.1.101.3.4.2.3",
        "sha224": "2.16.840.1.101.3.4.2.4",
        "md5": "1.2.840.113549.2.5",
        "md2": "1.3.14.7.2.2.1",
        "ripemd160": "1.3.36.3.2.1",
        "MD2withRSA": "1.2.840.113549.1.1.2",
        "MD4withRSA": "1.2.840.113549.1.1.3",
        "MD5withRSA": "1.2.840.113549.1.1.4",
        "SHA1withRSA": "1.2.840.113549.1.1.5",
        "SHA224withRSA": "1.2.840.113549.1.1.14",
        "SHA256withRSA": "1.2.840.113549.1.1.11",
        "SHA384withRSA": "1.2.840.113549.1.1.12",
        "SHA512withRSA": "1.2.840.113549.1.1.13",
        "SHA1withECDSA": "1.2.840.10045.4.1",
        "SHA224withECDSA": "1.2.840.10045.4.3.1",
        "SHA256withECDSA": "1.2.840.10045.4.3.2",
        "SHA384withECDSA": "1.2.840.10045.4.3.3",
        "SHA512withECDSA": "1.2.840.10045.4.3.4",
        "dsa": "1.2.840.10040.4.1",
        "SHA1withDSA": "1.2.840.10040.4.3",
        "SHA224withDSA": "2.16.840.1.101.3.4.3.1",
        "SHA256withDSA": "2.16.840.1.101.3.4.3.2",
        "rsaEncryption": "1.2.840.113549.1.1.1",
        "commonName": "2.5.4.3",
        "countryName": "2.5.4.6",
        "localityName": "2.5.4.7",
        "stateOrProvinceName": "2.5.4.8",
        "streetAddress": "2.5.4.9",
        "organizationName": "2.5.4.10",
        "organizationalUnitName": "2.5.4.11",
        "domainComponent": "0.9.2342.19200300.100.1.25",
        "userId": "0.9.2342.19200300.100.1.1",
        "surname": "2.5.4.4",
        "title": "2.5.4.12",
        "distinguishedName": "2.5.4.49",
        "emailAddress": "1.2.840.113549.1.9.1",
        "description": "2.5.4.13",
        "businessCategory": "2.5.4.15",
        "postalCode": "2.5.4.17",
        "uniqueIdentifier": "2.5.4.45",
        "organizationIdentifier": "2.5.4.97",
        "jurisdictionOfIncorporationL": "1.3.6.1.4.1.311.60.2.1.1",
        "jurisdictionOfIncorporationSP": "1.3.6.1.4.1.311.60.2.1.2",
        "jurisdictionOfIncorporationC": "1.3.6.1.4.1.311.60.2.1.3",
        "subjectKeyIdentifier": "2.5.29.14",
        "keyUsage": "2.5.29.15",
        "subjectAltName": "2.5.29.17",
        "issuerAltName": "2.5.29.18",
        "basicConstraints": "2.5.29.19",
        "nameConstraints": "2.5.29.30",
        "cRLDistributionPoints": "2.5.29.31",
        "certificatePolicies": "2.5.29.32",
        "authorityKeyIdentifier": "2.5.29.35",
        "policyConstraints": "2.5.29.36",
        "extKeyUsage": "2.5.29.37",
        "authorityInfoAccess": "1.3.6.1.5.5.7.1.1",
        "ocsp": "1.3.6.1.5.5.7.48.1",
        "caIssuers": "1.3.6.1.5.5.7.48.2",
        "anyExtendedKeyUsage": "2.5.29.37.0",
        "serverAuth": "1.3.6.1.5.5.7.3.1",
        "clientAuth": "1.3.6.1.5.5.7.3.2",
        "codeSigning": "1.3.6.1.5.5.7.3.3",
        "emailProtection": "1.3.6.1.5.5.7.3.4",
        "timeStamping": "1.3.6.1.5.5.7.3.8",
        "ocspSigning": "1.3.6.1.5.5.7.3.9",
        "ecPublicKey": "1.2.840.10045.2.1",
        "secp256r1": "1.2.840.10045.3.1.7",
        "secp256k1": "1.3.132.0.10",
        "secp384r1": "1.3.132.0.34",
        "pkcs5PBES2": "1.2.840.113549.1.5.13",
        "pkcs5PBKDF2": "1.2.840.113549.1.5.12",
        "des-EDE3-CBC": "1.2.840.113549.3.7",
        "data": "1.2.840.113549.1.7.1",
        "signed-data": "1.2.840.113549.1.7.2",
        "enveloped-data": "1.2.840.113549.1.7.3",
        "digested-data": "1.2.840.113549.1.7.5",
        "encrypted-data": "1.2.840.113549.1.7.6",
        "authenticated-data": "1.2.840.113549.1.9.16.1.2",
        "tstinfo": "1.2.840.113549.1.9.16.1.4",
        "extensionRequest": "1.2.840.113549.1.9.14"
    };
    this.objCache = {};

    this.name2obj = function (n) {
        if (typeof this.objCache[n] != "undefined") return this.objCache[n];
        if (typeof this.name2oidList[n] == "undefined") throw "Name of ObjectIdentifier not defined: " + n;
        var A = this.name2oidList[n];
        var L = new KJUR.asn1.DERObjectIdentifier({
            "oid": A
        });
        return this.objCache[n] = L, L;
    };

    this.atype2obj = function (n) {
        if (typeof this.objCache[n] != "undefined") return this.objCache[n];
        if (typeof this.atype2oidList[n] == "undefined") throw "AttributeType name undefined: " + n;
        var A = this.atype2oidList[n];
        var L = new KJUR.asn1.DERObjectIdentifier({
            "oid": A
        });
        return this.objCache[n] = L, L;
    };
}();

KJUR.asn1.x509.OID.oid2name = function (p) {
    var n = KJUR.asn1.x509.OID.name2oidList;

    for (var A in n) {
        if (n[A] == p) return A;
    }

    return "";
};

KJUR.asn1.x509.OID.oid2atype = function (p) {
    var n = KJUR.asn1.x509.OID.atype2oidList;

    for (var A in n) {
        if (n[A] == p) return A;
    }

    return p;
};

KJUR.asn1.x509.OID.name2oid = function (p) {
    var n = KJUR.asn1.x509.OID.name2oidList;
    if (n[p] === undefined) return "";
    return n[p];
};

KJUR.asn1.x509.X509Util = {};

KJUR.asn1.x509.X509Util.newCertPEM = function (p) {
    var n = KJUR.asn1.x509;
    var A = n.TBSCertificate;
    var L = n.Certificate;
    var S = new A();
    if (p.serial !== undefined) S.setSerialNumberByParam(p.serial);else throw "serial number undefined.";
    if (typeof p.sigalg.name === "string") S.setSignatureAlgByParam(p.sigalg);else throw "unproper signature algorithm name";
    if (p.issuer !== undefined) S.setIssuerByParam(p.issuer);else throw "issuer name undefined.";
    if (p.notbefore !== undefined) S.setNotBeforeByParam(p.notbefore);else throw "notbefore undefined.";
    if (p.notafter !== undefined) S.setNotAfterByParam(p.notafter);else throw "notafter undefined.";
    if (p.subject !== undefined) S.setSubjectByParam(p.subject);else throw "subject name undefined.";
    if (p.sbjpubkey !== undefined) S.setSubjectPublicKeyByGetKey(p.sbjpubkey);else throw "subject public key undefined.";
    if (p.ext !== undefined && p.ext.length !== undefined) for (var Y = 0; Y < p.ext.length; Y++) {
        for (key in p.ext[Y]) {
            S.appendExtensionByName(key, p.ext[Y][key]);
        }
    }
    if (p.cakey === undefined && p.sighex === undefined) throw "param cakey and sighex undefined.";
    var J = null;
    var C = null;
    return p.cakey && (p.cakey.isPrivate === !![] ? J = p.cakey : J = KEYUTIL.getKey.apply(null, p.cakey), C = new L({
        "tbscertobj": S,
        "prvkeyobj": J
    }), C.sign()), p.sighex && (C = new L({
        "tbscertobj": S
    }), C.setSignatureHex(p.sighex)), C.getPEMString();
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

if (typeof KJUR.asn1.cms == "undefined" || !KJUR.asn1.cms) {
    KJUR.asn1.cms = {};
}

KJUR.asn1.cms.Attribute = function (p) {
    var n = [];
    var A = KJUR;
    var L = A.asn1;
    L.cms.Attribute.superclass.constructor.call(this);

    this.getEncodedHex = function () {
        var S;
        var Y;
        var J;
        S = new L.DERObjectIdentifier({
            "oid": this.attrTypeOid
        });
        Y = new L.DERSet({
            "array": this.valueList
        });

        try {
            Y.getEncodedHex();
        } catch (C) {
            console.log(C);
            throw "fail valueSet.getEncodedHex in Attribute(1)/" + C;
        }

        J = new L.DERSequence({
            "array": [S, Y]
        });

        try {
            this.hTLV = J.getEncodedHex();
        } catch (V) {
            console.log(V);
            throw "failed seq.getEncodedHex in Attribute(2)/" + V;
        }

        return this.hTLV;
    };
};

YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.ContentType = function (p) {
    var n = KJUR;
    var A = n.asn1;
    A.cms.ContentType.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.3";
    var L = null;

    if (typeof p != "undefined") {
        var L = new A.DERObjectIdentifier(p);
        this.valueList = [L];
    }
};

YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute);

KJUR.asn1.cms.MessageDigest = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DEROctetString;
    var S = A.cms;
    S.MessageDigest.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.4";

    if (p !== undefined) {
        if (p.eciObj instanceof S.EncapsulatedContentInfo && typeof p.hashAlg === "string") {
            var Y = p.eciObj.eContentValueHex;
            var J = p.hashAlg;
            var C = n.crypto.Util.hashHex(Y, J);
            var V = new L({
                "hex": C
            });
            V.getEncodedHex();
            this.valueList = [V];
        } else {
            var V = new L(p);
            V.getEncodedHex();
            this.valueList = [V];
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute);

KJUR.asn1.cms.SigningTime = function (p) {
    var n = KJUR;
    var A = n.asn1;
    A.cms.SigningTime.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.5";

    if (p !== undefined) {
        var L = new A.x509.Time(p);

        try {
            L.getEncodedHex();
        } catch (g) {
            console.log(g);
            throw "SigningTime.getEncodedHex() failed/" + g;
        }

        this.valueList = [L];
    }
};

YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute);

KJUR.asn1.cms.SigningCertificate = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var g = A.cms;
    var S = n.crypto;
    g.SigningCertificate.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.12";

    this.setCerts = function (Y) {
        var J = [];

        for (var C = 0; C < Y.length; C++) {
            var V = pemtohex(Y[C]);
            var W = n.crypto.Util.hashHex(V, "sha1");
            var R = new A.DEROctetString({
                "hex": W
            });
            R.getEncodedHex();
            var B = new g.IssuerAndSerialNumber({
                "cert": Y[C]
            });
            B.getEncodedHex();
            var F = new L({
                "array": [R, B]
            });
            F.getEncodedHex();
            J.push(F);
        }

        var E = new L({
            "array": J
        });
        E.getEncodedHex();
        this.valueList = [E];
    };

    p !== undefined && typeof p.array == "object" && this.setCerts(p.array);
};

YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute);

KJUR.asn1.cms.SigningCertificateV2 = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.x509;
    var Y = A.cms;
    var J = n.crypto;
    Y.SigningCertificateV2.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.47";

    this.setCerts = function (V, W) {
        var R = [];

        for (var B = 0; B < V.length; B++) {
            var F = pemtohex(V[B]);
            var E = [];

            if (W !== "sha256") {
                E.push(new S.AlgorithmIdentifier({
                    "name": W
                }));
            }

            var I = J.Util.hashHex(F, W);
            var K = new A.DEROctetString({
                "hex": I
            });
            K.getEncodedHex();
            E.push(K);
            var T = new Y.IssuerAndSerialNumber({
                "cert": V[B]
            });
            T.getEncodedHex();
            E.push(T);
            var i = new L({
                "array": E
            });
            i.getEncodedHex();
            R.push(i);
        }

        var Z = new L({
            "array": R
        });
        Z.getEncodedHex();
        this.valueList = [Z];
    };

    if (p !== undefined) {
        if (typeof p.array == "object") {
            var C = "sha256";
            typeof p.hashAlg == "string" && (C = p.hashAlg);
            this.setCerts(p.array, C);
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute);

KJUR.asn1.cms.IssuerAndSerialNumber = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERInteger;
    var S = A.cms;
    var Y = A.x509;
    var J = Y.X500Name;
    var C = X509;
    S.IssuerAndSerialNumber.superclass.constructor.call(this);
    var V = null;
    var W = null;

    this.setByCertPEM = function (R) {
        var B = pemtohex(R);
        var F = new C();
        F.hex = B;
        var E = F.getIssuerHex();
        this.dIssuer = new J();
        this.dIssuer.hTLV = E;
        var s = F.getSerialNumberHex();
        this.dSerial = new L({
            "hex": s
        });
    };

    this.getEncodedHex = function () {
        var l = new A.DERSequence({
            "array": [this.dIssuer, this.dSerial]
        });
        return this.hTLV = l.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p == "string" && p.indexOf("-----BEGIN ") != -1 && this.setByCertPEM(p), p.issuer && p.serial && (p.issuer instanceof J ? this.dIssuer = p.issuer : this.dIssuer = new J(p.issuer), p.serial instanceof L ? this.dSerial = p.serial : this.dSerial = new L(p.serial)), typeof p.cert == "string" && this.setByCertPEM(p.cert));
};

YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.AttributeList = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.cms;
    L.AttributeList.superclass.constructor.call(this);
    this.list = new Array();
    this.sortFlag = !![];

    this.add = function (g) {
        if (g instanceof L.Attribute) {
            this.list.push(g);
        }
    };

    this.length = function () {
        return this.list.length;
    };

    this.clear = function () {
        this.list = new Array();
        this.hTLV = null;
        this.hV = null;
    };

    this.getEncodedHex = function () {
        if (typeof this.hTLV == "string") return this.hTLV;
        var g = new A.DERSet({
            "array": this.list,
            "sortflag": this.sortFlag
        });
        return this.hTLV = g.getEncodedHex(), this.hTLV;
    };

    p !== undefined && typeof p.sortflag != "undefined" && p.sortflag == ![] && (this.sortFlag = ![]);
};

YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.SignerInfo = function (p) {
    var A = KJUR;
    var L = A.asn1;
    var S = L.DERTaggedObject;
    var Y = L.cms;
    var J = Y.AttributeList;
    var C = Y.ContentType;
    var V = Y.EncapsulatedContentInfo;
    var W = Y.MessageDigest;
    var R = Y.SignedData;
    var B = L.x509;
    var F = B.AlgorithmIdentifier;
    var E = A.crypto;
    var s = KEYUTIL;
    Y.SignerInfo.superclass.constructor.call(this);
    this.dCMSVersion = new L.DERInteger({
        "int": 1
    });
    this.dSignerIdentifier = null;
    this.dDigestAlgorithm = null;
    this.dSignedAttrs = new J();
    this.dSigAlg = null;
    this.dSig = null;
    this.dUnsignedAttrs = new J();

    this.setSignerIdentifier = function (I) {
        if (typeof I == "string" && I.indexOf("CERTIFICATE") != -1 && I.indexOf("BEGIN") != -1 && I.indexOf("END") != -1) {
            var K = I;
            this.dSignerIdentifier = new Y.IssuerAndSerialNumber({
                "cert": I
            });
        }
    };

    this.setForContentAndHash = function (I) {
        if (I !== undefined) {
            I.eciObj instanceof V && (this.dSignedAttrs.add(new C({
                "oid": "1.2.840.113549.1.7.1"
            })), this.dSignedAttrs.add(new W({
                "eciObj": I.eciObj,
                "hashAlg": I.hashAlg
            })));
            I.sdObj !== undefined && I.sdObj instanceof R && I.sdObj.digestAlgNameList.join(":").indexOf(I.hashAlg) == -1 && I.sdObj.digestAlgNameList.push(I.hashAlg);
            typeof I.hashAlg == "string" && (this.dDigestAlgorithm = new F({
                "name": I.hashAlg
            }));
        }
    };

    this.sign = function (I, K) {
        this.dSigAlg = new F({
            "name": K
        });
        var T = this.dSignedAttrs.getEncodedHex();
        var Z = s.getKey(I);
        var w = new E.Signature({
            "alg": K
        });
        w.init(Z);
        w.updateHex(T);
        var M = w.sign();
        this.dSig = new L.DEROctetString({
            "hex": M
        });
    };

    this.addUnsigned = function (I) {
        this.hTLV = null;
        this.dUnsignedAttrs.hTLV = null;
        this.dUnsignedAttrs.add(I);
    };

    this.getEncodedHex = function () {
        if (this.dSignedAttrs instanceof J && this.dSignedAttrs.length() == 0) throw "SignedAttrs length = 0 (empty)";
        var I = new S({
            "obj": this.dSignedAttrs,
            "tag": "a0",
            "explicit": ![]
        });
        var K = null;

        if (this.dUnsignedAttrs.length() > 0) {
            K = new S({
                "obj": this.dUnsignedAttrs,
                "tag": "a1",
                "explicit": ![]
            });
        }

        var T = [this.dCMSVersion, this.dSignerIdentifier, this.dDigestAlgorithm, I, this.dSigAlg, this.dSig];

        if (K != null) {
            T.push(K);
        }

        var Z = new L.DERSequence({
            "array": T
        });
        return this.hTLV = Z.getEncodedHex(), this.hTLV;
    };
};

YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.EncapsulatedContentInfo = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERTaggedObject;
    var S = A.DERSequence;
    var Y = A.DERObjectIdentifier;
    var J = A.DEROctetString;
    var C = A.cms;
    C.EncapsulatedContentInfo.superclass.constructor.call(this);
    this.dEContentType = new Y({
        "name": "data"
    });
    this.dEContent = null;
    this.isDetached = ![];
    this.eContentValueHex = null;

    this.setContentType = function (V) {
        if (V.match(/^[0-2][.][0-9.]+$/)) {
            this.dEContentType = new Y({
                "oid": V
            });
        } else {
            this.dEContentType = new Y({
                "name": V
            });
        }
    };

    this.setContentValue = function (V) {
        if (V !== undefined) {
            typeof V.hex == "string" ? this.eContentValueHex = V.hex : typeof V.str == "string" && (this.eContentValueHex = utf8tohex(V.str));
        }
    };

    this.setContentValueHex = function (V) {
        this.eContentValueHex = V;
    };

    this.setContentValueStr = function (V) {
        this.eContentValueHex = utf8tohex(V);
    };

    this.getEncodedHex = function () {
        if (typeof this.eContentValueHex != "string") throw "eContentValue not yet set";
        var V = new J({
            "hex": this.eContentValueHex
        });
        this.dEContent = new L({
            "obj": V,
            "tag": "a0",
            "explicit": !![]
        });
        var W = [this.dEContentType];

        if (!this.isDetached) {
            W.push(this.dEContent);
        }

        var l = new S({
            "array": W
        });
        return this.hTLV = l.getEncodedHex(), this.hTLV;
    };
};

YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.ContentInfo = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERTaggedObject;
    var g = A.DERSequence;
    var S = A.x509;
    KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);
    this.dContentType = null;
    this.dContent = null;

    this.setContentType = function (Y) {
        if (typeof Y == "string") {
            this.dContentType = S.OID.name2obj(Y);
        }
    };

    this.getEncodedHex = function () {
        var Y = new L({
            "obj": this.dContent,
            "tag": "a0",
            "explicit": !![]
        });
        var J = new g({
            "array": [this.dContentType, Y]
        });
        return this.hTLV = J.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (p.type && this.setContentType(p.type), p.obj && p.obj instanceof A.ASN1Object && (this.dContent = p.obj));
};

YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.cms.SignedData = function (p) {
    var A = KJUR;
    var L = A.asn1;
    var S = L.ASN1Object;
    var Y = L.DERInteger;
    var J = L.DERSet;
    var C = L.DERSequence;
    var V = L.DERTaggedObject;
    var W = L.cms;
    var R = W.EncapsulatedContentInfo;
    var B = W.SignerInfo;
    var F = W.ContentInfo;
    var E = L.x509;
    var s = E.AlgorithmIdentifier;
    KJUR.asn1.cms.SignedData.superclass.constructor.call(this);
    this.dCMSVersion = new Y({
        "int": 1
    });
    this.dDigestAlgs = null;
    this.digestAlgNameList = [];
    this.dEncapContentInfo = new R();
    this.dCerts = null;
    this.certificateList = [];
    this.crlList = [];
    this.signerInfoList = [new B()];

    this.addCertificatesByPEM = function (I) {
        var K = pemtohex(I);
        var T = new S();
        T.hTLV = K;
        this.certificateList.push(T);
    };

    this.getEncodedHex = function () {
        if (typeof this.hTLV == "string") return this.hTLV;

        if (this.dDigestAlgs == null) {
            var I = [];

            for (var K = 0; K < this.digestAlgNameList.length; K++) {
                var T = this.digestAlgNameList[K];
                var Z = new s({
                    "name": T
                });
                I.push(Z);
            }

            this.dDigestAlgs = new J({
                "array": I
            });
        }

        var M = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo];

        if (this.dCerts == null) {
            if (this.certificateList.length > 0) {
                var U = new J({
                    "array": this.certificateList
                });
                this.dCerts = new V({
                    "obj": U,
                    "tag": "a0",
                    "explicit": ![]
                });
            }
        }

        if (this.dCerts != null) {
            M.push(this.dCerts);
        }

        var H = new J({
            "array": this.signerInfoList
        });
        M.push(H);
        var O = new C({
            "array": M
        });
        return this.hTLV = O.getEncodedHex(), this.hTLV;
    };

    this.getContentInfo = function () {
        this.getEncodedHex();
        var I = new F({
            "type": "signed-data",
            "obj": this
        });
        return I;
    };

    this.getContentInfoEncodedHex = function () {
        var I = this.getContentInfo();
        var K = I.getEncodedHex();
        return K;
    };

    this.getPEM = function () {
        return hextopem(this.getContentInfoEncodedHex(), "CMS");
    };
};

YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.CMSUtil = new function () {}();

KJUR.asn1.cms.CMSUtil.newSignedData = function (A) {
    var L = KJUR;
    var S = L.asn1;
    var Y = S.cms;
    var J = Y.SignerInfo;
    var C = Y.SignedData;
    var V = Y.SigningTime;
    var W = Y.SigningCertificate;
    var R = Y.SigningCertificateV2;
    var B = S.cades;
    var F = B.SignaturePolicyIdentifier;
    var E = new C();
    E.dEncapContentInfo.setContentValue(A.content);

    if (typeof A.detached == "boolean") {
        E.dEncapContentInfo.isDetached = A.detached;
    }

    if (typeof A.certs == "object") for (var s = 0; s < A.certs.length; s++) {
        E.addCertificatesByPEM(A.certs[s]);
    }
    E.signerInfoList = [];

    for (var s = 0; s < A.signerInfos.length; s++) {
        var I = A.signerInfos[s];
        var K = new J();
        K.setSignerIdentifier(I.signerCert);
        K.setForContentAndHash({
            "sdObj": E,
            "eciObj": E.dEncapContentInfo,
            "hashAlg": I.hashAlg
        });

        for (attrName in I.sAttr) {
            var T = I.sAttr[attrName];

            if (attrName == "SigningTime") {
                var i = new V(T);
                K.dSignedAttrs.add(i);
            }

            if (attrName == "SigningCertificate") {
                var i = new W(T);
                K.dSignedAttrs.add(i);
            }

            if (attrName == "SigningCertificateV2") {
                var i = new R(T);
                K.dSignedAttrs.add(i);
            }

            if (attrName == "SignaturePolicyIdentifier") {
                var i = new F(T);
                K.dSignedAttrs.add(i);
            }
        }

        K.sign(I.signerPrvKey, I.sigAlg);
        E.signerInfoList.push(K);
    }

    return E;
};

KJUR.asn1.cms.CMSUtil.verifySignedData = function (L) {
    var S = KJUR;
    var Y = S.asn1;
    var J = Y.cms;
    var V = J.SignerInfo;
    var W = J.SignedData;
    var R = J.SigningTime;
    var F = J.SigningCertificate;
    var I = J.SigningCertificateV2;
    var K = Y.cades;
    var T = K.SignaturePolicyIdentifier;
    var Z = S.lang.String.isHex;
    var M = ASN1HEX;
    var U = M.getVbyList;
    var H = M.getTLVbyList;
    var O = M.getIdxbyList;
    var X = M.getChildIdx;
    var G = M.getTLV;
    var N = M.oidname;
    var Q = S.crypto.Util.hashHex;

    if (L.cms === undefined && !Z(L.cms)) {}

    var P = L.cms;

    var p0 = function (pp, pn) {
        var pc;

        for (var pa = 3; pa < 6; pa++) {
            pc = O(pp, 0, [1, 0, pa]);

            if (pc !== undefined) {
                var pA = pp.substr(pc, 2);
                pA === "a0" && (pn.certsIdx = pc);
                pA === "a1" && (pn.revinfosIdx = pc);
                pA === "31" && (pn.signerinfosIdx = pc);
            }
        }
    };

    var p1 = function (pp, pn) {
        var pc = pn.signerinfosIdx;
        if (pc === undefined) return;
        var pa = X(pp, pc);
        pn.signerInfoIdxList = pa;

        for (var pA = 0; pA < pa.length; pA++) {
            var pL = pa[pA];
            var pg = {
                "idx": pL
            };
            p2(pp, pg);
            pn.signerInfos.push(pg);
        }
    };

    var p2 = function (pp, pn) {
        var pc = pn.idx;
        pn.signerid_issuer1 = H(pp, pc, [1, 0], "30");
        pn.signerid_serial1 = U(pp, pc, [1, 1], "02");
        pn.hashalg = N(U(pp, pc, [2, 0], "06"));
        var pa = O(pp, pc, [3], "a0");
        pn.idxSignedAttrs = pa;
        p3(pp, pn, pa);
        var pA = X(pp, pc);
        var pL = pA.length;
        if (pL < 6) throw "malformed SignerInfo";
        pn.sigalg = N(U(pp, pc, [pL - 2, 0], "06"));
        pn.sigval = U(pp, pc, [pL - 1], "04");
    };

    var p3 = function (pp, pn, pc) {
        var pa = X(pp, pc);
        pn.signedAttrIdxList = pa;

        for (var pA = 0; pA < pa.length; pA++) {
            var pL = pa[pA];
            var pg = U(pp, pL, [0], "06");
            var pS;

            if (pg === "2a864886f70d010905") {
                pS = hextoutf8(U(pp, pL, [1, 0]));
                pn.saSigningTime = pS;
            } else {
                if (pg === "2a864886f70d010904") {
                    pS = U(pp, pL, [1, 0], "04");
                    pn.saMessageDigest = pS;
                }
            }
        }
    };

    var p4 = function (pp, pn) {
        if (U(pp, 0, [0], "06") !== "2a864886f70d010702") return pn;
        pn.cmsType = "signedData";
        pn.econtent = U(pp, 0, [1, 0, 2, 1, 0]);
        p0(pp, pn);
        pn.signerInfos = [];
        p1(pp, pn);
    };

    var p5 = function (pp, pn) {
        var pc = pn.parse.signerInfos;
        var pa = pc.length;
        var pA = !![];

        for (var pL = 0; pL < pa; pL++) {
            var pg = pc[pL];
            p7(pp, pn, pg, pL);
            !pg.isValid && (pA = ![]);
        }

        pn.isValid = pA;
    };

    var p6 = function (pp, pn, pc, pa) {
        var pA = pn.parse.certsIdx;
        var pL;

        if (pn.certs === undefined) {
            pL = [];
            pn.certkeys = [];
            var pg = X(pp, pA);

            for (var pS = 0; pS < pg.length; pS++) {
                var pf = G(pp, pg[pS]);
                var pY = new X509();
                pY.readCertHex(pf);
                pL[pS] = pY;
                pn.certkeys[pS] = pY.getPublicKey();
            }

            pn.certs = pL;
        } else pL = pn.certs;

        pn.cccc = pL.length;
        pn.cccci = pg.length;

        for (var pS = 0; pS < pL.length; pS++) {
            var pJ = pY.getIssuerHex();
            var pb = pY.getSerialNumberHex();

            if (pc.signerid_issuer1 === pJ && pc.signerid_serial1 === pb) {
                pc.certkey_idx = pS;
            }
        }
    };

    var p7 = function (pp, pn, pc, pa) {
        pc.verifyDetail = {};
        var pA = pc.verifyDetail;
        var pL = pn.parse.econtent;
        var pg = pc.hashalg;
        var pS = pc.saMessageDigest;
        pA.validMessageDigest = ![];

        if (Q(pL, pg) === pS) {
            pA.validMessageDigest = !![];
        }

        p6(pp, pn, pc, pa);
        pA.validSignatureValue = ![];
        var pf = pc.sigalg;
        var pY = "31" + G(pp, pc.idxSignedAttrs).substr(2);
        pc.signedattrshex = pY;
        var pJ = pn.certs[pc.certkey_idx].getPublicKey();
        var pb = new KJUR.crypto.Signature({
            "alg": pf
        });
        pb.init(pJ);
        pb.updateHex(pY);
        var pC = pb.verify(pc.sigval);
        pA.validSignatureValue_isValid = pC;
        pC === !![] && (pA.validSignatureValue = !![]);
        pc.isValid = ![];
        pA.validMessageDigest && pA.validSignatureValue && (pc.isValid = !![]);
    };

    var p8 = function () {};

    var p9 = {
        "isValid": ![],
        "parse": {}
    };
    return p4(P, p9.parse), p5(P, p9), p9;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

if (typeof KJUR.asn1.tsp == "undefined" || !KJUR.asn1.tsp) {
    KJUR.asn1.tsp = {};
}

KJUR.asn1.tsp.Accuracy = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERInteger;
    var g = A.DERSequence;
    var S = A.DERTaggedObject;
    A.tsp.Accuracy.superclass.constructor.call(this);
    this.seconds = null;
    this.millis = null;
    this.micros = null;

    this.getEncodedHex = function () {
        var Y = null;
        var J = null;
        var C = null;
        var V = [];

        if (this.seconds != null) {
            Y = new L({
                "int": this.seconds
            });
            V.push(Y);
        }

        if (this.millis != null) {
            var W = new L({
                "int": this.millis
            });
            J = new S({
                "obj": W,
                "tag": "80",
                "explicit": ![]
            });
            V.push(J);
        }

        if (this.micros != null) {
            var R = new L({
                "int": this.micros
            });
            C = new S({
                "obj": R,
                "tag": "81",
                "explicit": ![]
            });
            V.push(C);
        }

        var B = new g({
            "array": V
        });
        return this.hTLV = B.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p.seconds == "number" && (this.seconds = p.seconds), typeof p.millis == "number" && (this.millis = p.millis), typeof p.micros == "number" && (this.micros = p.micros));
};

YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.MessageImprint = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.DEROctetString;
    var Y = A.x509;
    var J = Y.AlgorithmIdentifier;
    A.tsp.MessageImprint.superclass.constructor.call(this);
    this.dHashAlg = null;
    this.dHashValue = null;

    this.getEncodedHex = function () {
        if (typeof this.hTLV == "string") return this.hTLV;
        var C = new L({
            "array": [this.dHashAlg, this.dHashValue]
        });
        return C.getEncodedHex();
    };

    p !== undefined && (typeof p.hashAlg == "string" && (this.dHashAlg = new J({
        "name": p.hashAlg
    })), typeof p.hashValue == "string" && (this.dHashValue = new S({
        "hex": p.hashValue
    })));
};

YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.TimeStampReq = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.DERInteger;
    var Y = A.DERBoolean;
    var J = A.DERObjectIdentifier;
    var C = A.tsp;
    var V = C.MessageImprint;
    C.TimeStampReq.superclass.constructor.call(this);
    this.dVersion = new S({
        "int": 1
    });
    this.dMessageImprint = null;
    this.dPolicy = null;
    this.dNonce = null;
    this.certReq = !![];

    this.setMessageImprint = function (W) {
        if (W instanceof V) {
            this.dMessageImprint = W;
            return;
        }

        if (typeof W == "object") {
            this.dMessageImprint = new V(W);
        }
    };

    this.getEncodedHex = function () {
        if (this.dMessageImprint == null) throw "messageImprint shall be specified";
        var W = [this.dVersion, this.dMessageImprint];

        if (this.dPolicy != null) {
            W.push(this.dPolicy);
        }

        if (this.dNonce != null) {
            W.push(this.dNonce);
        }

        if (this.certReq) {
            W.push(new Y());
        }

        var l = new L({
            "array": W
        });
        return this.hTLV = l.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p.mi == "object" && this.setMessageImprint(p.mi), typeof p.policy == "object" && (this.dPolicy = new J(p.policy)), typeof p.nonce == "object" && (this.dNonce = new S(p.nonce)), typeof p.certreq == "boolean" && (this.certReq = p.certreq));
};

YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.TSTInfo = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.DERInteger;
    var Y = A.DERBoolean;
    var J = A.DERGeneralizedTime;
    var C = A.DERObjectIdentifier;
    var V = A.tsp;
    var W = V.MessageImprint;
    var R = V.Accuracy;
    var B = A.x509.X500Name;
    V.TSTInfo.superclass.constructor.call(this);
    this.dVersion = new S({
        "int": 1
    });
    this.dPolicy = null;
    this.dMessageImprint = null;
    this.dSerialNumber = null;
    this.dGenTime = null;
    this.dAccuracy = null;
    this.dOrdering = null;
    this.dNonce = null;
    this.dTsa = null;

    this.getEncodedHex = function () {
        var F = [this.dVersion];
        if (this.dPolicy == null) throw "policy shall be specified.";
        F.push(this.dPolicy);
        if (this.dMessageImprint == null) throw "messageImprint shall be specified.";
        F.push(this.dMessageImprint);
        if (this.dSerialNumber == null) throw "serialNumber shall be specified.";
        F.push(this.dSerialNumber);
        if (this.dGenTime == null) throw "genTime shall be specified.";
        F.push(this.dGenTime);

        if (this.dAccuracy != null) {
            F.push(this.dAccuracy);
        }

        if (this.dOrdering != null) {
            F.push(this.dOrdering);
        }

        if (this.dNonce != null) {
            F.push(this.dNonce);
        }

        if (this.dTsa != null) {
            F.push(this.dTsa);
        }

        var E = new L({
            "array": F
        });
        return this.hTLV = E.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (typeof p.policy == "string") {
            if (!p.policy.match(/^[0-9.]+$/)) throw "policy shall be oid like 0.1.4.134";
            this.dPolicy = new C({
                "oid": p.policy
            });
        }

        p.messageImprint !== undefined && (this.dMessageImprint = new W(p.messageImprint));
        p.serialNumber !== undefined && (this.dSerialNumber = new S(p.serialNumber));
        p.genTime !== undefined && (this.dGenTime = new J(p.genTime));
        p.accuracy !== undefined && (this.dAccuracy = new R(p.accuracy));
        p.ordering !== undefined && p.ordering == !![] && (this.dOrdering = new Y());
        p.nonce !== undefined && (this.dNonce = new S(p.nonce));
        p.tsa !== undefined && (this.dTsa = new B(p.tsa));
    }
};

YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.TimeStampResp = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.ASN1Object;
    var Y = A.tsp;
    var J = Y.PKIStatusInfo;
    Y.TimeStampResp.superclass.constructor.call(this);
    this.dStatus = null;
    this.dTST = null;

    this.getEncodedHex = function () {
        if (this.dStatus == null) throw "status shall be specified";
        var C = [this.dStatus];

        if (this.dTST != null) {
            C.push(this.dTST);
        }

        var V = new L({
            "array": C
        });
        return this.hTLV = V.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p.status == "object" && (this.dStatus = new J(p.status)), p.tst !== undefined && p.tst instanceof S && (this.dTST = p.tst.getContentInfo()));
};

YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.PKIStatusInfo = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.tsp;
    var Y = S.PKIStatus;
    var J = S.PKIFreeText;
    var C = S.PKIFailureInfo;
    S.PKIStatusInfo.superclass.constructor.call(this);
    this.dStatus = null;
    this.dStatusString = null;
    this.dFailureInfo = null;

    this.getEncodedHex = function () {
        if (this.dStatus == null) throw "status shall be specified";
        var V = [this.dStatus];

        if (this.dStatusString != null) {
            V.push(this.dStatusString);
        }

        if (this.dFailureInfo != null) {
            V.push(this.dFailureInfo);
        }

        var W = new L({
            "array": V
        });
        return this.hTLV = W.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p.status == "object" && (this.dStatus = new Y(p.status)), typeof p.statstr == "object" && (this.dStatusString = new J({
        "array": p.statstr
    })), typeof p.failinfo == "object" && (this.dFailureInfo = new C(p.failinfo)));
};

YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.PKIStatus = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERInteger;
    var S = A.tsp;
    var Y = S.PKIStatus;
    S.PKIStatus.superclass.constructor.call(this);
    var J = null;

    this.getEncodedHex = function () {
        return this.hTLV = this.dStatus.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (p.name !== undefined) {
            var C = Y.valueList;
            if (C[p.name] === undefined) throw "name undefined: " + p.name;
            this.dStatus = new L({
                "int": C[p.name]
            });
        } else this.dStatus = new L(p);
    }
};

YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus.valueList = {
    "granted": 0,
    "grantedWithMods": 1,
    "rejection": 2,
    "waiting": 3,
    "revocationWarning": 4,
    "revocationNotification": 5
};

KJUR.asn1.tsp.PKIFreeText = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var g = A.DERUTF8String;
    var S = A.tsp;
    S.PKIFreeText.superclass.constructor.call(this);
    this.textList = [];

    this.getEncodedHex = function () {
        var Y = [];

        for (var J = 0; J < this.textList.length; J++) {
            Y.push(new g({
                "str": this.textList[J]
            }));
        }

        var C = new L({
            "array": Y
        });
        return this.hTLV = C.getEncodedHex(), this.hTLV;
    };

    p !== undefined && typeof p.array == "object" && (this.textList = p.array);
};

YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText, KJUR.asn1.ASN1Object);

KJUR.asn1.tsp.PKIFailureInfo = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERBitString;
    var S = A.tsp;
    var Y = S.PKIFailureInfo;
    Y.superclass.constructor.call(this);
    this.value = null;

    this.getEncodedHex = function () {
        if (this.value == null) throw "value shall be specified";
        var C = new Number(this.value).toString(2);
        var V = new L();
        return V.setByBinaryString(C), this.hTLV = V.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (typeof p.name == "string") {
            var J = Y.valueList;
            if (J[p.name] === undefined) throw "name undefined: " + p.name;
            this.value = J[p.name];
        } else if (typeof p.int == "number") {
            this.value = p.int;
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo.valueList = {
    "badAlg": 0,
    "badRequest": 2,
    "badDataFormat": 5,
    "timeNotAvailable": 14,
    "unacceptedPolicy": 15,
    "unacceptedExtension": 16,
    "addInfoNotAvailable": 17,
    "systemFailure": 25
};

KJUR.asn1.tsp.AbstractTSAAdapter = function (p) {
    this.getTSTHex = function (n, A) {
        throw "not implemented yet";
    };
};

KJUR.asn1.tsp.SimpleTSAAdapter = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.tsp;
    var g = n.crypto.Util.hashHex;
    L.SimpleTSAAdapter.superclass.constructor.call(this);
    this.params = null;
    this.serial = 0;

    this.getTSTHex = function (S, Y) {
        var J = g(S, Y);
        this.params.tstInfo.messageImprint = {
            "hashAlg": Y,
            "hashValue": J
        };
        this.params.tstInfo.serialNumber = {
            "int": this.serial++
        };
        var C = Math.floor(Math.random() * 1000000000);
        this.params.tstInfo.nonce = {
            "int": C
        };
        var V = L.TSPUtil.newTimeStampToken(this.params);
        return V.getContentInfoEncodedHex();
    };

    p !== undefined && (this.params = p);
};

YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);

KJUR.asn1.tsp.FixedTSAAdapter = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.tsp;
    var g = n.crypto.Util.hashHex;
    L.FixedTSAAdapter.superclass.constructor.call(this);
    this.params = null;

    this.getTSTHex = function (S, Y) {
        var J = g(S, Y);
        this.params.tstInfo.messageImprint = {
            "hashAlg": Y,
            "hashValue": J
        };
        var C = L.TSPUtil.newTimeStampToken(this.params);
        return C.getContentInfoEncodedHex();
    };

    p !== undefined && (this.params = p);
};

YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.TSPUtil = new function () {}();

KJUR.asn1.tsp.TSPUtil.newTimeStampToken = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.cms;
    var S = A.tsp;
    var Y = A.tsp.TSTInfo;
    var J = new L.SignedData();
    var C = new Y(p.tstInfo);
    var V = C.getEncodedHex();
    J.dEncapContentInfo.setContentValue({
        "hex": V
    });
    J.dEncapContentInfo.setContentType("tstinfo");
    if (typeof p.certs == "object") for (var W = 0; W < p.certs.length; W++) {
        J.addCertificatesByPEM(p.certs[W]);
    }
    var R = J.signerInfoList[0];
    R.setSignerIdentifier(p.signerCert);
    R.setForContentAndHash({
        "sdObj": J,
        "eciObj": J.dEncapContentInfo,
        "hashAlg": p.hashAlg
    });
    var B = new L.SigningCertificate({
        "array": [p.signerCert]
    });
    return R.dSignedAttrs.add(B), R.sign(p.signerPrvKey, p.sigAlg), J;
};

KJUR.asn1.tsp.TSPUtil.parseTimeStampReq = function (p) {
    var n = ASN1HEX;
    var A = n.getChildIdx;
    var L = n.getV;
    var S = n.getTLV;
    var Y = {};
    Y.certreq = ![];
    var J = A(p, 0);
    if (J.length < 2) throw "TimeStampReq must have at least 2 items";
    var C = S(p, J[1]);
    Y.mi = KJUR.asn1.tsp.TSPUtil.parseMessageImprint(C);

    for (var V = 2; V < J.length; V++) {
        var W = J[V];
        var R = p.substr(W, 2);

        if (R == "06") {
            var B = L(p, W);
            Y.policy = n.hextooidstr(B);
        }

        R == "02" && (Y.nonce = L(p, W));
        R == "01" && (Y.certreq = !![]);
    }

    return Y;
};

KJUR.asn1.tsp.TSPUtil.parseMessageImprint = function (p) {
    var n = ASN1HEX;
    var A = n.getChildIdx;
    var L = n.getV;
    var S = n.getIdxbyList;
    var Y = {};
    if (p.substr(0, 2) != "30") throw "head of messageImprint hex shall be '30'";
    var J = A(p, 0);
    var C = S(p, 0, [0, 0]);
    var V = L(p, C);
    var W = n.hextooidstr(V);
    var R = KJUR.asn1.x509.OID.oid2name(W);
    if (R == "") throw "hashAlg name undefined: " + W;
    var B = R;
    var F = S(p, 0, [1]);
    return Y.hashAlg = B, Y.hashValue = L(p, F), Y;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

if (typeof KJUR.asn1.cades == "undefined" || !KJUR.asn1.cades) {
    KJUR.asn1.cades = {};
}

KJUR.asn1.cades.SignaturePolicyIdentifier = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERObjectIdentifier;
    var S = A.DERSequence;
    var Y = A.cades;
    var J = Y.OtherHashAlgAndValue;
    Y.SignaturePolicyIdentifier.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.15";

    if (p !== undefined) {
        if (typeof p.oid == "string" && typeof p.hash == "object") {
            var C = new L({
                "oid": p.oid
            });
            var V = new J(p.hash);
            var W = new S({
                "array": [C, V]
            });
            this.valueList = [W];
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier, KJUR.asn1.cms.Attribute);

KJUR.asn1.cades.OtherHashAlgAndValue = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var S = A.DEROctetString;
    var Y = A.x509;
    var J = Y.AlgorithmIdentifier;
    var C = A.cades;
    var V = C.OtherHashAlgAndValue;
    V.superclass.constructor.call(this);
    this.dAlg = null;
    this.dHash = null;

    this.getEncodedHex = function () {
        var W = new L({
            "array": [this.dAlg, this.dHash]
        });
        return this.hTLV = W.getEncodedHex(), this.hTLV;
    };

    p !== undefined && typeof p.alg == "string" && typeof p.hash == "string" && (this.dAlg = new J({
        "name": p.alg
    }), this.dHash = new S({
        "hex": p.hash
    }));
};

YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue, KJUR.asn1.ASN1Object);

KJUR.asn1.cades.SignatureTimeStamp = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.ASN1Object;
    var S = A.x509;
    var Y = A.cades;
    Y.SignatureTimeStamp.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.14";
    this.tstHex = null;

    if (p !== undefined) {
        if (p.res !== undefined) {
            if (typeof p.res == "string" && p.res.match(/^[0-9A-Fa-f]+$/)) {} else {
                if (p.res instanceof L) {} else throw "res param shall be ASN1Object or hex string";
            }
        }

        if (p.tst !== undefined) {
            if (typeof p.tst == "string" && p.tst.match(/^[0-9A-Fa-f]+$/)) {
                var J = new L();
                this.tstHex = p.tst;
                J.hTLV = this.tstHex;
                J.getEncodedHex();
                this.valueList = [J];
            } else {
                if (p.tst instanceof L) {} else throw "tst param shall be ASN1Object or hex string";
            }
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp, KJUR.asn1.cms.Attribute);

KJUR.asn1.cades.CompleteCertificateRefs = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.cades;
    L.CompleteCertificateRefs.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.21";

    this.setByArray = function (S) {
        this.valueList = [];

        for (var Y = 0; Y < S.length; Y++) {
            var J = new L.OtherCertID(S[Y]);
            this.valueList.push(J);
        }
    };

    p !== undefined && typeof p == "object" && typeof p.length == "number" && this.setByArray(p);
};

YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs, KJUR.asn1.cms.Attribute);

KJUR.asn1.cades.OtherCertID = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.cms;
    var g = A.cades;
    g.OtherCertID.superclass.constructor.call(this);
    this.hasIssuerSerial = !![];
    this.dOtherCertHash = null;
    this.dIssuerSerial = null;

    this.setByCertPEM = function (S) {
        this.dOtherCertHash = new g.OtherHash(S);
        this.hasIssuerSerial && (this.dIssuerSerial = new L.IssuerAndSerialNumber(S));
    };

    this.getEncodedHex = function () {
        if (this.hTLV != null) return this.hTLV;
        if (this.dOtherCertHash == null) throw "otherCertHash not set";
        var S = [this.dOtherCertHash];

        if (this.dIssuerSerial != null) {
            S.push(this.dIssuerSerial);
        }

        var Y = new A.DERSequence({
            "array": S
        });
        return this.hTLV = Y.getEncodedHex(), this.hTLV;
    };

    p !== undefined && (typeof p == "string" && p.indexOf("-----BEGIN ") != -1 && this.setByCertPEM(p), typeof p == "object" && (p.hasis === ![] && (this.hasIssuerSerial = ![]), typeof p.cert == "string" && this.setByCertPEM(p.cert)));
};

YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID, KJUR.asn1.ASN1Object);

KJUR.asn1.cades.OtherHash = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.cms;
    var S = A.cades;
    var Y = S.OtherHashAlgAndValue;
    var J = n.crypto.Util.hashHex;
    S.OtherHash.superclass.constructor.call(this);
    this.alg = "sha256";
    this.dOtherHash = null;

    this.setByCertPEM = function (C) {
        if (C.indexOf("-----BEGIN ") == -1) throw "certPEM not to seem PEM format";
        var V = pemtohex(C);
        var W = J(V, this.alg);
        this.dOtherHash = new Y({
            "alg": this.alg,
            "hash": W
        });
    };

    this.getEncodedHex = function () {
        if (this.dOtherHash == null) throw "OtherHash not set";
        return this.dOtherHash.getEncodedHex();
    };

    if (p !== undefined) {
        if (typeof p == "string") {
            if (p.indexOf("-----BEGIN ") != -1) this.setByCertPEM(p);else {
                if (p.match(/^[0-9A-Fa-f]+$/)) this.dOtherHash = new A.DEROctetString({
                    "hex": p
                });else throw "unsupported string value for params";
            }
        } else if (typeof p == "object") {
            typeof p.cert == "string" ? (typeof p.alg == "string" && (this.alg = p.alg), this.setByCertPEM(p.cert)) : this.dOtherHash = new Y(p);
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.cades.OtherHash, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.CAdESUtil = new function () {}();

KJUR.asn1.cades.CAdESUtil.addSigTS = function (p, n, A) {};

KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned = function (L) {
    var S = ASN1HEX;
    var Y = S.getChildIdx;
    var J = S.getTLV;
    var C = S.getTLVbyList;
    var V = S.getIdxbyList;
    var W = KJUR;
    var R = W.asn1;
    var F = R.ASN1Object;
    var E = R.cms;
    var I = E.SignedData;
    var K = R.cades;
    var T = K.CAdESUtil;
    var i = {};
    if (C(L, 0, [0]) != "06092a864886f70d010702") throw "hex is not CMS SignedData";
    var Z = V(L, 0, [1, 0]);
    var M = Y(L, Z);
    if (M.length < 4) throw "num of SignedData elem shall be 4 at least";
    var U = M.shift();
    i.version = J(L, U);
    var H = M.shift();
    i.algs = J(L, H);
    var O = M.shift();
    i.encapcontent = J(L, O);
    i.certs = null;
    i.revs = null;
    i.si = [];
    var X = M.shift();

    if (L.substr(X, 2) == "a0") {
        i.certs = J(L, X);
        X = M.shift();
    }

    if (L.substr(X, 2) == "a1") {
        i.revs = J(L, X);
        X = M.shift();
    }

    var G = X;
    if (L.substr(G, 2) != "31") throw "Can't find signerInfos";
    var N = Y(L, G);

    for (var D = 0; D < N.length; D++) {
        var r = N[D];
        var Q = T.parseSignerInfoForAddingUnsigned(L, r, D);
        i.si[D] = Q;
    }

    var P = null;
    i.obj = new I();
    P = new F();
    P.hTLV = i.version;
    i.obj.dCMSVersion = P;
    P = new F();
    P.hTLV = i.algs;
    i.obj.dDigestAlgs = P;
    P = new F();
    P.hTLV = i.encapcontent;
    i.obj.dEncapContentInfo = P;
    P = new F();
    P.hTLV = i.certs;
    i.obj.dCerts = P;
    i.obj.signerInfoList = [];

    for (var D = 0; D < i.si.length; D++) {
        i.obj.signerInfoList.push(i.si[D].obj);
    }

    return i;
};

KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned = function (A, L, S) {
    var Y = ASN1HEX;
    var J = Y.getChildIdx;
    var C = Y.getTLV;
    var V = Y.getV;
    var W = KJUR;
    var R = W.asn1;
    var B = R.ASN1Object;
    var F = R.cms;
    var E = F.AttributeList;
    var I = F.SignerInfo;
    var K = {};
    var T = J(A, L);
    if (T.length != 6) throw "not supported items for SignerInfo (!=6)";
    var Z = T.shift();
    K.version = C(A, Z);
    var M = T.shift();
    K.si = C(A, M);
    var U = T.shift();
    K.digalg = C(A, U);
    var H = T.shift();
    K.sattrs = C(A, H);
    var O = T.shift();
    K.sigalg = C(A, O);
    var X = T.shift();
    K.sig = C(A, X);
    K.sigval = V(A, X);
    var G = null;
    return K.obj = new I(), G = new B(), G.hTLV = K.version, K.obj.dCMSVersion = G, G = new B(), G.hTLV = K.si, K.obj.dSignerIdentifier = G, G = new B(), G.hTLV = K.digalg, K.obj.dDigestAlgorithm = G, G = new B(), G.hTLV = K.sattrs, K.obj.dSignedAttrs = G, G = new B(), G.hTLV = K.sigalg, K.obj.dSigAlg = G, G = new B(), G.hTLV = K.sig, K.obj.dSig = G, K.obj.dUnsignedAttrs = new E(), K;
};

if (typeof KJUR.asn1.csr == "undefined" || !KJUR.asn1.csr) {
    KJUR.asn1.csr = {};
}

KJUR.asn1.csr.CertificationRequest = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERBitString;
    var S = A.DERSequence;
    var Y = A.csr;
    var J = A.x509;
    Y.CertificationRequest.superclass.constructor.call(this);
    var C = null;
    var V = null;
    var W = null;
    var R = null;
    var B = null;

    this.sign = function (F, E) {
        if (this.prvKey == null) {
            this.prvKey = E;
        }

        this.asn1SignatureAlg = new J.AlgorithmIdentifier({
            "name": F
        });
        var s = new n.crypto.Signature({
            "alg": F
        });
        s.init(this.prvKey);
        s.updateHex(this.asn1CSRInfo.getEncodedHex());
        this.hexSig = s.sign();
        this.asn1Sig = new L({
            "hex": "00" + this.hexSig
        });
        var I = new S({
            "array": [this.asn1CSRInfo, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = I.getEncodedHex();
        this.isModified = ![];
    };

    this.getPEMString = function () {
        return hextopem(this.getEncodedHex(), "CERTIFICATE REQUEST");
    };

    this.getEncodedHex = function () {
        if (this.isModified == ![] && this.hTLV != null) return this.hTLV;
        throw "not signed yet";
    };

    p !== undefined && p.csrinfo !== undefined && (this.asn1CSRInfo = p.csrinfo);
};

YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequest, KJUR.asn1.ASN1Object);

KJUR.asn1.csr.CertificationRequestInfo = function (p) {
    var A = KJUR;
    var L = A.asn1;
    var S = L.DERInteger;
    var Y = L.DERSequence;
    var J = L.DERSet;
    var C = L.DERNull;
    var V = L.DERTaggedObject;
    var W = L.DERObjectIdentifier;
    var R = L.csr;
    var B = L.x509;
    var F = B.X500Name;
    var E = B.Extension;
    var s = KEYUTIL;
    R.CertificationRequestInfo.superclass.constructor.call(this);

    this._initialize = function () {
        this.asn1Array = new Array();
        this.asn1Version = new S({
            "int": 0
        });
        this.asn1Subject = null;
        this.asn1SubjPKey = null;
        this.extensionsArray = new Array();
    };

    this.setSubjectByParam = function (I) {
        this.asn1Subject = new F(I);
    };

    this.setSubjectPublicKeyByGetKey = function (I) {
        var K = s.getKey(I);
        this.asn1SubjPKey = new B.SubjectPublicKeyInfo(K);
    };

    this.appendExtensionByName = function (I, K) {
        E.appendByNameToArray(I, K, this.extensionsArray);
    };

    this.getEncodedHex = function () {
        this.asn1Array = new Array();
        this.asn1Array.push(this.asn1Version);
        this.asn1Array.push(this.asn1Subject);
        this.asn1Array.push(this.asn1SubjPKey);

        if (this.extensionsArray.length > 0) {
            var I = new Y({
                "array": this.extensionsArray
            });
            var K = new J({
                "array": [I]
            });
            var T = new Y({
                "array": [new W({
                    "oid": "1.2.840.113549.1.9.14"
                }), K]
            });
            var Z = new V({
                "explicit": !![],
                "tag": "a0",
                "obj": T
            });
            this.asn1Array.push(Z);
        } else {
            var Z = new V({
                "explicit": ![],
                "tag": "a0",
                "obj": new C()
            });
            this.asn1Array.push(Z);
        }

        var w = new Y({
            "array": this.asn1Array
        });
        return this.hTLV = w.getEncodedHex(), this.isModified = ![], this.hTLV;
    };

    this._initialize();
};

YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequestInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CSRUtil = new function () {}();

KJUR.asn1.csr.CSRUtil.newCSRPEM = function (p) {
    var n = KEYUTIL;
    var A = KJUR.asn1.csr;
    if (p.subject === undefined) throw "parameter subject undefined";
    if (p.sbjpubkey === undefined) throw "parameter sbjpubkey undefined";
    if (p.sigalg === undefined) throw "parameter sigalg undefined";
    if (p.sbjprvkey === undefined) throw "parameter sbjpubkey undefined";
    var L = new A.CertificationRequestInfo();
    L.setSubjectByParam(p.subject);
    L.setSubjectPublicKeyByGetKey(p.sbjpubkey);
    if (p.ext !== undefined && p.ext.length !== undefined) for (var S = 0; S < p.ext.length; S++) {
        for (key in p.ext[S]) {
            L.appendExtensionByName(key, p.ext[S][key]);
        }
    }
    var Y = new A.CertificationRequest({
        "csrinfo": L
    });
    var J = n.getKey(p.sbjprvkey);
    Y.sign(p.sigalg, J);
    var C = Y.getPEMString();
    return C;
};

KJUR.asn1.csr.CSRUtil.getInfo = function (p) {
    var n = ASN1HEX;
    var A = n.getTLVbyList;
    var L = {};
    L.subject = {};
    L.pubkey = {};
    if (p.indexOf("-----BEGIN CERTIFICATE REQUEST") == -1) throw "argument is not PEM file";
    var S = pemtohex(p, "CERTIFICATE REQUEST");

    try {
        L.subject.hex = A(S, 0, [0, 1]);
    } catch (J) {
        console.log(J);
    }

    try {
        L.subject.name = X509.hex2dn(L.subject.hex);
    } catch (C) {
        console.log(C);
    }

    L.pubkey.hex = A(S, 0, [0, 2]);
    L.pubkey.obj = KEYUTIL.getKey(L.pubkey.hex, null, "pkcs8pub");

    try {
        L.ext = [];
        var Y = new X509();
        Y.parseExt(p);
        L.ext.push({
            "subjectAltName": {
                "array": Y.getExtSubjectAltName2()
            }
        });
    } catch (V) {
        console.log(V);
    }

    return L;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {};
}

if (typeof KJUR.asn1.ocsp == "undefined" || !KJUR.asn1.ocsp) {
    KJUR.asn1.ocsp = {};
}

KJUR.asn1.ocsp.DEFAULT_HASH = "sha1";

KJUR.asn1.ocsp.CertID = function (p) {
    var A = KJUR;
    var L = A.asn1;
    var S = L.DEROctetString;
    var Y = L.DERInteger;
    var J = L.DERSequence;
    var C = L.x509;
    var V = C.AlgorithmIdentifier;
    var W = L.ocsp;
    var R = W.DEFAULT_HASH;
    var B = A.crypto;
    var F = B.Util.hashHex;
    var E = X509;
    var s = ASN1HEX;
    W.CertID.superclass.constructor.call(this);
    this.dHashAlg = null;
    this.dIssuerNameHash = null;
    this.dIssuerKeyHash = null;
    this.dSerialNumber = null;

    this.setByValue = function (T, Z, w, M) {
        M === undefined && (M = R);
        this.dHashAlg = new V({
            "name": M
        });
        this.dIssuerNameHash = new S({
            "hex": T
        });
        this.dIssuerKeyHash = new S({
            "hex": Z
        });
        this.dSerialNumber = new Y({
            "hex": w
        });
    };

    this.setByCert = function (T, Z, M) {
        if (M === undefined) {
            M = R;
        }

        var U = new E();
        U.readCertPEM(Z);
        var H = new E();
        H.readCertPEM(T);
        var O = H.getPublicKeyHex();
        var X = s.getTLVbyList(O, 0, [1, 0], "30");
        var G = U.getSerialNumberHex();
        var N = F(H.getSubjectHex(), M);
        var D = F(X, M);
        this.setByValue(N, D, G, M);
        this.hoge = U.getSerialNumberHex();
    };

    this.getEncodedHex = function () {
        if (this.dHashAlg === null && this.dIssuerNameHash === null && this.dIssuerKeyHash === null && this.dSerialNumber === null) throw "not yet set values";
        var T = [this.dHashAlg, this.dIssuerNameHash, this.dIssuerKeyHash, this.dSerialNumber];
        var Z = new J({
            "array": T
        });
        return this.hTLV = Z.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        var I = p;

        if (I.issuerCert !== undefined && I.subjectCert !== undefined) {
            var K = R;
            I.alg === undefined && (K = undefined);
            this.setByCert(I.issuerCert, I.subjectCert, K);
        } else {
            if (I.namehash !== undefined && I.keyhash !== undefined && I.serial !== undefined) {
                var K = R;
                I.alg === undefined && (K = undefined);
                this.setByValue(I.namehash, I.keyhash, I.serial, K);
            } else throw "invalid constructor arguments";
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.ocsp.CertID, KJUR.asn1.ASN1Object);

KJUR.asn1.ocsp.Request = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var g = A.ocsp;
    g.Request.superclass.constructor.call(this);
    this.dReqCert = null;
    this.dExt = null;

    this.getEncodedHex = function () {
        var Y = [];
        if (this.dReqCert === null) throw "reqCert not set";
        Y.push(this.dReqCert);
        var J = new L({
            "array": Y
        });
        return this.hTLV = J.getEncodedHex(), this.hTLV;
    };

    if (typeof p !== "undefined") {
        var S = new g.CertID(p);
        this.dReqCert = S;
    }
};

YAHOO.lang.extend(KJUR.asn1.ocsp.Request, KJUR.asn1.ASN1Object);

KJUR.asn1.ocsp.TBSRequest = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var g = A.ocsp;
    g.TBSRequest.superclass.constructor.call(this);
    this.version = 0;
    this.dRequestorName = null;
    this.dRequestList = [];
    this.dRequestExt = null;

    this.setRequestListByParam = function (S) {
        var Y = [];

        for (var J = 0; J < S.length; J++) {
            var C = new g.Request(S[0]);
            Y.push(C);
        }

        this.dRequestList = Y;
    };

    this.getEncodedHex = function () {
        var S = [];
        if (this.version !== 0) throw "not supported version: " + this.version;
        if (this.dRequestorName !== null) throw "requestorName not supported";
        var Y = new L({
            "array": this.dRequestList
        });
        S.push(Y);
        if (this.dRequestExt !== null) throw "requestExtensions not supported";
        var J = new L({
            "array": S
        });
        return this.hTLV = J.getEncodedHex(), this.hTLV;
    };

    p !== undefined && p.reqList !== undefined && this.setRequestListByParam(p.reqList);
};

YAHOO.lang.extend(KJUR.asn1.ocsp.TBSRequest, KJUR.asn1.ASN1Object);

KJUR.asn1.ocsp.OCSPRequest = function (p) {
    var n = KJUR;
    var A = n.asn1;
    var L = A.DERSequence;
    var g = A.ocsp;
    g.OCSPRequest.superclass.constructor.call(this);
    this.dTbsRequest = null;
    this.dOptionalSignature = null;

    this.getEncodedHex = function () {
        var Y = [];
        if (this.dTbsRequest !== null) Y.push(this.dTbsRequest);else throw "tbsRequest not set";
        if (this.dOptionalSignature !== null) throw "optionalSignature not supported";
        var J = new L({
            "array": Y
        });
        return this.hTLV = J.getEncodedHex(), this.hTLV;
    };

    if (p !== undefined) {
        if (p.reqList !== undefined) {
            var S = new g.TBSRequest(p);
            this.dTbsRequest = S;
        }
    }
};

YAHOO.lang.extend(KJUR.asn1.ocsp.OCSPRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPUtil = {};

KJUR.asn1.ocsp.OCSPUtil.getRequestHex = function (p, n, A) {
    var L = KJUR;
    var S = L.asn1;
    var Y = S.ocsp;

    if (A === undefined) {
        A = Y.DEFAULT_HASH;
    }

    var J = {
        "alg": A,
        "issuerCert": p,
        "subjectCert": n
    };
    var C = new Y.OCSPRequest({
        "reqList": [J]
    });
    return C.getEncodedHex();
};

KJUR.asn1.ocsp.OCSPUtil.getOCSPResponseInfo = function (p) {
    var n = ASN1HEX;
    var A = n.getVbyList;
    var L = n.getIdxbyList;
    var A = n.getVbyList;
    var S = n.getV;
    var Y = {};

    try {
        var J = A(p, 0, [0], "0a");
        Y.responseStatus = parseInt(J, 16);
    } catch (R) {
        console.log(R);
    }

    if (Y.responseStatus !== 0) return Y;

    try {
        var C = L(p, 0, [1, 0, 1, 0, 0, 2, 0, 1]);

        if (p.substr(C, 2) === "80") {
            Y.certStatus = "good";
        } else {
            if (p.substr(C, 2) === "a1") {
                Y.certStatus = "revoked";
                Y.revocationTime = hextoutf8(A(p, C, [0]));
            } else {
                if (p.substr(C, 2) === "82") {
                    Y.certStatus = "unknown";
                }
            }
        }
    } catch (B) {
        console.log(B);
    }

    try {
        var V = L(p, 0, [1, 0, 1, 0, 0, 2, 0, 2]);
        Y.thisUpdate = hextoutf8(S(p, V));
    } catch (F) {
        console.log(F);
    }

    try {
        var W = L(p, 0, [1, 0, 1, 0, 0, 2, 0, 3]);

        if (p.substr(W, 2) === "a0") {
            Y.nextUpdate = hextoutf8(A(p, W, [0]));
        }
    } catch (E) {
        console.log(E);
    }

    return Y;
};

var KJUR;

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
    KJUR.lang = {};
}

KJUR.lang.String = function () {};

function Base64x() {}

function stoBA(p) {
    var n = new Array();

    for (var a = 0; a < p.length; a++) {
        n[a] = p.charCodeAt(a);
    }

    return n;
}

function BAtos(p) {
    var n = "";

    for (var a = 0; a < p.length; a++) {
        n = n + String.fromCharCode(p[a]);
    }

    return n;
}

function BAtohex(p) {
    var n = "";

    for (var a = 0; a < p.length; a++) {
        var A = p[a].toString(16);
        A.length == 1 && (A = "0" + A);
        n = n + A;
    }

    return n;
}

function stohex(p) {
    return BAtohex(stoBA(p));
}

function stob64(p) {
    return hex2b64(stohex(p));
}

function stob64u(p) {
    return b64tob64u(hex2b64(stohex(p)));
}

function b64utos(p) {
    return BAtos(b64toBA(b64utob64(p)));
}

function b64tob64u(p) {
    return p = p.replace(/\=/g, ""), p = p.replace(/\+/g, "-"), p = p.replace(/\//g, "_"), p;
}

function b64utob64(p) {
    return p.length % 4 == 2 ? p = p + "==" : p.length % 4 == 3 && (p = p + "="), p = p.replace(/-/g, "+"), p = p.replace(/_/g, "/"), p;
}

function hextob64u(p) {
    return p.length % 2 == 1 && (p = "0" + p), b64tob64u(hex2b64(p));
}

function b64utohex(p) {
    return b64tohex(b64utob64(p));
}

var utf8tob64u;
var b64utoutf8;

if (typeof Buffer === "function") {
    utf8tob64u = function (p) {
        return b64tob64u(new Buffer(p, "utf8").toString("base64"));
    };

    b64utoutf8 = function (p) {
        return new Buffer(b64utob64(p), "base64").toString("utf8");
    };
} else {
    utf8tob64u = function (p) {
        return hextob64u(uricmptohex(encodeURIComponentAll(p)));
    };

    b64utoutf8 = function (p) {
        return decodeURIComponent(hextouricmp(b64utohex(p)));
    };
}

function utf8tob64(p) {
    return hex2b64(uricmptohex(encodeURIComponentAll(p)));
}

function b64toutf8(p) {
    return decodeURIComponent(hextouricmp(b64tohex(p)));
}

function utf8tohex(p) {
    return uricmptohex(encodeURIComponentAll(p));
}

function hextoutf8(p) {
    return decodeURIComponent(hextouricmp(p));
}

function hextorstr(p) {
    var n = "";

    for (var A = 0; A < p.length - 1; A += 2) {
        n += String.fromCharCode(parseInt(p.substr(A, 2), 16));
    }

    return n;
}

function rstrtohex(p) {
    var n = "";

    for (var A = 0; A < p.length; A++) {
        n += ("0" + p.charCodeAt(A).toString(16)).slice(-2);
    }

    return n;
}

function hextob64(p) {
    return hex2b64(p);
}

function hextob64nl(p) {
    var n = hextob64(p);
    var A = n.replace(/(.{64})/g, "$1\r\n");
    return A = A.replace(/\r\n$/, ""), A;
}

function b64nltohex(p) {
    var n = p.replace(/[^0-9A-Za-z\/+=]*/g, "");
    var A = b64tohex(n);
    return A;
}

function hextopem(p, n) {
    var A = hextob64nl(p);
    return "-----BEGIN " + n + "-----\r\n" + A + "\r\n-----END " + n + "-----\r\n";
}

function pemtohex(p, n) {
    if (p.indexOf("-----BEGIN ") == -1) throw "can't find PEM header: " + n;
    return n !== undefined ? (p = p.replace(new RegExp("^[^]*-----BEGIN " + n + "-----"), ""), p = p.replace(new RegExp("-----END " + n + "-----[^]*$"), "")) : (p = p.replace(/^[^]*-----BEGIN [^-]+-----/, ""), p = p.replace(/-----END [^-]+-----[^]*$/, "")), b64nltohex(p);
}

function hextoArrayBuffer(p) {
    if (p.length % 2 != 0) throw "input is not even length";
    if (p.match(/^[0-9A-Fa-f]+$/) == null) throw "input is not hexadecimal";
    var n = new ArrayBuffer(p.length / 2);
    var A = new DataView(n);

    for (var L = 0; L < p.length / 2; L++) {
        A.setUint8(L, parseInt(p.substr(L * 2, 2), 16));
    }

    return n;
}

function ArrayBuffertohex(p) {
    var n = "";
    var A = new DataView(p);

    for (var L = 0; L < p.byteLength; L++) {
        n += ("00" + A.getUint8(L).toString(16)).slice(-2);
    }

    return n;
}

function zulutomsec(p) {
    var A;
    var L;
    var S;
    var Y;
    var J;
    var C;
    var V;
    var W;
    var R;
    var B;
    var F;
    var E;
    E = p.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);
    if (E) return R = E[1], A = parseInt(R), R.length === 2 && (50 <= A && A < 100 ? A = 1900 + A : 0 <= A && A < 50 && (A = 2000 + A)), L = parseInt(E[2]) - 1, S = parseInt(E[3]), Y = parseInt(E[4]), J = parseInt(E[5]), C = parseInt(E[6]), V = 0, B = E[7], B !== "" && (F = (B.substr(1) + "00").substr(0, 3), V = parseInt(F)), Date.UTC(A, L, S, Y, J, C, V);
    throw "unsupported zulu format: " + p;
}

function zulutosec(p) {
    var n = zulutomsec(p);
    return ~~(n / 1000);
}

function zulutodate(p) {
    return new Date(zulutomsec(p));
}

function datetozulu(p, n, A) {
    var L;
    var S = p.getUTCFullYear();

    if (n) {
        if (S < 1950 || 2049 < S) throw "not proper year for UTCTime: " + S;
        L = ("" + S).slice(-2);
    } else L = ("000" + S).slice(-4);

    L += ("0" + (p.getUTCMonth() + 1)).slice(-2);
    L += ("0" + p.getUTCDate()).slice(-2);
    L += ("0" + p.getUTCHours()).slice(-2);
    L += ("0" + p.getUTCMinutes()).slice(-2);
    L += ("0" + p.getUTCSeconds()).slice(-2);

    if (A) {
        var Y = p.getUTCMilliseconds();

        if (Y !== 0) {
            Y = ("00" + Y).slice(-3);
            Y = Y.replace(/0+$/g, "");
            L += "." + Y;
        }
    }

    return L += "Z", L;
}

function uricmptohex(p) {
    return p.replace(/%/g, "");
}

function hextouricmp(p) {
    return p.replace(/(..)/g, "%$1");
}

function ipv6tohex(p) {
    var n = "malformed IPv6 address";
    if (!p.match(/^[0-9A-Fa-f:]+$/)) throw n;
    p = p.toLowerCase();
    var a = p.split(":").length - 1;
    if (a < 2) throw n;
    var A = ":".repeat(7 - a + 2);
    p = p.replace("::", A);
    var L = p.split(":");
    if (L.length != 8) throw n;

    for (var S = 0; S < 8; S++) {
        L[S] = ("0000" + L[S]).slice(-4);
    }

    return L.join("");
}

function hextoipv6(p) {
    if (!p.match(/^[0-9A-Fa-f]{32}$/)) throw "malformed IPv6 address octet";
    p = p.toLowerCase();
    var n = p.match(/.{1,4}/g);

    for (var a = 0; a < 8; a++) {
        n[a] = n[a].replace(/^0+/, "");
        n[a] == "" && (n[a] = "0");
    }

    p = ":" + n.join(":") + ":";
    var A = p.match(/:(0:){2,}/g);
    if (A === null) return p.slice(1, -1);
    var L = "";

    for (var a = 0; a < A.length; a++) {
        if (A[a].length > L.length) {
            L = A[a];
        }
    }

    return p = p.replace(L, "::"), p.slice(1, -1);
}

function hextoip(p) {
    var n = "malformed hex value";
    if (!p.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) throw n;

    if (p.length == 8) {
        var A;

        try {
            return A = parseInt(p.substr(0, 2), 16) + "." + parseInt(p.substr(2, 2), 16) + "." + parseInt(p.substr(4, 2), 16) + "." + parseInt(p.substr(6, 2), 16), A;
        } catch (L) {
            console.log(L);
            throw n;
        }
    } else return p.length == 32 ? hextoipv6(p) : p;
}

function iptohex(p) {
    var n = "malformed IP address";
    p = p.toLowerCase(p);

    if (p.match(/^[0-9.]+$/)) {
        var a = p.split(".");
        if (a.length !== 4) throw n;
        var A = "";

        try {
            for (var L = 0; L < 4; L++) {
                var S = parseInt(a[L]);
                A += ("0" + S.toString(16)).slice(-2);
            }

            return A;
        } catch (Y) {
            console.log(Y);
            throw n;
        }
    } else {
        if (p.match(/^[0-9a-f:]+$/) && p.indexOf(":") !== -1) return ipv6tohex(p);else throw n;
    }
}

function encodeURIComponentAll(p) {
    var n = encodeURIComponent(p);
    var A = "";

    for (var L = 0; L < n.length; L++) {
        if (n[L] == "%") {
            A = A + n.substr(L, 3);
            L = L + 2;
        } else {
            A = A + "%" + stohex(n[L]);
        }
    }

    return A;
}

function newline_toUnix(p) {
    return p = p.replace(/\r\n/mg, "\n"), p;
}

function newline_toDos(p) {
    return p = p.replace(/\r\n/mg, "\n"), p = p.replace(/\n/mg, "\r\n"), p;
}

KJUR.lang.String.isInteger = function (p) {
    return p.match(/^[0-9]+$/) ? !![] : p.match(/^-[0-9]+$/) ? !![] : ![];
};

KJUR.lang.String.isHex = function (p) {
    return p.length % 2 == 0 && (p.match(/^[0-9a-f]+$/) || p.match(/^[0-9A-F]+$/)) ? !![] : ![];
};

KJUR.lang.String.isBase64 = function (p) {
    return p = p.replace(/\s+/g, ""), p.match(/^[0-9A-Za-z+\/]+={0,3}$/) && p.length % 4 == 0 ? !![] : ![];
};

KJUR.lang.String.isBase64URL = function (p) {
    if (p.match(/[+/=]/)) return ![];
    return p = b64utob64(p), KJUR.lang.String.isBase64(p);
};

KJUR.lang.String.isIntegerArray = function (p) {
    return p = p.replace(/\s+/g, ""), p.match(/^\[[0-9,]+\]$/) ? !![] : ![];
};

function hextoposhex(p) {
    if (p.length % 2 == 1) return "0" + p;
    if (p.substr(0, 1) > "7") return "00" + p;
    return p;
}

function intarystrtohex(p) {
    p = p.replace(/^\s*\[\s*/, "");
    p = p.replace(/\s*\]\s*$/, "");
    p = p.replace(/\s*/g, "");

    try {
        var n = p.split(/,/).map(function (A, L, S) {
            var Y = parseInt(A);
            if (Y < 0 || 255 < Y) throw "integer not in range 0-255";
            var J = ("00" + Y.toString(16)).slice(-2);
            return J;
        }).join("");
        return n;
    } catch (A) {
        console.log(A);
        throw "malformed integer array string: " + A;
    }
}

var strdiffidx = function (p, n) {
    var A = p.length;

    if (p.length > n.length) {
        A = n.length;
    }

    for (var L = 0; L < A; L++) {
        if (p.charCodeAt(L) != n.charCodeAt(L)) return L;
    }

    if (p.length != n.length) return A;
    return -1;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {};
}

KJUR.crypto.Util = new function () {
    this.DIGESTINFOHEAD = {
        "sha1": "3021300906052b0e03021a05000414",
        "sha224": "302d300d06096086480165030402040500041c",
        "sha256": "3031300d060960864801650304020105000420",
        "sha384": "3041300d060960864801650304020205000430",
        "sha512": "3051300d060960864801650304020305000440",
        "md2": "3020300c06082a864886f70d020205000410",
        "md5": "3020300c06082a864886f70d020505000410",
        "ripemd160": "3021300906052b2403020105000414"
    };
    this.DEFAULTPROVIDER = {
        "md5": "cryptojs",
        "sha1": "cryptojs",
        "sha224": "cryptojs",
        "sha256": "cryptojs",
        "sha384": "cryptojs",
        "sha512": "cryptojs",
        "ripemd160": "cryptojs",
        "hmacmd5": "cryptojs",
        "hmacsha1": "cryptojs",
        "hmacsha224": "cryptojs",
        "hmacsha256": "cryptojs",
        "hmacsha384": "cryptojs",
        "hmacsha512": "cryptojs",
        "hmacripemd160": "cryptojs",
        "MD5withRSA": "cryptojs/jsrsa",
        "SHA1withRSA": "cryptojs/jsrsa",
        "SHA224withRSA": "cryptojs/jsrsa",
        "SHA256withRSA": "cryptojs/jsrsa",
        "SHA384withRSA": "cryptojs/jsrsa",
        "SHA512withRSA": "cryptojs/jsrsa",
        "RIPEMD160withRSA": "cryptojs/jsrsa",
        "MD5withECDSA": "cryptojs/jsrsa",
        "SHA1withECDSA": "cryptojs/jsrsa",
        "SHA224withECDSA": "cryptojs/jsrsa",
        "SHA256withECDSA": "cryptojs/jsrsa",
        "SHA384withECDSA": "cryptojs/jsrsa",
        "SHA512withECDSA": "cryptojs/jsrsa",
        "RIPEMD160withECDSA": "cryptojs/jsrsa",
        "SHA1withDSA": "cryptojs/jsrsa",
        "SHA224withDSA": "cryptojs/jsrsa",
        "SHA256withDSA": "cryptojs/jsrsa",
        "MD5withRSAandMGF1": "cryptojs/jsrsa",
        "SHA1withRSAandMGF1": "cryptojs/jsrsa",
        "SHA224withRSAandMGF1": "cryptojs/jsrsa",
        "SHA256withRSAandMGF1": "cryptojs/jsrsa",
        "SHA384withRSAandMGF1": "cryptojs/jsrsa",
        "SHA512withRSAandMGF1": "cryptojs/jsrsa",
        "RIPEMD160withRSAandMGF1": "cryptojs/jsrsa"
    };
    this.CRYPTOJSMESSAGEDIGESTNAME = {
        "md5": CryptoJS.algo.MD5,
        "sha1": CryptoJS.algo.SHA1,
        "sha224": CryptoJS.algo.SHA224,
        "sha256": CryptoJS.algo.SHA256,
        "sha384": CryptoJS.algo.SHA384,
        "sha512": CryptoJS.algo.SHA512,
        "ripemd160": CryptoJS.algo.RIPEMD160
    };

    this.getDigestInfoHex = function (p, n) {
        if (typeof this.DIGESTINFOHEAD[n] == "undefined") throw "alg not supported in Util.DIGESTINFOHEAD: " + n;
        return this.DIGESTINFOHEAD[n] + p;
    };

    this.getPaddedDigestInfoHex = function (p, n, A) {
        var L = this.getDigestInfoHex(p, n);
        var S = A / 4;
        if (L.length + 22 > S) throw "key is too short for SigAlg: keylen=" + A + "," + n;
        var Y = "0001";
        var J = "00" + L;
        var C = "";
        var V = S - Y.length - J.length;

        for (var W = 0; W < V; W += 2) {
            C += "ff";
        }

        var R = Y + C + J;
        return R;
    };

    this.hashString = function (p, n) {
        var A = new KJUR.crypto.MessageDigest({
            "alg": n
        });
        return A.digestString(p);
    };

    this.hashHex = function (p, n) {
        var A = new KJUR.crypto.MessageDigest({
            "alg": n
        });
        return A.digestHex(p);
    };

    this.sha1 = function (p) {
        return this.hashString(p, "sha1");
    };

    this.sha256 = function (p) {
        return this.hashString(p, "sha256");
    };

    this.sha256Hex = function (p) {
        return this.hashHex(p, "sha256");
    };

    this.sha512 = function (p) {
        return this.hashString(p, "sha512");
    };

    this.sha512Hex = function (p) {
        return this.hashHex(p, "sha512");
    };

    this.isKey = function (p) {
        return p instanceof RSAKey || p instanceof KJUR.crypto.DSA || p instanceof KJUR.crypto.ECDSA ? !![] : ![];
    };
}();

KJUR.crypto.Util.md5 = function (p) {
    var n = new KJUR.crypto.MessageDigest({
        "alg": "md5",
        "prov": "cryptojs"
    });
    return n.digestString(p);
};

KJUR.crypto.Util.ripemd160 = function (p) {
    var n = new KJUR.crypto.MessageDigest({
        "alg": "ripemd160",
        "prov": "cryptojs"
    });
    return n.digestString(p);
};

KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();

KJUR.crypto.Util.getRandomHexOfNbytes = function (p) {
    var n = new Array(p);
    return KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(n), BAtohex(n);
};

KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (p) {
    return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(p), 16);
};

KJUR.crypto.Util.getRandomHexOfNbits = function (p) {
    var n = p % 8;
    var A = (p - n) / 8;
    var L = new Array(A + 1);
    return KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(L), L[0] = (255 << n & 255 ^ 255) & L[0], BAtohex(L);
};

KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (p) {
    return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(p), 16);
};

KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (p) {
    var n = p.bitLength();

    while (1) {
        var A = KJUR.crypto.Util.getRandomBigIntegerOfNbits(n);
        if (p.compareTo(A) != -1) return A;
    }
};

KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (p, n) {
    var A = p.compareTo(n);
    if (A == 1) throw "biMin is greater than biMax";
    if (A == 0) return p;
    var L = n.subtract(p);
    var g = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(L);
    return g.add(p);
};

KJUR.crypto.MessageDigest = function (p) {
    var n = null;
    var A = null;
    var L = null;

    this.setAlgAndProvider = function (S, Y) {
        S = KJUR.crypto.MessageDigest.getCanonicalAlgName(S);

        if (S !== null && Y === undefined) {
            Y = KJUR.crypto.Util.DEFAULTPROVIDER[S];
        }

        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(S) != -1 && Y == "cryptojs") {
            try {
                this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[S].create();
            } catch (J) {
                console.log(J);
                throw "setAlgAndProvider hash alg set fail alg=" + S + "/" + J;
            }

            this.updateString = function (C) {
                this.md.update(C);
            };

            this.updateHex = function (C) {
                var V = CryptoJS.enc.Hex.parse(C);
                this.md.update(V);
            };

            this.digest = function () {
                var C = this.md.finalize();
                return C.toString(CryptoJS.enc.Hex);
            };

            this.digestString = function (C) {
                return this.updateString(C), this.digest();
            };

            this.digestHex = function (C) {
                return this.updateHex(C), this.digest();
            };
        }

        if (":sha256:".indexOf(S) != -1 && Y == "sjcl") {
            try {
                this.md = new sjcl.hash.sha256();
            } catch (C) {
                console.log(C);
                throw "setAlgAndProvider hash alg set fail alg=" + S + "/" + C;
            }

            this.updateString = function (V) {
                this.md.update(V);
            };

            this.updateHex = function (V) {
                var W = sjcl.codec.hex.toBits(V);
                this.md.update(W);
            };

            this.digest = function () {
                var V = this.md.finalize();
                return sjcl.codec.hex.fromBits(V);
            };

            this.digestString = function (V) {
                return this.updateString(V), this.digest();
            };

            this.digestHex = function (V) {
                return this.updateHex(V), this.digest();
            };
        }
    };

    this.updateString = function (g) {
        throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
    };

    this.updateHex = function (g) {
        throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
    };

    this.digest = function () {
        throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName;
    };

    this.digestString = function (g) {
        throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
    };

    this.digestHex = function (g) {
        throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
    };

    p !== undefined && p.alg !== undefined && (this.algName = p.alg, p.prov === undefined && (this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]), this.setAlgAndProvider(this.algName, this.provName));
};

KJUR.crypto.MessageDigest.getCanonicalAlgName = function (p) {
    return typeof p === "string" && (p = p.toLowerCase(), p = p.replace(/-/, "")), p;
};

KJUR.crypto.MessageDigest.getHashLength = function (p) {
    var n = KJUR.crypto.MessageDigest;
    var A = n.getCanonicalAlgName(p);
    if (n.HASHLENGTH[A] === undefined) throw "not supported algorithm: " + p;
    return n.HASHLENGTH[A];
};

KJUR.crypto.MessageDigest.HASHLENGTH = {
    "md5": 16,
    "sha1": 20,
    "sha224": 28,
    "sha256": 32,
    "sha384": 48,
    "sha512": 64,
    "ripemd160": 20
};

KJUR.crypto.Mac = function (p) {
    var n = null;
    var A = null;
    var L = null;
    var g = null;
    var S = null;

    this.setAlgAndProvider = function (Y, J) {
        Y = Y.toLowerCase();

        if (Y == null) {
            Y = "hmacsha1";
        }

        Y = Y.toLowerCase();
        if (Y.substr(0, 4) != "hmac") throw "setAlgAndProvider unsupported HMAC alg: " + Y;

        if (J === undefined) {
            J = KJUR.crypto.Util.DEFAULTPROVIDER[Y];
        }

        this.algProv = Y + "/" + J;
        var C = Y.substr(4);

        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(C) != -1 && J == "cryptojs") {
            try {
                var V = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[C];
                this.mac = CryptoJS.algo.HMAC.create(V, this.pass);
            } catch (W) {
                console.log(W);
                throw "setAlgAndProvider hash alg set fail hashAlg=" + C + "/" + W;
            }

            this.updateString = function (R) {
                this.mac.update(R);
            };

            this.updateHex = function (R) {
                var B = CryptoJS.enc.Hex.parse(R);
                this.mac.update(B);
            };

            this.doFinal = function () {
                var R = this.mac.finalize();
                return R.toString(CryptoJS.enc.Hex);
            };

            this.doFinalString = function (R) {
                return this.updateString(R), this.doFinal();
            };

            this.doFinalHex = function (R) {
                return this.updateHex(R), this.doFinal();
            };
        }
    };

    this.updateString = function (Y) {
        throw "updateString(str) not supported for this alg/prov: " + this.algProv;
    };

    this.updateHex = function (Y) {
        throw "updateHex(hex) not supported for this alg/prov: " + this.algProv;
    };

    this.doFinal = function () {
        throw "digest() not supported for this alg/prov: " + this.algProv;
    };

    this.doFinalString = function (Y) {
        throw "digestString(str) not supported for this alg/prov: " + this.algProv;
    };

    this.doFinalHex = function (Y) {
        throw "digestHex(hex) not supported for this alg/prov: " + this.algProv;
    };

    this.setPassword = function (Y) {
        if (typeof Y == "string") {
            var J = Y;

            if (Y.length % 2 == 1 || !Y.match(/^[0-9A-Fa-f]+$/)) {
                J = rstrtohex(Y);
            }

            this.pass = CryptoJS.enc.Hex.parse(J);
            return;
        }

        if (typeof Y != "object") throw "KJUR.crypto.Mac unsupported password type: " + Y;
        var J = null;

        if (Y.hex !== undefined) {
            if (Y.hex.length % 2 != 0 || !Y.hex.match(/^[0-9A-Fa-f]+$/)) throw "Mac: wrong hex password: " + Y.hex;
            J = Y.hex;
        }

        if (Y.utf8 !== undefined) {
            J = utf8tohex(Y.utf8);
        }

        if (Y.rstr !== undefined) {
            J = rstrtohex(Y.rstr);
        }

        if (Y.b64 !== undefined) {
            J = b64tohex(Y.b64);
        }

        if (Y.b64u !== undefined) {
            J = b64utohex(Y.b64u);
        }

        if (J == null) throw "KJUR.crypto.Mac unsupported password type: " + Y;
        this.pass = CryptoJS.enc.Hex.parse(J);
    };

    p !== undefined && (p.pass !== undefined && this.setPassword(p.pass), p.alg !== undefined && (this.algName = p.alg, p.prov === undefined && (this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]), this.setAlgAndProvider(this.algName, this.provName)));
};

KJUR.crypto.Signature = function (A) {
    var L = null;
    var S = null;
    var Y = null;
    var J = null;
    var C = null;
    var V = null;
    var W = null;
    var R = null;
    var B = null;
    var F = null;
    var E = -1;
    var s = null;
    var I = null;
    var K = null;
    var T = null;
    var Z = null;

    this._setAlgNames = function () {
        var w = this.algName.match(/^(.+)with(.+)$/);

        if (w) {
            this.mdAlgName = w[1].toLowerCase();
            this.pubkeyAlgName = w[2].toLowerCase();
        }
    };

    this._zeroPaddingOfSignature = function (M, U) {
        var H = "";
        var O = U / 4 - M.length;

        for (var X = 0; X < O; X++) {
            H = H + "0";
        }

        return H + M;
    };

    this.setAlgAndProvider = function (w, M) {
        this._setAlgNames();

        if (M != "cryptojs/jsrsa") throw "provider not supported: " + M;

        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
            try {
                this.md = new KJUR.crypto.MessageDigest({
                    "alg": this.mdAlgName
                });
            } catch (U) {
                console.log(U);
                throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + U;
            }

            this.init = function (H, O) {
                var X = null;

                try {
                    if (O === undefined) {
                        X = KEYUTIL.getKey(H);
                    } else {
                        X = KEYUTIL.getKey(H, O);
                    }
                } catch (G) {
                    console.log(G);
                    throw "init failed:" + G;
                }

                if (X.isPrivate === !![]) {
                    this.prvKey = X;
                    this.state = "SIGN";
                } else {
                    if (X.isPublic === !![]) {
                        this.pubKey = X;
                        this.state = "VERIFY";
                    } else throw "init failed.:" + X;
                }
            };

            this.updateString = function (H) {
                this.md.updateString(H);
            };

            this.updateHex = function (H) {
                this.md.updateHex(H);
            };

            this.sign = function () {
                this.sHashHex = this.md.digest();

                if (this.prvKey === undefined && this.ecprvhex !== undefined && this.eccurvename !== undefined && KJUR.crypto.ECDSA !== undefined) {
                    this.prvKey = new KJUR.crypto.ECDSA({
                        "curve": this.eccurvename,
                        "prv": this.ecprvhex
                    });
                }

                if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen);else {
                    if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName);else {
                        if (this.prvKey instanceof KJUR.crypto.ECDSA) this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);else {
                            if (this.prvKey instanceof KJUR.crypto.DSA) this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);else throw "Signature: unsupported private key alg: " + this.pubkeyAlgName;
                        }
                    }
                }
                return this.hSign;
            };

            this.signString = function (H) {
                return this.updateString(H), this.sign();
            };

            this.signHex = function (H) {
                return this.updateHex(H), this.sign();
            };

            this.verify = function (H) {
                this.sHashHex = this.md.digest();

                if (this.pubKey === undefined && this.ecpubhex !== undefined && this.eccurvename !== undefined && KJUR.crypto.ECDSA !== undefined) {
                    this.pubKey = new KJUR.crypto.ECDSA({
                        "curve": this.eccurvename,
                        "pub": this.ecpubhex
                    });
                }

                if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, H, this.mdAlgName, this.pssSaltLen);else {
                    if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") return this.pubKey.verifyWithMessageHash(this.sHashHex, H);else {
                        if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) return this.pubKey.verifyWithMessageHash(this.sHashHex, H);else {
                            if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) return this.pubKey.verifyWithMessageHash(this.sHashHex, H);else throw "Signature: unsupported public key alg: " + this.pubkeyAlgName;
                        }
                    }
                }
            };
        }
    };

    this.init = function (w, M) {
        throw "init(key, pass) not supported for this alg:prov=" + this.algProvName;
    };

    this.updateString = function (w) {
        throw "updateString(str) not supported for this alg:prov=" + this.algProvName;
    };

    this.updateHex = function (w) {
        throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName;
    };

    this.sign = function () {
        throw "sign() not supported for this alg:prov=" + this.algProvName;
    };

    this.signString = function (w) {
        throw "digestString(str) not supported for this alg:prov=" + this.algProvName;
    };

    this.signHex = function (w) {
        throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName;
    };

    this.verify = function (w) {
        throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName;
    };

    this.initParams = A;

    if (A !== undefined) {
        if (A.alg !== undefined) {
            this.algName = A.alg;
            A.prov === undefined ? this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName] : this.provName = A.prov;
            this.algProvName = this.algName + ":" + this.provName;
            this.setAlgAndProvider(this.algName, this.provName);

            this._setAlgNames();
        }

        if (A.psssaltlen !== undefined) {
            this.pssSaltLen = A.psssaltlen;
        }

        if (A.prvkeypem !== undefined) {
            if (A.prvkeypas !== undefined) throw "both prvkeypem and prvkeypas parameters not supported";else try {
                var L = KEYUTIL.getKey(A.prvkeypem);
                this.init(L);
            } catch (w) {
                console.log(w);
                throw "fatal error to load pem private key: " + w;
            }
        }
    }
};

KJUR.crypto.Cipher = function (p) {};

KJUR.crypto.Cipher.encrypt = function (p, n, a) {
    if (n instanceof RSAKey && n.isPublic) {
        var A = KJUR.crypto.Cipher.getAlgByKeyAndName(n, a);
        if (A === "RSA") return n.encrypt(p);
        if (A === "RSAOAEP") return n.encryptOAEP(p, "sha1");
        var L = A.match(/^RSAOAEP(\d+)$/);
        if (L !== null) return n.encryptOAEP(p, "sha" + L[1]);
        throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + a;
    } else throw "Cipher.encrypt: unsupported key or algorithm";
};

KJUR.crypto.Cipher.decrypt = function (p, n, a) {
    if (n instanceof RSAKey && n.isPrivate) {
        var A = KJUR.crypto.Cipher.getAlgByKeyAndName(n, a);
        if (A === "RSA") return n.decrypt(p);
        if (A === "RSAOAEP") return n.decryptOAEP(p, "sha1");
        var L = A.match(/^RSAOAEP(\d+)$/);
        if (L !== null) return n.decryptOAEP(p, "sha" + L[1]);
        throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + a;
    } else throw "Cipher.decrypt: unsupported key or algorithm";
};

KJUR.crypto.Cipher.getAlgByKeyAndName = function (p, n) {
    if (p instanceof RSAKey) {
        if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(n) != -1) return n;
        if (n === null || n === undefined) return "RSA";
        throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + n;
    }

    throw "getAlgByKeyAndName: not supported algorithm name: " + n;
};

KJUR.crypto.OID = new function () {
    this.oidhex2name = {
        "2a864886f70d010101": "rsaEncryption",
        "2a8648ce3d0201": "ecPublicKey",
        "2a8648ce380401": "dsa",
        "2a8648ce3d030107": "secp256r1",
        "2b8104001f": "secp192k1",
        "2b81040021": "secp224r1",
        "2b8104000a": "secp256k1",
        "2b81040023": "secp521r1",
        "2b81040022": "secp384r1",
        "2a8648ce380403": "SHA1withDSA",
        "608648016503040301": "SHA224withDSA",
        "608648016503040302": "SHA256withDSA"
    };
}();

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {};
}

KJUR.crypto.ECDSA = function (p) {
    var n = "secp256r1";
    var A = null;
    var L = null;
    var S = null;
    var Y = BigInteger;
    var J = ECPointFp;
    var C = KJUR.crypto.ECDSA;
    var V = KJUR.crypto.ECParameterDB;
    var W = new SecureRandom();
    var R = null;
    this.type = "EC";
    this.isPrivate = ![];
    this.isPublic = ![];

    function B(F, E, I, K) {
        var T = Math.max(E.bitLength(), K.bitLength());
        var Z = F.add2D(I);
        var w = F.curve.getInfinity();

        for (var M = T - 1; M >= 0; --M) {
            w = w.twice2D();
            w.z = Y.ONE;
            E.testBit(M) ? K.testBit(M) ? w = w.add2D(Z) : w = w.add2D(F) : K.testBit(M) && (w = w.add2D(I));
        }

        return w;
    }

    this.getBigRandom = function (F) {
        return new Y(F.bitLength(), W).mod(F.subtract(Y.ONE)).add(Y.ONE);
    };

    this.setNamedCurve = function (F) {
        this.ecparams = V.getByName(F);
        this.prvKeyHex = null;
        this.pubKeyHex = null;
        this.curveName = F;
    };

    this.setPrivateKeyHex = function (F) {
        this.isPrivate = !![];
        this.prvKeyHex = F;
    };

    this.setPublicKeyHex = function (F) {
        this.isPublic = !![];
        this.pubKeyHex = F;
    };

    this.getPublicKeyXYHex = function () {
        var F = this.pubKeyHex;
        if (F.substr(0, 2) !== "04") throw "this method supports uncompressed format(04) only";
        var E = this.ecparams.keylen / 4;
        if (F.length !== 2 + E * 2) throw "malformed public key hex length";
        var s = {};
        return s.x = F.substr(2, E), s.y = F.substr(2 + E), s;
    };

    this.getShortNISTPCurveName = function () {
        var F = this.curveName;
        if (F === "secp256r1" || F === "NIST P-256" || F === "P-256" || F === "prime256v1") return "P-256";
        if (F === "secp384r1" || F === "NIST P-384" || F === "P-384") return "P-384";
        return null;
    };

    this.generateKeyPairHex = function () {
        var F = this.ecparams.n;
        var E = this.getBigRandom(F);
        var I = this.ecparams.G.multiply(E);
        var K = I.getX().toBigInteger();
        var T = I.getY().toBigInteger();
        var Z = this.ecparams.keylen / 4;
        var w = ("0000000000" + E.toString(16)).slice(-Z);
        var M = ("0000000000" + K.toString(16)).slice(-Z);
        var U = ("0000000000" + T.toString(16)).slice(-Z);
        var H = "04" + M + U;
        return this.setPrivateKeyHex(w), this.setPublicKeyHex(H), {
            "ecprvhex": w,
            "ecpubhex": H
        };
    };

    this.signWithMessageHash = function (F) {
        return this.signHex(F, this.prvKeyHex);
    };

    this.signHex = function (F, E) {
        var s = new Y(E, 16);
        var I = this.ecparams.n;
        var K = new Y(F.substring(0, this.ecparams.keylen / 4), 16);

        do {
            var T = this.getBigRandom(I);
            var Z = this.ecparams.G;
            var M = Z.multiply(T);
            var U = M.getX().toBigInteger().mod(I);
        } while (U.compareTo(Y.ZERO) <= 0);

        var H = T.modInverse(I).multiply(K.add(s.multiply(U))).mod(I);
        return C.biRSSigToASN1Sig(U, H);
    };

    this.sign = function (F, E) {
        var s = E;
        var I = this.ecparams.n;
        var K = Y.fromByteArrayUnsigned(F);

        do {
            var T = this.getBigRandom(I);
            var Z = this.ecparams.G;
            var M = Z.multiply(T);
            var U = M.getX().toBigInteger().mod(I);
        } while (U.compareTo(BigInteger.ZERO) <= 0);

        var H = T.modInverse(I).multiply(K.add(s.multiply(U))).mod(I);
        return this.serializeSig(U, H);
    };

    this.verifyWithMessageHash = function (F, E) {
        return this.verifyHex(F, E, this.pubKeyHex);
    };

    this.verifyHex = function (F, E, s) {
        try {
            var I;
            var K;
            var T = C.parseSigHex(E);
            I = T.r;
            K = T.s;
            var Z = J.decodeFromHex(this.ecparams.curve, s);
            var M = new Y(F.substring(0, this.ecparams.keylen / 4), 16);
            return this.verifyRaw(M, I, K, Z);
        } catch (U) {
            console.log(U);
            return ![];
        }
    };

    this.verify = function (F, E, s) {
        var I;
        var K;

        if (Bitcoin.Util.isArray(E)) {
            var T = this.parseSig(E);
            I = T.r;
            K = T.s;
        } else {
            if ("object" === typeof E && E.r && E.s) {
                I = E.r;
                K = E.s;
            } else throw "Invalid value for signature";
        }

        var Z;
        if (s instanceof ECPointFp) Z = s;else {
            if (Bitcoin.Util.isArray(s)) Z = J.decodeFrom(this.ecparams.curve, s);else throw "Invalid format for pubkey value, must be byte array or ECPointFp";
        }
        var w = Y.fromByteArrayUnsigned(F);
        return this.verifyRaw(w, I, K, Z);
    };

    this.verifyRaw = function (F, E, s, I) {
        var K = this.ecparams.n;
        var T = this.ecparams.G;
        if (E.compareTo(Y.ONE) < 0 || E.compareTo(K) >= 0) return ![];
        if (s.compareTo(Y.ONE) < 0 || s.compareTo(K) >= 0) return ![];
        var Z = s.modInverse(K);
        var M = F.multiply(Z).mod(K);
        var U = E.multiply(Z).mod(K);
        var H = T.multiply(M).add(I.multiply(U));
        var O = H.getX().toBigInteger().mod(K);
        return O.equals(E);
    };

    this.serializeSig = function (F, E) {
        var s = F.toByteArraySigned();
        var I = E.toByteArraySigned();
        var K = [];
        return K.push(2), K.push(s.length), K = K.concat(s), K.push(2), K.push(I.length), K = K.concat(I), K.unshift(K.length), K.unshift(48), K;
    };

    this.parseSig = function (F) {
        var E;
        if (F[0] != 48) throw new Error("Signature not a valid DERSequence");
        E = 2;
        if (F[E] != 2) throw new Error("First element in signature must be a DERInteger");
        var s = F.slice(E + 2, E + 2 + F[E + 1]);
        E += 2 + F[E + 1];
        if (F[E] != 2) throw new Error("Second element in signature must be a DERInteger");
        var I = F.slice(E + 2, E + 2 + F[E + 1]);
        E += 2 + F[E + 1];
        var K = Y.fromByteArrayUnsigned(s);
        var T = Y.fromByteArrayUnsigned(I);
        return {
            "r": K,
            "s": T
        };
    };

    this.parseSigCompact = function (F) {
        if (F.length !== 65) throw "Signature has the wrong length";
        var E = F[0] - 27;
        if (E < 0 || E > 7) throw "Invalid signature type";
        var s = this.ecparams.n;
        var I = Y.fromByteArrayUnsigned(F.slice(1, 33)).mod(s);
        var K = Y.fromByteArrayUnsigned(F.slice(33, 65)).mod(s);
        return {
            "r": I,
            "s": K,
            "i": E
        };
    };

    this.readPKCS5PrvKeyHex = function (F) {
        var E = ASN1HEX;
        var I = C.getName;
        var K = E.getVbyList;
        if (E.isASN1HEX(F) === ![]) throw "not ASN.1 hex string";
        var T;
        var Z;
        var w;

        try {
            T = K(F, 0, [2, 0], "06");
            Z = K(F, 0, [1], "04");

            try {
                w = K(F, 0, [3, 0], "03").substr(2);
            } catch (M) {
                console.log(M);
            }
        } catch (u) {
            console.log(u);
            throw "malformed PKCS#1/5 plain ECC private key";
        }

        this.curveName = I(T);
        if (this.curveName === undefined) throw "unsupported curve name";
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(w);
        this.setPrivateKeyHex(Z);
        this.isPublic = ![];
    };

    this.readPKCS8PrvKeyHex = function (F) {
        var E = ASN1HEX;
        var I = KJUR.crypto.ECDSA.getName;
        var K = E.getVbyList;
        if (E.isASN1HEX(F) === ![]) throw "not ASN.1 hex string";
        var T;
        var Z;
        var w;
        var M;

        try {
            T = K(F, 0, [1, 0], "06");
            Z = K(F, 0, [1, 1], "06");
            w = K(F, 0, [2, 0, 1], "04");

            try {
                M = K(F, 0, [2, 0, 2, 0], "03").substr(2);
            } catch (U) {
                console.log(U);
            }
        } catch (H) {
            console.log(H);
            throw "malformed PKCS#8 plain ECC private key";
        }

        this.curveName = I(Z);
        if (this.curveName === undefined) throw "unsupported curve name";
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(M);
        this.setPrivateKeyHex(w);
        this.isPublic = ![];
    };

    this.readPKCS8PubKeyHex = function (F) {
        var E = ASN1HEX;
        var I = KJUR.crypto.ECDSA.getName;
        var K = E.getVbyList;
        if (E.isASN1HEX(F) === ![]) throw "not ASN.1 hex string";
        var T;
        var Z;
        var w;

        try {
            T = K(F, 0, [0, 0], "06");
            Z = K(F, 0, [0, 1], "06");
            w = K(F, 0, [1], "03").substr(2);
        } catch (M) {
            console.log(M);
            throw "malformed PKCS#8 ECC public key";
        }

        this.curveName = I(Z);
        if (this.curveName === null) throw "unsupported curve name";
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(w);
    };

    this.readCertPubKeyHex = function (F, E) {
        if (E !== 5) {
            E = 6;
        }

        var I = ASN1HEX;
        var K = C.getName;
        var T = I.getVbyList;
        if (I.isASN1HEX(F) === ![]) throw "not ASN.1 hex string";
        var Z;
        var w;

        try {
            Z = T(F, 0, [0, E, 0, 1], "06");
            w = T(F, 0, [0, E, 1], "03").substr(2);
        } catch (M) {
            console.log(M);
            throw "malformed X.509 certificate ECC public key";
        }

        this.curveName = K(Z);
        if (this.curveName === null) throw "unsupported curve name";
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(w);
    };

    p !== undefined && p.curve !== undefined && (this.curveName = p.curve);
    this.curveName === undefined && (this.curveName = n);
    this.setNamedCurve(this.curveName);
    p !== undefined && (p.prv !== undefined && this.setPrivateKeyHex(p.prv), p.pub !== undefined && this.setPublicKeyHex(p.pub));
};

KJUR.crypto.ECDSA.parseSigHex = function (p) {
    var n = KJUR.crypto.ECDSA.parseSigHexInHexRS(p);
    var A = new BigInteger(n.r, 16);
    var L = new BigInteger(n.s, 16);
    return {
        "r": A,
        "s": L
    };
};

KJUR.crypto.ECDSA.parseSigHexInHexRS = function (p) {
    var n = ASN1HEX;
    var a = n.getChildIdx;
    var A = n.getV;
    n.checkStrictDER(p, 0);
    if (p.substr(0, 2) != "30") throw new Error("signature is not a ASN.1 sequence");
    var L = a(p, 0);
    if (L.length != 2) throw new Error("signature shall have two elements");
    var S = L[0];
    var Y = L[1];
    if (p.substr(S, 2) != "02") throw new Error("1st item not ASN.1 integer");
    if (p.substr(Y, 2) != "02") throw new Error("2nd item not ASN.1 integer");
    var J = A(p, S);
    var C = A(p, Y);
    return {
        "r": J,
        "s": C
    };
};

KJUR.crypto.ECDSA.asn1SigToConcatSig = function (p) {
    var n = KJUR.crypto.ECDSA.parseSigHexInHexRS(p);
    var A = n.r;
    var L = n.s;

    if (A.substr(0, 2) == "00" && A.length % 32 == 2) {
        A = A.substr(2);
    }

    if (L.substr(0, 2) == "00" && L.length % 32 == 2) {
        L = L.substr(2);
    }

    if (A.length % 32 == 30) {
        A = "00" + A;
    }

    if (L.length % 32 == 30) {
        L = "00" + L;
    }

    if (A.length % 32 != 0) throw "unknown ECDSA sig r length error";
    if (L.length % 32 != 0) throw "unknown ECDSA sig s length error";
    return A + L;
};

KJUR.crypto.ECDSA.concatSigToASN1Sig = function (p) {
    if (p.length / 2 * 8 % 128 != 0) throw "unknown ECDSA concatinated r-s sig  length error";
    var n = p.substr(0, p.length / 2);
    var A = p.substr(p.length / 2);
    return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(n, A);
};

KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function (p, n) {
    var A = new BigInteger(p, 16);
    var L = new BigInteger(n, 16);
    return KJUR.crypto.ECDSA.biRSSigToASN1Sig(A, L);
};

KJUR.crypto.ECDSA.biRSSigToASN1Sig = function (p, n) {
    var A = KJUR.asn1;
    var L = new A.DERInteger({
        "bigint": p
    });
    var g = new A.DERInteger({
        "bigint": n
    });
    var S = new A.DERSequence({
        "array": [L, g]
    });
    return S.getEncodedHex();
};

KJUR.crypto.ECDSA.getName = function (p) {
    if (p === "2b8104001f") return "secp192k1";
    if (p === "2a8648ce3d030107") return "secp256r1";
    if (p === "2b8104000a") return "secp256k1";
    if (p === "2b81040021") return "secp224r1";
    if (p === "2b81040022") return "secp384r1";
    if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(p) !== -1) return "secp256r1";
    if ("|secp256k1|".indexOf(p) !== -1) return "secp256k1";
    if ("|secp224r1|NIST P-224|P-224|".indexOf(p) !== -1) return "secp224r1";
    if ("|secp384r1|NIST P-384|P-384|".indexOf(p) !== -1) return "secp384r1";
    return null;
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {};
}

KJUR.crypto.ECParameterDB = new function () {
    var p = {};
    var n = {};

    function A(L) {
        return new BigInteger(L, 16);
    }

    this.getByName = function (L) {
        var g = L;

        if (typeof n[g] != "undefined") {
            g = n[L];
        }

        if (typeof p[g] != "undefined") return p[g];
        throw "unregistered EC curve name: " + g;
    };

    this.regist = function (L, S, Y, J, C, V, W, R, B, F, E, I) {
        p[L] = {};
        var K = A(Y);
        var T = A(J);
        var i = A(C);
        var Z = A(V);
        var M = A(W);
        var U = new ECCurveFp(K, T, i);
        var h = U.decodePointHex("04" + R + B);
        p[L].name = L;
        p[L].keylen = S;
        p[L].curve = U;
        p[L].G = h;
        p[L].n = Z;
        p[L].h = M;
        p[L].oid = E;
        p[L].info = I;

        for (var H = 0; H < F.length; H++) {
            n[F[H]] = L;
        }
    };
}();
KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);
KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);
KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);
KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);
KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);
KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);
KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {};
}

KJUR.crypto.DSA = function () {
    this.p = null;
    this.q = null;
    this.g = null;
    this.y = null;
    this.x = null;
    this.type = "DSA";
    this.isPrivate = ![];
    this.isPublic = ![];

    this.setPrivate = function (p, n, A, L, g) {
        this.isPrivate = !![];
        this.p = p;
        this.q = n;
        this.g = A;
        this.y = L;
        this.x = g;
    };

    this.setPrivateHex = function (p, n, A, L, S) {
        var Y;
        var J;
        var C;
        var V;
        var W;
        Y = new BigInteger(p, 16);
        J = new BigInteger(n, 16);
        C = new BigInteger(A, 16);
        typeof L === "string" && L.length > 1 ? V = new BigInteger(L, 16) : V = null;
        W = new BigInteger(S, 16);
        this.setPrivate(Y, J, C, V, W);
    };

    this.setPublic = function (p, n, A, L) {
        this.isPublic = !![];
        this.p = p;
        this.q = n;
        this.g = A;
        this.y = L;
        this.x = null;
    };

    this.setPublicHex = function (p, n, A, L) {
        var S;
        var Y;
        var J;
        var C;
        S = new BigInteger(p, 16);
        Y = new BigInteger(n, 16);
        J = new BigInteger(A, 16);
        C = new BigInteger(L, 16);
        this.setPublic(S, Y, J, C);
    };

    this.signWithMessageHash = function (p) {
        var A = this.p;
        var L = this.q;
        var g = this.g;
        var S = this.y;
        var Y = this.x;
        var J = KJUR.crypto.Util.getRandomBigIntegerMinToMax(BigInteger.ONE.add(BigInteger.ONE), L.subtract(BigInteger.ONE));
        var C = p.substr(0, L.bitLength() / 4);
        var V = new BigInteger(C, 16);
        var W = g.modPow(J, A).mod(L);
        var R = J.modInverse(L).multiply(V.add(Y.multiply(W))).mod(L);
        var B = KJUR.asn1.ASN1Util.jsonToASN1HEX({
            "seq": [{
                "int": {
                    "bigint": W
                }
            }, {
                "int": {
                    "bigint": R
                }
            }]
        });
        return B;
    };

    this.verifyWithMessageHash = function (p, A) {
        var L = this.p;
        var g = this.q;
        var S = this.g;
        var Y = this.y;
        var J = this.parseASN1Signature(A);
        var C = J[0];
        var V = J[1];
        var W = p.substr(0, g.bitLength() / 4);
        var R = new BigInteger(W, 16);
        if (BigInteger.ZERO.compareTo(C) > 0 || C.compareTo(g) > 0) throw "invalid DSA signature";
        if (BigInteger.ZERO.compareTo(V) >= 0 || V.compareTo(g) > 0) throw "invalid DSA signature";
        var B = V.modInverse(g);
        var F = R.multiply(B).mod(g);
        var E = C.multiply(B).mod(g);
        var s = S.modPow(F, L).multiply(Y.modPow(E, L)).mod(L).mod(g);
        return s.compareTo(C) == 0;
    };

    this.parseASN1Signature = function (p) {
        try {
            var n = new BigInteger(ASN1HEX.getVbyList(p, 0, [0], "02"), 16);
            var A = new BigInteger(ASN1HEX.getVbyList(p, 0, [1], "02"), 16);
            return [n, A];
        } catch (L) {
            console.log(L);
            throw "malformed ASN.1 DSA signature";
        }
    };

    this.readPKCS5PrvKeyHex = function (p) {
        var n;
        var A;
        var L;
        var S;
        var Y;
        var J = ASN1HEX;
        var C = J.getVbyList;
        if (J.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";

        try {
            n = C(p, 0, [1], "02");
            A = C(p, 0, [2], "02");
            L = C(p, 0, [3], "02");
            S = C(p, 0, [4], "02");
            Y = C(p, 0, [5], "02");
        } catch (V) {
            console.log(V);
            console.log("EXCEPTION:" + V);
            throw "malformed PKCS#1/5 plain DSA private key";
        }

        this.setPrivateHex(n, A, L, S, Y);
    };

    this.readPKCS8PrvKeyHex = function (p) {
        var n;
        var A;
        var L;
        var S;
        var Y = ASN1HEX;
        var J = Y.getVbyList;
        if (Y.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";

        try {
            n = J(p, 0, [1, 1, 0], "02");
            A = J(p, 0, [1, 1, 1], "02");
            L = J(p, 0, [1, 1, 2], "02");
            S = J(p, 0, [2, 0], "02");
        } catch (C) {
            console.log(C);
            console.log("EXCEPTION:" + C);
            throw "malformed PKCS#8 plain DSA private key";
        }

        this.setPrivateHex(n, A, L, null, S);
    };

    this.readPKCS8PubKeyHex = function (p) {
        var n;
        var A;
        var L;
        var S;
        var Y = ASN1HEX;
        var J = Y.getVbyList;
        if (Y.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";

        try {
            n = J(p, 0, [0, 1, 0], "02");
            A = J(p, 0, [0, 1, 1], "02");
            L = J(p, 0, [0, 1, 2], "02");
            S = J(p, 0, [1, 0], "02");
        } catch (C) {
            console.log(C);
            console.log("EXCEPTION:" + C);
            throw "malformed PKCS#8 DSA public key";
        }

        this.setPublicHex(n, A, L, S);
    };

    this.readCertPubKeyHex = function (p, n) {
        if (n !== 5) {
            n = 6;
        }

        var A;
        var L;
        var S;
        var Y;
        var J = ASN1HEX;
        var C = J.getVbyList;
        if (J.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";

        try {
            A = C(p, 0, [0, n, 0, 1, 0], "02");
            L = C(p, 0, [0, n, 0, 1, 1], "02");
            S = C(p, 0, [0, n, 0, 1, 2], "02");
            Y = C(p, 0, [0, n, 1, 0], "02");
        } catch (V) {
            console.log(V);
            console.log("EXCEPTION:" + V);
            throw "malformed X.509 certificate DSA public key";
        }

        this.setPublicHex(A, L, S, Y);
    };
};

var KEYUTIL = function () {
    var p = function (K, T, Z) {
        return S(CryptoJS.AES, K, T, Z);
    };

    var A = function (K, T, Z) {
        return S(CryptoJS.TripleDES, K, T, Z);
    };

    var L = function (K, T, Z) {
        return S(CryptoJS.DES, K, T, Z);
    };

    var S = function (K, T, Z, M) {
        var U = CryptoJS.enc.Hex.parse(T);
        var H = CryptoJS.enc.Hex.parse(Z);
        var O = CryptoJS.enc.Hex.parse(M);
        var X = {};
        X.key = H;
        X.iv = O;
        X.ciphertext = U;
        var G = K.decrypt(X, H, {
            "iv": O
        });
        return CryptoJS.enc.Hex.stringify(G);
    };

    var Y = function (K, T, Z) {
        return V(CryptoJS.AES, K, T, Z);
    };

    var J = function (K, T, Z) {
        return V(CryptoJS.TripleDES, K, T, Z);
    };

    var C = function (K, T, Z) {
        return V(CryptoJS.DES, K, T, Z);
    };

    var V = function (K, T, Z, M) {
        var U = CryptoJS.enc.Hex.parse(T);
        var H = CryptoJS.enc.Hex.parse(Z);
        var O = CryptoJS.enc.Hex.parse(M);
        var X = K.encrypt(U, H, {
            "iv": O
        });
        var G = CryptoJS.enc.Hex.parse(X.toString());
        var N = CryptoJS.enc.Base64.stringify(G);
        return N;
    };

    var W = {
        "AES-256-CBC": {
            "proc": p,
            "eproc": Y,
            "keylen": 32,
            "ivlen": 16
        },
        "AES-192-CBC": {
            "proc": p,
            "eproc": Y,
            "keylen": 24,
            "ivlen": 16
        },
        "AES-128-CBC": {
            "proc": p,
            "eproc": Y,
            "keylen": 16,
            "ivlen": 16
        },
        "DES-EDE3-CBC": {
            "proc": A,
            "eproc": J,
            "keylen": 24,
            "ivlen": 8
        },
        "DES-CBC": {
            "proc": L,
            "eproc": C,
            "keylen": 8,
            "ivlen": 8
        }
    };

    var R = function (K) {
        return W[K].proc;
    };

    var B = function (K) {
        var T = CryptoJS.lib.WordArray.random(K);
        var Z = CryptoJS.enc.Hex.stringify(T);
        return Z;
    };

    var F = function (K) {
        var T = {};
        var Z = K.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));

        if (Z) {
            T.cipher = Z[1];
            T.ivsalt = Z[2];
        }

        var M = K.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));

        if (M) {
            T.type = M[1];
        }

        var U = -1;
        var H = 0;

        if (K.indexOf("\r\n\r\n") != -1) {
            U = K.indexOf("\r\n\r\n");
            H = 2;
        }

        if (K.indexOf("\n\n") != -1) {
            U = K.indexOf("\n\n");
            H = 1;
        }

        var O = K.indexOf("-----END");

        if (U != -1 && O != -1) {
            var X = K.substring(U + H * 2, O - H);
            X = X.replace(/\s+/g, "");
            T.data = X;
        }

        return T;
    };

    var E = function (K, T, Z) {
        var M = Z.substring(0, 16);
        var U = CryptoJS.enc.Hex.parse(M);
        var H = CryptoJS.enc.Utf8.parse(T);
        var O = W[K].keylen + W[K].ivlen;
        var X = "";
        var G = null;

        for (;;) {
            var N = CryptoJS.algo.MD5.create();

            if (G != null) {
                N.update(G);
            }

            N.update(H);
            N.update(U);
            G = N.finalize();
            X = X + CryptoJS.enc.Hex.stringify(G);
            if (X.length >= O * 2) break;
        }

        var D = {};
        return D.keyhex = X.substr(0, W[K].keylen * 2), D.ivhex = X.substr(W[K].keylen * 2, W[K].ivlen * 2), D;
    };

    var s = function (K, T, Z, M) {
        var U = CryptoJS.enc.Base64.parse(K);
        var H = CryptoJS.enc.Hex.stringify(U);
        var O = W[T].proc;
        var X = O(H, Z, M);
        return X;
    };

    var I = function (K, T, Z, w) {
        var M = W[T].eproc;
        var U = M(K, Z, w);
        return U;
    };

    return {
        "version": "1.0.0",
        "parsePKCS5PEM": function (K) {
            return F(K);
        },
        "getKeyAndUnusedIvByPasscodeAndIvsalt": function (K, T, Z) {
            return E(K, T, Z);
        },
        "decryptKeyB64": function (K, T, Z, w) {
            return s(K, T, Z, w);
        },
        "getDecryptedKeyHex": function (K, T) {
            var Z = F(K);
            var M = Z.type;
            var U = Z.cipher;
            var H = Z.ivsalt;
            var O = Z.data;
            var X = E(U, T, H);
            var G = X.keyhex;
            var N = s(O, U, G, H);
            return N;
        },
        "getEncryptedPKCS5PEMFromPrvKeyHex": function (K, T, Z, M, U) {
            var H = "";

            if (typeof M == "undefined" || M == null) {
                M = "AES-256-CBC";
            }

            if (typeof W[M] == "undefined") throw "KEYUTIL unsupported algorithm: " + M;

            if (typeof U == "undefined" || U == null) {
                var O = W[M].ivlen;
                var X = B(O);
                U = X.toUpperCase();
            }

            var G = E(M, Z, U);
            var N = G.keyhex;
            var D = I(T, M, N, U);
            var Q = D.replace(/(.{64})/g, "$1\r\n");
            var H = "-----BEGIN " + K + " PRIVATE KEY-----\r\n";
            return H += "Proc-Type: 4,ENCRYPTED\r\n", H += "DEK-Info: " + M + "," + U + "\r\n", H += "\r\n", H += Q, H += "\r\n-----END " + K + " PRIVATE KEY-----\r\n", H;
        },
        "parseHexOfEncryptedPKCS8": function (K) {
            var T = ASN1HEX;
            var Z = T.getChildIdx;
            var M = T.getV;
            var U = {};
            var H = Z(K, 0);
            if (H.length != 2) throw "malformed format: SEQUENCE(0).items != 2: " + H.length;
            U.ciphertext = M(K, H[1]);
            var O = Z(K, H[0]);
            if (O.length != 2) throw "malformed format: SEQUENCE(0.0).items != 2: " + O.length;
            if (M(K, O[0]) != "2a864886f70d01050d") throw "this only supports pkcs5PBES2";
            var X = Z(K, O[1]);
            if (O.length != 2) throw "malformed format: SEQUENCE(0.0.1).items != 2: " + X.length;
            var G = Z(K, X[1]);
            if (G.length != 2) throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + G.length;
            if (M(K, G[0]) != "2a864886f70d0307") throw "this only supports TripleDES";
            U.encryptionSchemeAlg = "TripleDES";
            U.encryptionSchemeIV = M(K, G[1]);
            var N = Z(K, X[0]);
            if (N.length != 2) throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + N.length;
            if (M(K, N[0]) != "2a864886f70d01050c") throw "this only supports pkcs5PBKDF2";
            var D = Z(K, N[1]);
            if (D.length < 2) throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + D.length;
            U.pbkdf2Salt = M(K, D[0]);
            var Q = M(K, D[1]);

            try {
                U.pbkdf2Iter = parseInt(Q, 16);
            } catch (P) {
                console.log(P);
                throw "malformed format pbkdf2Iter: " + Q;
            }

            return U;
        },
        "getPBKDF2KeyHexFromParam": function (K, T) {
            var Z = CryptoJS.enc.Hex.parse(K.pbkdf2Salt);
            var w = K.pbkdf2Iter;
            var M = CryptoJS.PBKDF2(T, Z, {
                "keySize": 6,
                "iterations": w
            });
            var U = CryptoJS.enc.Hex.stringify(M);
            return U;
        },
        "_getPlainPKCS8HexFromEncryptedPKCS8PEM": function (K, T) {
            var Z = pemtohex(K, "ENCRYPTED PRIVATE KEY");
            var M = this.parseHexOfEncryptedPKCS8(Z);
            var U = KEYUTIL.getPBKDF2KeyHexFromParam(M, T);
            var H = {};
            H.ciphertext = CryptoJS.enc.Hex.parse(M.ciphertext);
            var O = CryptoJS.enc.Hex.parse(U);
            var X = CryptoJS.enc.Hex.parse(M.encryptionSchemeIV);
            var G = CryptoJS.TripleDES.decrypt(H, O, {
                "iv": X
            });
            var N = CryptoJS.enc.Hex.stringify(G);
            return N;
        },
        "getKeyFromEncryptedPKCS8PEM": function (K, T) {
            var Z = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(K, T);

            var w = this.getKeyFromPlainPrivatePKCS8Hex(Z);
            return w;
        },
        "parsePlainPrivatePKCS8Hex": function (K) {
            var T = ASN1HEX;
            var Z = T.getChildIdx;
            var w = T.getV;
            var M = {};
            M.algparam = null;
            if (K.substr(0, 2) != "30") throw "malformed plain PKCS8 private key(code:001)";
            var U = Z(K, 0);
            if (U.length != 3) throw "malformed plain PKCS8 private key(code:002)";
            if (K.substr(U[1], 2) != "30") throw "malformed PKCS8 private key(code:003)";
            var H = Z(K, U[1]);
            if (H.length != 2) throw "malformed PKCS8 private key(code:004)";
            if (K.substr(H[0], 2) != "06") throw "malformed PKCS8 private key(code:005)";
            M.algoid = w(K, H[0]);

            if (K.substr(H[1], 2) == "06") {
                M.algparam = w(K, H[1]);
            }

            if (K.substr(U[2], 2) != "04") throw "malformed PKCS8 private key(code:006)";
            return M.keyidx = T.getVidx(K, U[2]), M;
        },
        "getKeyFromPlainPrivatePKCS8PEM": function (K) {
            var T = pemtohex(K, "PRIVATE KEY");
            var Z = this.getKeyFromPlainPrivatePKCS8Hex(T);
            return Z;
        },
        "getKeyFromPlainPrivatePKCS8Hex": function (K) {
            var T = this.parsePlainPrivatePKCS8Hex(K);
            var Z;
            if (T.algoid == "2a864886f70d010101") Z = new RSAKey();else {
                if (T.algoid == "2a8648ce380401") Z = new KJUR.crypto.DSA();else {
                    if (T.algoid == "2a8648ce3d0201") Z = new KJUR.crypto.ECDSA();else throw "unsupported private key algorithm";
                }
            }
            return Z.readPKCS8PrvKeyHex(K), Z;
        },
        "_getKeyFromPublicPKCS8Hex": function (K) {
            var T;
            var Z = ASN1HEX.getVbyList(K, 0, [0, 0], "06");
            if (Z === "2a864886f70d010101") T = new RSAKey();else {
                if (Z === "2a8648ce380401") T = new KJUR.crypto.DSA();else {
                    if (Z === "2a8648ce3d0201") T = new KJUR.crypto.ECDSA();else throw "unsupported PKCS#8 public key hex";
                }
            }
            return T.readPKCS8PubKeyHex(K), T;
        },
        "parsePublicRawRSAKeyHex": function (K) {
            var T = ASN1HEX;
            var Z = T.getChildIdx;
            var w = T.getV;
            var M = {};
            if (K.substr(0, 2) != "30") throw "malformed RSA key(code:001)";
            var U = Z(K, 0);
            if (U.length != 2) throw "malformed RSA key(code:002)";
            if (K.substr(U[0], 2) != "02") throw "malformed RSA key(code:003)";
            M.n = w(K, U[0]);
            if (K.substr(U[1], 2) != "02") throw "malformed RSA key(code:004)";
            return M.e = w(K, U[1]), M;
        },
        "parsePublicPKCS8Hex": function (K) {
            var T = ASN1HEX;
            var Z = T.getChildIdx;
            var M = T.getV;
            var U = {};
            U.algparam = null;
            var H = Z(K, 0);
            if (H.length != 2) throw "outer DERSequence shall have 2 elements: " + H.length;
            var O = H[0];
            if (K.substr(O, 2) != "30") throw "malformed PKCS8 public key(code:001)";
            var X = Z(K, O);
            if (X.length != 2) throw "malformed PKCS8 public key(code:002)";
            if (K.substr(X[0], 2) != "06") throw "malformed PKCS8 public key(code:003)";
            U.algoid = M(K, X[0]);

            if (K.substr(X[1], 2) == "06") {
                U.algparam = M(K, X[1]);
            } else {
                if (K.substr(X[1], 2) == "30") {
                    U.algparam = {};
                    U.algparam.p = T.getVbyList(K, X[1], [0], "02");
                    U.algparam.q = T.getVbyList(K, X[1], [1], "02");
                    U.algparam.g = T.getVbyList(K, X[1], [2], "02");
                }
            }

            if (K.substr(H[1], 2) != "03") throw "malformed PKCS8 public key(code:004)";
            return U.key = M(K, H[1]).substr(2), U;
        }
    };
}();

KEYUTIL.getKey = function (p, a, g) {
    var S = ASN1HEX;
    var Y = S.getChildIdx;
    var V = S.getV;
    var W = S.getVbyList;
    var R = KJUR.crypto;
    var T = R.ECDSA;
    var Z = R.DSA;
    var q = RSAKey;
    var U = pemtohex;
    var h = KEYUTIL;
    if (typeof q != "undefined" && p instanceof q) return p;
    if (typeof T != "undefined" && p instanceof T) return p;
    if (typeof Z != "undefined" && p instanceof Z) return p;
    if (p.curve !== undefined && p.xy !== undefined && p.d === undefined) return new T({
        "pub": p.xy,
        "curve": p.curve
    });
    if (p.curve !== undefined && p.d !== undefined) return new T({
        "prv": p.d,
        "curve": p.curve
    });

    if (p.kty === undefined && p.n !== undefined && p.e !== undefined && p.d === undefined) {
        var X = new q();
        return X.setPublic(p.n, p.e), X;
    }

    if (p.kty === undefined && p.n !== undefined && p.e !== undefined && p.d !== undefined && p.p !== undefined && p.q !== undefined && p.dp !== undefined && p.dq !== undefined && p.co !== undefined && p.qi === undefined) {
        var X = new q();
        return X.setPrivateEx(p.n, p.e, p.d, p.p, p.q, p.dp, p.dq, p.co), X;
    }

    if (p.kty === undefined && p.n !== undefined && p.e !== undefined && p.d !== undefined && p.p === undefined) {
        var X = new q();
        return X.setPrivate(p.n, p.e, p.d), X;
    }

    if (p.p !== undefined && p.q !== undefined && p.g !== undefined && p.y !== undefined && p.x === undefined) {
        var X = new Z();
        return X.setPublic(p.p, p.q, p.g, p.y), X;
    }

    if (p.p !== undefined && p.q !== undefined && p.g !== undefined && p.y !== undefined && p.x !== undefined) {
        var X = new Z();
        return X.setPrivate(p.p, p.q, p.g, p.y, p.x), X;
    }

    if (p.kty === "RSA" && p.n !== undefined && p.e !== undefined && p.d === undefined) {
        var X = new q();
        return X.setPublic(b64utohex(p.n), b64utohex(p.e)), X;
    }

    if (p.kty === "RSA" && p.n !== undefined && p.e !== undefined && p.d !== undefined && p.p !== undefined && p.q !== undefined && p.dp !== undefined && p.dq !== undefined && p.qi !== undefined) {
        var X = new q();
        return X.setPrivateEx(b64utohex(p.n), b64utohex(p.e), b64utohex(p.d), b64utohex(p.p), b64utohex(p.q), b64utohex(p.dp), b64utohex(p.dq), b64utohex(p.qi)), X;
    }

    if (p.kty === "RSA" && p.n !== undefined && p.e !== undefined && p.d !== undefined) {
        var X = new q();
        return X.setPrivate(b64utohex(p.n), b64utohex(p.e), b64utohex(p.d)), X;
    }

    if (p.kty === "EC" && p.crv !== undefined && p.x !== undefined && p.y !== undefined && p.d === undefined) {
        var x = new T({
            "curve": p.crv
        });
        var y = x.ecparams.keylen / 4;
        var Q = ("0000000000" + b64utohex(p.x)).slice(-y);
        var p0 = ("0000000000" + b64utohex(p.y)).slice(-y);
        var p1 = "04" + Q + p0;
        return x.setPublicKeyHex(p1), x;
    }

    if (p.kty === "EC" && p.crv !== undefined && p.x !== undefined && p.y !== undefined && p.d !== undefined) {
        var x = new T({
            "curve": p.crv
        });
        var y = x.ecparams.keylen / 4;
        var Q = ("0000000000" + b64utohex(p.x)).slice(-y);
        var p0 = ("0000000000" + b64utohex(p.y)).slice(-y);
        var p1 = "04" + Q + p0;
        var p2 = ("0000000000" + b64utohex(p.d)).slice(-y);
        return x.setPublicKeyHex(p1), x.setPrivateKeyHex(p2), x;
    }

    if (g === "pkcs5prv") {
        var p3 = p;
        var S = ASN1HEX;
        var p4;
        var X;
        p4 = Y(p3, 0);

        if (p4.length === 9) {
            X = new q();
            X.readPKCS5PrvKeyHex(p3);
        } else {
            if (p4.length === 6) {
                X = new Z();
                X.readPKCS5PrvKeyHex(p3);
            } else {
                if (p4.length > 2 && p3.substr(p4[1], 2) === "04") {
                    X = new T();
                    X.readPKCS5PrvKeyHex(p3);
                } else throw "unsupported PKCS#1/5 hexadecimal key";
            }
        }

        return X;
    }

    if (g === "pkcs8prv") {
        var X = h.getKeyFromPlainPrivatePKCS8Hex(p);
        return X;
    }

    if (g === "pkcs8pub") return h._getKeyFromPublicPKCS8Hex(p);
    if (g === "x509pub") return X509.getPublicKeyFromCertHex(p);
    if (p.indexOf("-END CERTIFICATE-", 0) != -1 || p.indexOf("-END X509 CERTIFICATE-", 0) != -1 || p.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) return X509.getPublicKeyFromCertPEM(p);

    if (p.indexOf("-END PUBLIC KEY-") != -1) {
        var p5 = pemtohex(p, "PUBLIC KEY");
        return h._getKeyFromPublicPKCS8Hex(p5);
    }

    if (p.indexOf("-END RSA PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") == -1) {
        var p6 = U(p, "RSA PRIVATE KEY");
        return h.getKey(p6, null, "pkcs5prv");
    }

    if (p.indexOf("-END DSA PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") == -1) {
        var p7 = U(p, "DSA PRIVATE KEY");
        var p8 = W(p7, 0, [1], "02");
        var p9 = W(p7, 0, [2], "02");
        var pp = W(p7, 0, [3], "02");
        var pn = W(p7, 0, [4], "02");
        var pc = W(p7, 0, [5], "02");
        var X = new Z();
        return X.setPrivate(new BigInteger(p8, 16), new BigInteger(p9, 16), new BigInteger(pp, 16), new BigInteger(pn, 16), new BigInteger(pc, 16)), X;
    }

    if (p.indexOf("-END EC PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") == -1) {
        var p6 = U(p, "EC PRIVATE KEY");
        return h.getKey(p6, null, "pkcs5prv");
    }

    if (p.indexOf("-END PRIVATE KEY-") != -1) return h.getKeyFromPlainPrivatePKCS8PEM(p);

    if (p.indexOf("-END RSA PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") != -1) {
        var pa = h.getDecryptedKeyHex(p, a);
        var pA = new RSAKey();
        return pA.readPKCS5PrvKeyHex(pa), pA;
    }

    if (p.indexOf("-END EC PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") != -1) {
        var p7 = h.getDecryptedKeyHex(p, a);
        var X = W(p7, 0, [1], "04");
        var pL = W(p7, 0, [2, 0], "06");
        var pg = W(p7, 0, [3, 0], "03").substr(2);
        var pS = "";
        if (KJUR.crypto.OID.oidhex2name[pL] !== undefined) pS = KJUR.crypto.OID.oidhex2name[pL];else throw "undefined OID(hex) in KJUR.crypto.OID: " + pL;
        var x = new T({
            "curve": pS
        });
        return x.setPublicKeyHex(pg), x.setPrivateKeyHex(X), x.isPublic = ![], x;
    }

    if (p.indexOf("-END DSA PRIVATE KEY-") != -1 && p.indexOf("4,ENCRYPTED") != -1) {
        var p7 = h.getDecryptedKeyHex(p, a);
        var p8 = W(p7, 0, [1], "02");
        var p9 = W(p7, 0, [2], "02");
        var pp = W(p7, 0, [3], "02");
        var pn = W(p7, 0, [4], "02");
        var pc = W(p7, 0, [5], "02");
        var X = new Z();
        return X.setPrivate(new BigInteger(p8, 16), new BigInteger(p9, 16), new BigInteger(pp, 16), new BigInteger(pn, 16), new BigInteger(pc, 16)), X;
    }

    if (p.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) return h.getKeyFromEncryptedPKCS8PEM(p, a);
    throw "not supported argument";
};

KEYUTIL.generateKeypair = function (p, n) {
    if (p == "RSA") {
        var A = n;
        var L = new RSAKey();
        L.generate(A, "10001");
        L.isPrivate = !![];
        L.isPublic = !![];
        var S = new RSAKey();
        var Y = L.n.toString(16);
        var J = L.e.toString(16);
        S.setPublic(Y, J);
        S.isPrivate = ![];
        S.isPublic = !![];
        var C = {};
        return C.prvKeyObj = L, C.pubKeyObj = S, C;
    } else {
        if (p == "EC") {
            var V = n;
            var W = new KJUR.crypto.ECDSA({
                "curve": V
            });
            var l = W.generateKeyPairHex();
            var L = new KJUR.crypto.ECDSA({
                "curve": V
            });
            L.setPublicKeyHex(l.ecpubhex);
            L.setPrivateKeyHex(l.ecprvhex);
            L.isPrivate = !![];
            L.isPublic = ![];
            var S = new KJUR.crypto.ECDSA({
                "curve": V
            });
            S.setPublicKeyHex(l.ecpubhex);
            S.isPrivate = ![];
            S.isPublic = !![];
            var C = {};
            return C.prvKeyObj = L, C.pubKeyObj = S, C;
        } else throw "unknown algorithm: " + p;
    }
};

KEYUTIL.getPEM = function (L, S, Y, J, V, W) {
    var R = KJUR;
    var s = R.asn1;
    var I = s.DERObjectIdentifier;
    var K = s.DERInteger;
    var T = s.ASN1Util.newObject;
    var Z = s.x509;
    var M = Z.SubjectPublicKeyInfo;
    var U = R.crypto;
    var H = U.DSA;
    var O = U.ECDSA;
    var X = RSAKey;

    function G(pp) {
        var pn = T({
            "seq": [{
                "int": 0
            }, {
                "int": {
                    "bigint": pp.n
                }
            }, {
                "int": pp.e
            }, {
                "int": {
                    "bigint": pp.d
                }
            }, {
                "int": {
                    "bigint": pp.p
                }
            }, {
                "int": {
                    "bigint": pp.q
                }
            }, {
                "int": {
                    "bigint": pp.dmp1
                }
            }, {
                "int": {
                    "bigint": pp.dmq1
                }
            }, {
                "int": {
                    "bigint": pp.coeff
                }
            }]
        });
        return pn;
    }

    function N(pp) {
        var pn = T({
            "seq": [{
                "int": 1
            }, {
                "octstr": {
                    "hex": pp.prvKeyHex
                }
            }, {
                "tag": ["a0", !![], {
                    "oid": {
                        "name": pp.curveName
                    }
                }]
            }, {
                "tag": ["a1", !![], {
                    "bitstr": {
                        "hex": "00" + pp.pubKeyHex
                    }
                }]
            }]
        });
        return pn;
    }

    function Q(pp) {
        var pn = T({
            "seq": [{
                "int": 0
            }, {
                "int": {
                    "bigint": pp.p
                }
            }, {
                "int": {
                    "bigint": pp.q
                }
            }, {
                "int": {
                    "bigint": pp.g
                }
            }, {
                "int": {
                    "bigint": pp.y
                }
            }, {
                "int": {
                    "bigint": pp.x
                }
            }]
        });
        return pn;
    }

    if ((X !== undefined && L instanceof X || H !== undefined && L instanceof H || O !== undefined && L instanceof O) && L.isPublic == !![] && (S === undefined || S == "PKCS8PUB")) {
        var P = new M(L);
        var p0 = P.getEncodedHex();
        return hextopem(p0, "PUBLIC KEY");
    }

    if (S == "PKCS1PRV" && X !== undefined && L instanceof X && (Y === undefined || Y == null) && L.isPrivate == !![]) {
        var P = G(L);
        var p0 = P.getEncodedHex();
        return hextopem(p0, "RSA PRIVATE KEY");
    }

    if (S == "PKCS1PRV" && O !== undefined && L instanceof O && (Y === undefined || Y == null) && L.isPrivate == !![]) {
        var p1 = new I({
            "name": L.curveName
        });
        var p2 = p1.getEncodedHex();
        var p3 = N(L);
        var p4 = p3.getEncodedHex();
        var p5 = "";
        return p5 += hextopem(p2, "EC PARAMETERS"), p5 += hextopem(p4, "EC PRIVATE KEY"), p5;
    }

    if (S == "PKCS1PRV" && H !== undefined && L instanceof H && (Y === undefined || Y == null) && L.isPrivate == !![]) {
        var P = Q(L);
        var p0 = P.getEncodedHex();
        return hextopem(p0, "DSA PRIVATE KEY");
    }

    if (S == "PKCS5PRV" && X !== undefined && L instanceof X && Y !== undefined && Y != null && L.isPrivate == !![]) {
        var P = G(L);
        var p0 = P.getEncodedHex();
        return J === undefined && (J = "DES-EDE3-CBC"), this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", p0, Y, J, W);
    }

    if (S == "PKCS5PRV" && O !== undefined && L instanceof O && Y !== undefined && Y != null && L.isPrivate == !![]) {
        var P = N(L);
        var p0 = P.getEncodedHex();
        return J === undefined && (J = "DES-EDE3-CBC"), this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", p0, Y, J, W);
    }

    if (S == "PKCS5PRV" && H !== undefined && L instanceof H && Y !== undefined && Y != null && L.isPrivate == !![]) {
        var P = Q(L);
        var p0 = P.getEncodedHex();
        return J === undefined && (J = "DES-EDE3-CBC"), this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", p0, Y, J, W);
    }

    var p6 = function (pp, pn) {
        var pc = p7(pp, pn);
        var pa = new T({
            "seq": [{
                "seq": [{
                    "oid": {
                        "name": "pkcs5PBES2"
                    }
                }, {
                    "seq": [{
                        "seq": [{
                            "oid": {
                                "name": "pkcs5PBKDF2"
                            }
                        }, {
                            "seq": [{
                                "octstr": {
                                    "hex": pc.pbkdf2Salt
                                }
                            }, {
                                "int": pc.pbkdf2Iter
                            }]
                        }]
                    }, {
                        "seq": [{
                            "oid": {
                                "name": "des-EDE3-CBC"
                            }
                        }, {
                            "octstr": {
                                "hex": pc.encryptionSchemeIV
                            }
                        }]
                    }]
                }]
            }, {
                "octstr": {
                    "hex": pc.ciphertext
                }
            }]
        });
        return pa.getEncodedHex();
    };

    var p7 = function (pp, pn) {
        var pc = 100;
        var pa = CryptoJS.lib.WordArray.random(8);
        var pA = "DES-EDE3-CBC";
        var pL = CryptoJS.lib.WordArray.random(8);
        var pg = CryptoJS.PBKDF2(pn, pa, {
            "keySize": 6,
            "iterations": pc
        });
        var pS = CryptoJS.enc.Hex.parse(pp);
        var pf = CryptoJS.TripleDES.encrypt(pS, pg, {
            "iv": pL
        }) + "";
        var pY = {};
        return pY.ciphertext = pf, pY.pbkdf2Salt = CryptoJS.enc.Hex.stringify(pa), pY.pbkdf2Iter = pc, pY.encryptionSchemeAlg = pA, pY.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(pL), pY;
    };

    if (S == "PKCS8PRV" && X != undefined && L instanceof X && L.isPrivate == !![]) {
        var p8 = G(L);
        var p9 = p8.getEncodedHex();
        var P = T({
            "seq": [{
                "int": 0
            }, {
                "seq": [{
                    "oid": {
                        "name": "rsaEncryption"
                    }
                }, {
                    "null": !![]
                }]
            }, {
                "octstr": {
                    "hex": p9
                }
            }]
        });
        var p0 = P.getEncodedHex();
        if (Y === undefined || Y == null) return hextopem(p0, "PRIVATE KEY");else {
            var p4 = p6(p0, Y);
            return hextopem(p4, "ENCRYPTED PRIVATE KEY");
        }
    }

    if (S == "PKCS8PRV" && O !== undefined && L instanceof O && L.isPrivate == !![]) {
        var p8 = new T({
            "seq": [{
                "int": 1
            }, {
                "octstr": {
                    "hex": L.prvKeyHex
                }
            }, {
                "tag": ["a1", !![], {
                    "bitstr": {
                        "hex": "00" + L.pubKeyHex
                    }
                }]
            }]
        });
        var p9 = p8.getEncodedHex();
        var P = T({
            "seq": [{
                "int": 0
            }, {
                "seq": [{
                    "oid": {
                        "name": "ecPublicKey"
                    }
                }, {
                    "oid": {
                        "name": L.curveName
                    }
                }]
            }, {
                "octstr": {
                    "hex": p9
                }
            }]
        });
        var p0 = P.getEncodedHex();
        if (Y === undefined || Y == null) return hextopem(p0, "PRIVATE KEY");else {
            var p4 = p6(p0, Y);
            return hextopem(p4, "ENCRYPTED PRIVATE KEY");
        }
    }

    if (S == "PKCS8PRV" && H !== undefined && L instanceof H && L.isPrivate == !![]) {
        var p8 = new K({
            "bigint": L.x
        });
        var p9 = p8.getEncodedHex();
        var P = T({
            "seq": [{
                "int": 0
            }, {
                "seq": [{
                    "oid": {
                        "name": "dsa"
                    }
                }, {
                    "seq": [{
                        "int": {
                            "bigint": L.p
                        }
                    }, {
                        "int": {
                            "bigint": L.q
                        }
                    }, {
                        "int": {
                            "bigint": L.g
                        }
                    }]
                }]
            }, {
                "octstr": {
                    "hex": p9
                }
            }]
        });
        var p0 = P.getEncodedHex();
        if (Y === undefined || Y == null) return hextopem(p0, "PRIVATE KEY");else {
            var p4 = p6(p0, Y);
            return hextopem(p4, "ENCRYPTED PRIVATE KEY");
        }
    }

    throw "unsupported object nor format";
};

KEYUTIL.getKeyFromCSRPEM = function (p) {
    var n = pemtohex(p, "CERTIFICATE REQUEST");
    var A = KEYUTIL.getKeyFromCSRHex(n);
    return A;
};

KEYUTIL.getKeyFromCSRHex = function (p) {
    var n = KEYUTIL.parseCSRHex(p);
    var A = KEYUTIL.getKey(n.p8pubkeyhex, null, "pkcs8pub");
    return A;
};

KEYUTIL.parseCSRHex = function (p) {
    var n = ASN1HEX;
    var A = n.getChildIdx;
    var L = n.getTLV;
    var S = {};
    var Y = p;
    if (Y.substr(0, 2) != "30") throw "malformed CSR(code:001)";
    var J = A(Y, 0);
    if (J.length < 1) throw "malformed CSR(code:002)";
    if (Y.substr(J[0], 2) != "30") throw "malformed CSR(code:003)";
    var C = A(Y, J[0]);
    if (C.length < 3) throw "malformed CSR(code:004)";
    return S.p8pubkeyhex = L(Y, C[2]), S;
};

KEYUTIL.getKeyID = function (p) {
    var n = KEYUTIL;
    var A = ASN1HEX;

    if (typeof p === "string" && p.indexOf("BEGIN ") != -1) {
        p = n.getKey(p);
    }

    var L = pemtohex(n.getPEM(p));
    var g = A.getIdxbyList(L, 0, [1]);
    var S = A.getV(L, g).substring(2);
    return KJUR.crypto.Util.hashHex(S, "sha1");
};

KEYUTIL.getJWKFromKey = function (p) {
    var n = {};
    if (p instanceof RSAKey && p.isPrivate) return n.kty = "RSA", n.n = hextob64u(p.n.toString(16)), n.e = hextob64u(p.e.toString(16)), n.d = hextob64u(p.d.toString(16)), n.p = hextob64u(p.p.toString(16)), n.q = hextob64u(p.q.toString(16)), n.dp = hextob64u(p.dmp1.toString(16)), n.dq = hextob64u(p.dmq1.toString(16)), n.qi = hextob64u(p.coeff.toString(16)), n;else {
        if (p instanceof RSAKey && p.isPublic) return n.kty = "RSA", n.n = hextob64u(p.n.toString(16)), n.e = hextob64u(p.e.toString(16)), n;else {
            if (p instanceof KJUR.crypto.ECDSA && p.isPrivate) {
                var A = p.getShortNISTPCurveName();
                if (A !== "P-256" && A !== "P-384") throw "unsupported curve name for JWT: " + A;
                var L = p.getPublicKeyXYHex();
                return n.kty = "EC", n.crv = A, n.x = hextob64u(L.x), n.y = hextob64u(L.y), n.d = hextob64u(p.prvKeyHex), n;
            } else {
                if (p instanceof KJUR.crypto.ECDSA && p.isPublic) {
                    var A = p.getShortNISTPCurveName();
                    if (A !== "P-256" && A !== "P-384") throw "unsupported curve name for JWT: " + A;
                    var L = p.getPublicKeyXYHex();
                    return n.kty = "EC", n.crv = A, n.x = hextob64u(L.x), n.y = hextob64u(L.y), n;
                }
            }
        }
    }
    throw "not supported key object";
};

RSAKey.getPosArrayOfChildrenFromHex = function (p) {
    return ASN1HEX.getChildIdx(p, 0);
};

RSAKey.getHexValueArrayOfChildrenFromHex = function (p) {
    var a = ASN1HEX;
    var A = a.getV;
    var L = RSAKey.getPosArrayOfChildrenFromHex(p);
    var S = A(p, L[0]);
    var Y = A(p, L[1]);
    var J = A(p, L[2]);
    var C = A(p, L[3]);
    var V = A(p, L[4]);
    var W = A(p, L[5]);
    var R = A(p, L[6]);
    var B = A(p, L[7]);
    var F = A(p, L[8]);
    var L = new Array();
    return L.push(S, Y, J, C, V, W, R, B, F), L;
};

RSAKey.prototype.readPrivateKeyFromPEMString = function (p) {
    var n = pemtohex(p);
    var a = RSAKey.getHexValueArrayOfChildrenFromHex(n);
    this.setPrivateEx(a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
};

RSAKey.prototype.readPKCS5PrvKeyHex = function (p) {
    var n = RSAKey.getHexValueArrayOfChildrenFromHex(p);
    this.setPrivateEx(n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8]);
};

RSAKey.prototype.readPKCS8PrvKeyHex = function (p) {
    var n;
    var A;
    var L;
    var S;
    var Y;
    var J;
    var C;
    var V;
    var W = ASN1HEX;
    var R = W.getVbyList;
    if (W.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";

    try {
        n = R(p, 0, [2, 0, 1], "02");
        A = R(p, 0, [2, 0, 2], "02");
        L = R(p, 0, [2, 0, 3], "02");
        S = R(p, 0, [2, 0, 4], "02");
        Y = R(p, 0, [2, 0, 5], "02");
        J = R(p, 0, [2, 0, 6], "02");
        C = R(p, 0, [2, 0, 7], "02");
        V = R(p, 0, [2, 0, 8], "02");
    } catch (B) {
        console.log(B);
        throw "malformed PKCS#8 plain RSA private key";
    }

    this.setPrivateEx(n, A, L, S, Y, J, C, V);
};

RSAKey.prototype.readPKCS5PubKeyHex = function (p) {
    var n = ASN1HEX;
    var A = n.getV;
    if (n.isASN1HEX(p) === ![]) throw "keyHex is not ASN.1 hex string";
    var L = n.getChildIdx(p, 0);
    if (L.length !== 2 || p.substr(L[0], 2) !== "02" || p.substr(L[1], 2) !== "02") throw "wrong hex for PKCS#5 public key";
    var g = A(p, L[0]);
    var S = A(p, L[1]);
    this.setPublic(g, S);
};

RSAKey.prototype.readPKCS8PubKeyHex = function (p) {
    var n = ASN1HEX;
    if (n.isASN1HEX(p) === ![]) throw "not ASN.1 hex string";
    if (n.getTLVbyList(p, 0, [0, 0]) !== "06092a864886f70d010101") throw "not PKCS8 RSA public key";
    var A = n.getTLVbyList(p, 0, [1, 0]);
    this.readPKCS5PubKeyHex(A);
};

RSAKey.prototype.readCertPubKeyHex = function (p, n) {
    var A;
    var L;
    A = new X509();
    A.readCertHex(p);
    L = A.getPublicKeyHex();
    this.readPKCS8PubKeyHex(L);
};

var _RE_HEXDECONLY = new RegExp("[^0-9a-f]", "gi");

function _rsasign_getHexPaddedDigestInfoForString(p, n, A) {
    var L = function (S) {
        return KJUR.crypto.Util.hashString(S, A);
    };

    var g = L(p);
    return KJUR.crypto.Util.getPaddedDigestInfoHex(g, A, n);
}

function _zeroPaddingOfSignature(p, n) {
    var A = "";
    var L = n / 4 - p.length;

    for (var g = 0; g < L; g++) {
        A = A + "0";
    }

    return A + p;
}

RSAKey.prototype.sign = function (p, n) {
    var A = function (g) {
        return KJUR.crypto.Util.hashString(g, n);
    };

    var L = A(p);
    return this.signWithMessageHash(L, n);
};

RSAKey.prototype.signWithMessageHash = function (p, n) {
    var A = KJUR.crypto.Util.getPaddedDigestInfoHex(p, n, this.n.bitLength());
    var L = parseBigInt(A, 16);
    var g = this.doPrivate(L);
    var S = g.toString(16);
    return _zeroPaddingOfSignature(S, this.n.bitLength());
};

function pss_mgf1_str(p, n, A) {
    var L = "";
    var g = 0;

    while (L.length < n) {
        L += hextorstr(A(rstrtohex(p + String.fromCharCode.apply(String, [(g & 4278190080) >> 24, (g & 16711680) >> 16, (g & 65280) >> 8, g & 255]))));
        g += 1;
    }

    return L;
}

RSAKey.prototype.signPSS = function (p, n, A) {
    var L = function (S) {
        return KJUR.crypto.Util.hashHex(S, n);
    };

    var g = L(rstrtohex(p));
    return A === undefined && (A = -1), this.signWithMessageHashPSS(g, n, A);
};

RSAKey.prototype.signWithMessageHashPSS = function (A, L, S) {
    var Y = hextorstr(A);
    var J = Y.length;
    var C = this.n.bitLength() - 1;
    var V = Math.ceil(C / 8);
    var W;

    var R = function (Z) {
        return KJUR.crypto.Util.hashHex(Z, L);
    };

    if (S === -1 || S === undefined) S = J;else {
        if (S === -2) S = V - J - 2;else {
            if (S < -2) throw "invalid salt length";
        }
    }
    if (V < J + S + 2) throw "data too long";
    var B = "";

    if (S > 0) {
        B = new Array(S);
        new SecureRandom().nextBytes(B);
        B = String.fromCharCode.apply(String, B);
    }

    var F = hextorstr(R(rstrtohex("\0\0\0\0\0\0\0\0" + Y + B)));
    var E = [];

    for (W = 0; W < V - S - J - 2; W += 1) {
        E[W] = 0;
    }

    var s = String.fromCharCode.apply(String, E) + "" + B;
    var I = pss_mgf1_str(F, s.length, R);
    var K = [];

    for (W = 0; W < s.length; W += 1) {
        K[W] = s.charCodeAt(W) ^ I.charCodeAt(W);
    }

    var T = 65280 >> 8 * V - C & 255;
    K[0] &= ~T;

    for (W = 0; W < J; W++) {
        K.push(F.charCodeAt(W));
    }

    return K.push(188), _zeroPaddingOfSignature(this.doPrivate(new BigInteger(K)).toString(16), this.n.bitLength());
};

function _rsasign_getDecryptSignatureBI(p, n, A) {
    var L = new RSAKey();
    L.setPublic(n, A);
    var g = L.doPublic(p);
    return g;
}

function _rsasign_getHexDigestInfoFromSig(p, n, A) {
    var L = _rsasign_getDecryptSignatureBI(p, n, A);

    var g = L.toString(16).replace(/^1f+00/, "");
    return g;
}

function _rsasign_getAlgNameAndHashFromHexDisgestInfo(p) {
    for (var n in KJUR.crypto.Util.DIGESTINFOHEAD) {
        var a = KJUR.crypto.Util.DIGESTINFOHEAD[n];
        var A = a.length;

        if (p.substring(0, A) == a) {
            var L = [n, p.substring(A)];
            return L;
        }
    }

    return [];
}

RSAKey.prototype.verify = function (p, n) {
    n = n.replace(_RE_HEXDECONLY, "");
    n = n.replace(/[ \n]+/g, "");
    var A = parseBigInt(n, 16);
    if (A.bitLength() > this.n.bitLength()) return 0;
    var L = this.doPublic(A);
    var S = L.toString(16).replace(/^1f+00/, "");

    var Y = _rsasign_getAlgNameAndHashFromHexDisgestInfo(S);

    if (Y.length == 0) return ![];
    var J = Y[0];
    var C = Y[1];

    var V = function (l) {
        return KJUR.crypto.Util.hashString(l, J);
    };

    var W = V(p);
    return C == W;
};

RSAKey.prototype.verifyWithMessageHash = function (p, n) {
    if (n.length != Math.ceil(this.n.bitLength() / 4)) return ![];
    var A = parseBigInt(n, 16);
    if (A.bitLength() > this.n.bitLength()) return 0;
    var L = this.doPublic(A);
    var S = L.toString(16).replace(/^1f+00/, "");

    var Y = _rsasign_getAlgNameAndHashFromHexDisgestInfo(S);

    if (Y.length == 0) return ![];
    var J = Y[0];
    var C = Y[1];
    return C == p;
};

RSAKey.prototype.verifyPSS = function (p, n, A, L) {
    var g = function (Y) {
        return KJUR.crypto.Util.hashHex(Y, A);
    };

    var S = g(rstrtohex(p));
    return L === undefined && (L = -1), this.verifyWithMessageHashPSS(S, n, A, L);
};

RSAKey.prototype.verifyWithMessageHashPSS = function (A, L, S, Y) {
    if (L.length != Math.ceil(this.n.bitLength() / 4)) return ![];
    var J = new BigInteger(L, 16);

    var C = function (M) {
        return KJUR.crypto.Util.hashHex(M, S);
    };

    var V = hextorstr(A);
    var W = V.length;
    var R = this.n.bitLength() - 1;
    var B = Math.ceil(R / 8);
    var F;
    if (Y === -1 || Y === undefined) Y = W;else {
        if (Y === -2) Y = B - W - 2;else {
            if (Y < -2) throw "invalid salt length";
        }
    }
    if (B < W + Y + 2) throw "data too long";
    var E = this.doPublic(J).toByteArray();

    for (F = 0; F < E.length; F += 1) {
        E[F] &= 255;
    }

    while (E.length < B) {
        E.unshift(0);
    }

    if (E[B - 1] !== 188) throw "encoded message does not end in 0xbc";
    E = String.fromCharCode.apply(String, E);
    var I = E.substr(0, B - W - 1);
    var K = E.substr(I.length, W);
    var T = 65280 >> 8 * B - R & 255;
    if ((I.charCodeAt(0) & T) !== 0) throw "bits beyond keysize not zero";
    var i = pss_mgf1_str(K, I.length, C);
    var Z = [];

    for (F = 0; F < I.length; F += 1) {
        Z[F] = I.charCodeAt(F) ^ i.charCodeAt(F);
    }

    Z[0] &= ~T;
    var w = B - W - Y - 2;

    for (F = 0; F < w; F += 1) {
        if (Z[F] !== 0) throw "leftmost octets not zero";
    }

    if (Z[w] !== 1) throw "0x01 marker not found";
    return K === hextorstr(C(rstrtohex("\0\0\0\0\0\0\0\0" + V + String.fromCharCode.apply(String, Z.slice(-Y)))));
};

RSAKey.SALT_LEN_HLEN = -1;
RSAKey.SALT_LEN_MAX = -2;
RSAKey.SALT_LEN_RECOVER = -2;

function X509() {
    var p = ASN1HEX;
    var n = p.getChildIdx;
    var A = p.getV;
    var L = p.getTLV;
    var S = p.getVbyList;
    var Y = p.getTLVbyList;
    var J = p.getIdxbyList;
    var C = p.getVidx;
    var V = p.oidname;
    var W = X509;
    var l = pemtohex;
    this.hex = null;
    this.version = 0;
    this.foffset = 0;
    this.aExtInfo = null;

    this.getVersion = function () {
        if (this.hex === null || this.version !== 0) return this.version;
        if (Y(this.hex, 0, [0, 0]) !== "a003020102") return this.version = 1, this.foffset = -1, 1;
        return this.version = 3, 3;
    };

    this.getSerialNumberHex = function () {
        return S(this.hex, 0, [0, 1 + this.foffset], "02");
    };

    this.getSignatureAlgorithmField = function () {
        return V(S(this.hex, 0, [0, 2 + this.foffset, 0], "06"));
    };

    this.getIssuerHex = function () {
        return Y(this.hex, 0, [0, 3 + this.foffset], "30");
    };

    this.getIssuerString = function () {
        return W.hex2dn(this.getIssuerHex());
    };

    this.getSubjectHex = function () {
        return Y(this.hex, 0, [0, 5 + this.foffset], "30");
    };

    this.getSubjectString = function () {
        return W.hex2dn(this.getSubjectHex());
    };

    this.getNotBefore = function () {
        var R = S(this.hex, 0, [0, 4 + this.foffset, 0]);
        return R = R.replace(/(..)/g, "%$1"), R = decodeURIComponent(R), R;
    };

    this.getNotAfter = function () {
        var R = S(this.hex, 0, [0, 4 + this.foffset, 1]);
        return R = R.replace(/(..)/g, "%$1"), R = decodeURIComponent(R), R;
    };

    this.getPublicKeyHex = function () {
        return p.getTLVbyList(this.hex, 0, [0, 6 + this.foffset], "30");
    };

    this.getPublicKeyIdx = function () {
        return J(this.hex, 0, [0, 6 + this.foffset], "30");
    };

    this.getPublicKeyContentIdx = function () {
        var R = this.getPublicKeyIdx();
        return J(this.hex, R, [1, 0], "30");
    };

    this.getPublicKey = function () {
        return KEYUTIL.getKey(this.getPublicKeyHex(), null, "pkcs8pub");
    };

    this.getSignatureAlgorithmName = function () {
        return V(S(this.hex, 0, [1, 0], "06"));
    };

    this.getSignatureValueHex = function () {
        return S(this.hex, 0, [2], "03", !![]);
    };

    this.verifySignature = function (R) {
        var B = this.getSignatureAlgorithmName();
        var F = this.getSignatureValueHex();
        var E = Y(this.hex, 0, [0], "30");
        var s = new KJUR.crypto.Signature({
            "alg": B
        });
        return s.init(R), s.updateHex(E), s.verify(F);
    };

    this.parseExt = function (R) {
        var B;
        var F;
        var E;

        if (R === undefined) {
            E = this.hex;
            if (this.version !== 3) return -1;
            B = J(E, 0, [0, 7, 0], "30");
            F = n(E, B);
        } else {
            E = pemtohex(R);
            var I = J(E, 0, [0, 3, 0, 0], "06");

            if (A(E, I) != "2a864886f70d01090e") {
                this.aExtInfo = new Array();
                return;
            }

            B = J(E, 0, [0, 3, 0, 1, 0], "30");
            F = n(E, B);
            this.hex = E;
        }

        this.aExtInfo = new Array();

        for (var K = 0; K < F.length; K++) {
            var T = {};
            T.critical = ![];
            var Z = n(E, F[K]);
            var w = 0;

            if (Z.length === 3) {
                T.critical = !![];
                w = 1;
            }

            T.oid = p.hextooidstr(S(E, F[K], [0], "06"));
            var M = J(E, F[K], [1 + w]);
            T.vidx = C(E, M);
            this.aExtInfo.push(T);
        }
    };

    this.getExtInfo = function (R) {
        var B = this.aExtInfo;
        var F = R;

        if (!R.match(/^[0-9.]+$/)) {
            F = KJUR.asn1.x509.OID.name2oid(R);
        }

        if (F === "") return undefined;

        for (var E = 0; E < B.length; E++) {
            if (B[E].oid === F) return B[E];
        }

        return undefined;
    };

    this.getExtBasicConstraints = function () {
        var R = this.getExtInfo("basicConstraints");
        if (R === undefined) return R;
        var B = A(this.hex, R.vidx);
        if (B === "") return {};
        if (B === "0101ff") return {
            "cA": !![]
        };

        if (B.substr(0, 8) === "0101ff02") {
            var F = A(B, 6);
            var E = parseInt(F, 16);
            return {
                "cA": !![],
                "pathLen": E
            };
        }

        throw "basicConstraints parse error";
    };

    this.getExtKeyUsageBin = function () {
        var R = this.getExtInfo("keyUsage");
        if (R === undefined) return "";
        var B = A(this.hex, R.vidx);
        if (B.length % 2 != 0 || B.length <= 2) throw "malformed key usage value";
        var F = parseInt(B.substr(0, 2));
        var E = parseInt(B.substr(2), 16).toString(2);
        return E.substr(0, E.length - F);
    };

    this.getExtKeyUsageString = function () {
        var R = this.getExtKeyUsageBin();
        var B = new Array();

        for (var F = 0; F < R.length; F++) {
            if (R.substr(F, 1) == "1") {
                B.push(X509.KEYUSAGE_NAME[F]);
            }
        }

        return B.join(",");
    };

    this.getExtSubjectKeyIdentifier = function () {
        var R = this.getExtInfo("subjectKeyIdentifier");
        if (R === undefined) return R;
        return A(this.hex, R.vidx);
    };

    this.getExtAuthorityKeyIdentifier = function () {
        var R = this.getExtInfo("authorityKeyIdentifier");
        if (R === undefined) return R;
        var B = {};
        var F = L(this.hex, R.vidx);
        var E = n(F, 0);

        for (var s = 0; s < E.length; s++) {
            if (F.substr(E[s], 2) === "80") {
                B.kid = A(F, E[s]);
            }
        }

        return B;
    };

    this.getExtExtKeyUsageName = function () {
        var R = this.getExtInfo("extKeyUsage");
        if (R === undefined) return R;
        var B = new Array();
        var F = L(this.hex, R.vidx);
        if (F === "") return B;
        var E = n(F, 0);

        for (var s = 0; s < E.length; s++) {
            B.push(V(A(F, E[s])));
        }

        return B;
    };

    this.getExtSubjectAltName = function () {
        var R = this.getExtSubjectAltName2();
        var B = new Array();

        for (var F = 0; F < R.length; F++) {
            if (R[F][0] === "DNS") {
                B.push(R[F][1]);
            }
        }

        return B;
    };

    this.getExtSubjectAltName2 = function () {
        var R;
        var B;
        var F;
        var E = this.getExtInfo("subjectAltName");
        if (E === undefined) return E;
        var I = new Array();
        var K = L(this.hex, E.vidx);
        var T = n(K, 0);

        for (var Z = 0; Z < T.length; Z++) {
            F = K.substr(T[Z], 2);
            R = A(K, T[Z]);
            F === "81" && (B = hextoutf8(R), I.push(["MAIL", B]));
            F === "82" && (B = hextoutf8(R), I.push(["DNS", B]));
            F === "84" && (B = X509.hex2dn(R, 0), I.push(["DN", B]));
            F === "86" && (B = hextoutf8(R), I.push(["URI", B]));
            F === "87" && (B = hextoip(R), I.push(["IP", B]));
        }

        return I;
    };

    this.getExtCRLDistributionPointsURI = function () {
        var R = this.getExtInfo("cRLDistributionPoints");
        if (R === undefined) return R;
        var B = new Array();
        var F = n(this.hex, R.vidx);

        for (var E = 0; E < F.length; E++) {
            try {
                var s = S(this.hex, F[E], [0, 0, 0], "86");
                var I = hextoutf8(s);
                B.push(I);
            } catch (K) {
                console.log(K);
            }
        }

        return B;
    };

    this.getExtAIAInfo = function () {
        var R = this.getExtInfo("authorityInfoAccess");
        if (R === undefined) return R;
        var B = {
            "ocsp": [],
            "caissuer": []
        };
        var F = n(this.hex, R.vidx);

        for (var E = 0; E < F.length; E++) {
            var s = S(this.hex, F[E], [0], "06");
            var I = S(this.hex, F[E], [1], "86");
            s === "2b06010505073001" && B.ocsp.push(hextoutf8(I));
            s === "2b06010505073002" && B.caissuer.push(hextoutf8(I));
        }

        return B;
    };

    this.getExtCertificatePolicies = function () {
        var R = this.getExtInfo("certificatePolicies");
        if (R === undefined) return R;
        var B = L(this.hex, R.vidx);
        var F = [];
        var E = n(B, 0);

        for (var I = 0; I < E.length; I++) {
            var K = {};
            var T = n(B, E[I]);
            K.id = V(A(B, T[0]));

            if (T.length === 2) {
                var Z = n(B, T[1]);

                for (var w = 0; w < Z.length; w++) {
                    var M = S(B, Z[w], [0], "06");

                    if (M === "2b06010505070201") {
                        K.cps = hextoutf8(S(B, Z[w], [1]));
                    } else {
                        if (M === "2b06010505070202") {
                            K.unotice = hextoutf8(S(B, Z[w], [1, 0]));
                        }
                    }
                }
            }

            F.push(K);
        }

        return F;
    };

    this.readCertPEM = function (R) {
        this.readCertHex(l(R));
    };

    this.readCertHex = function (R) {
        this.hex = R;
        this.getVersion();

        try {
            J(this.hex, 0, [0, 7], "a3");
            this.parseExt();
        } catch (B) {
            console.log(B);
        }
    };

    this.getInfo = function () {
        var R = X509;
        var F;
        var E;
        var s;
        F = "Basic Fields\n";
        F += "  serial number: " + this.getSerialNumberHex() + "\n";
        F += "  signature algorithm: " + this.getSignatureAlgorithmField() + "\n";
        F += "  issuer: " + this.getIssuerString() + "\n";
        F += "  notBefore: " + this.getNotBefore() + "\n";
        F += "  notAfter: " + this.getNotAfter() + "\n";
        F += "  subject: " + this.getSubjectString() + "\n";
        F += "  subject public key info: \n";
        E = this.getPublicKey();
        F += "    key algorithm: " + E.type + "\n";

        if (E.type === "RSA") {
            F += "    n=" + hextoposhex(E.n.toString(16)).substr(0, 16) + "...\n";
            F += "    e=" + hextoposhex(E.e.toString(16)) + "\n";
        }

        s = this.aExtInfo;

        if (s !== undefined && s !== null) {
            F += "X509v3 Extensions:\n";

            for (var I = 0; I < s.length; I++) {
                var K = s[I];
                var T = KJUR.asn1.x509.OID.oid2name(K.oid);

                if (T === "") {
                    T = K.oid;
                }

                var Z = "";

                if (K.critical === !![]) {
                    Z = "CRITICAL";
                }

                F += "  " + T + " " + Z + ":\n";

                if (T === "basicConstraints") {
                    var M = this.getExtBasicConstraints();

                    if (M.cA === undefined) {
                        F += "    {}\n";
                    } else {
                        F += "    cA=true";
                        M.pathLen !== undefined && (F += ", pathLen=" + M.pathLen);
                        F += "\n";
                    }
                } else {
                    if (T === "keyUsage") F += "    " + this.getExtKeyUsageString() + "\n";else {
                        if (T === "subjectKeyIdentifier") F += "    " + this.getExtSubjectKeyIdentifier() + "\n";else {
                            if (T === "authorityKeyIdentifier") {
                                var U = this.getExtAuthorityKeyIdentifier();

                                if (U.kid !== undefined) {
                                    F += "    kid=" + U.kid + "\n";
                                }
                            } else {
                                if (T === "extKeyUsage") {
                                    var H = this.getExtExtKeyUsageName();
                                    F += "    " + H.join(", ") + "\n";
                                } else {
                                    if (T === "subjectAltName") {
                                        var O = this.getExtSubjectAltName2();
                                        F += "    " + O + "\n";
                                    } else {
                                        if (T === "cRLDistributionPoints") {
                                            var X = this.getExtCRLDistributionPointsURI();
                                            F += "    " + X + "\n";
                                        } else {
                                            if (T === "authorityInfoAccess") {
                                                var G = this.getExtAIAInfo();
                                                G.ocsp !== undefined && (F += "    ocsp: " + G.ocsp.join(",") + "\n");
                                                G.caissuer !== undefined && (F += "    caissuer: " + G.caissuer.join(",") + "\n");
                                            } else {
                                                if (T === "certificatePolicies") {
                                                    var N = this.getExtCertificatePolicies();

                                                    for (var D = 0; D < N.length; D++) {
                                                        N[D].id !== undefined && (F += "    policy oid: " + N[D].id + "\n");
                                                        N[D].cps !== undefined && (F += "    cps: " + N[D].cps + "\n");
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        return F += "signature algorithm: " + this.getSignatureAlgorithmName() + "\n", F += "signature: " + this.getSignatureValueHex().substr(0, 16) + "...\n", F;
    };
}

X509.hex2dn = function (p, n) {
    if (n === undefined) {
        n = 0;
    }

    if (p.substr(n, 2) !== "30") throw "malformed DN";
    var a = new Array();
    var A = ASN1HEX.getChildIdx(p, n);

    for (var L = 0; L < A.length; L++) {
        a.push(X509.hex2rdn(p, A[L]));
    }

    return a = a.map(function (g) {
        return g.replace("/", "\\/");
    }), "/" + a.join("/");
};

X509.hex2rdn = function (p, n) {
    if (n === undefined) {
        n = 0;
    }

    if (p.substr(n, 2) !== "31") throw "malformed RDN";
    var a = new Array();
    var A = ASN1HEX.getChildIdx(p, n);

    for (var L = 0; L < A.length; L++) {
        a.push(X509.hex2attrTypeValue(p, A[L]));
    }

    return a = a.map(function (g) {
        return g.replace("+", "\\+");
    }), a.join("+");
};

X509.hex2attrTypeValue = function (p, n) {
    var A = ASN1HEX;
    var L = A.getV;

    if (n === undefined) {
        n = 0;
    }

    if (p.substr(n, 2) !== "30") throw "malformed attribute type and value";
    var S = A.getChildIdx(p, n);

    if (S.length !== 2 || p.substr(S[0], 2) !== "06") {
        "malformed attribute type and value";
    }

    var Y = L(p, S[0]);
    var J = KJUR.asn1.ASN1Util.oidHexToInt(Y);
    var C = KJUR.asn1.x509.OID.oid2atype(J);
    var V = L(p, S[1]);
    var W = hextorstr(V);
    return C + "=" + W;
};

X509.getPublicKeyFromCertHex = function (p) {
    var n = new X509();
    return n.readCertHex(p), n.getPublicKey();
};

X509.getPublicKeyFromCertPEM = function (p) {
    var n = new X509();
    return n.readCertPEM(p), n.getPublicKey();
};

X509.getPublicKeyInfoPropOfCertPEM = function (p) {
    var n = ASN1HEX;
    var A = n.getVbyList;
    var L = {};
    var S;
    var Y;
    var J;
    return L.algparam = null, S = new X509(), S.readCertPEM(p), Y = S.getPublicKeyHex(), L.keyhex = A(Y, 0, [1], "03").substr(2), L.algoid = A(Y, 0, [0, 0], "06"), L.algoid === "2a8648ce3d0201" && (L.algparam = A(Y, 0, [0, 1], "06")), L;
};

X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"];

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
    KJUR.jws = {};
}

KJUR.jws.JWS = function () {
    var p = KJUR;
    var n = p.jws.JWS;
    var A = n.isSafeJSONString;

    this.parseJWS = function (L, S) {
        if (this.parsedJWS !== undefined && (S || this.parsedJWS.sigvalH !== undefined)) return;
        var Y = L.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);
        if (Y == null) throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
        var J = Y[1];
        var C = Y[2];
        var V = Y[3];
        var W = J + "." + C;
        this.parsedJWS = {};
        this.parsedJWS.headB64U = J;
        this.parsedJWS.payloadB64U = C;
        this.parsedJWS.sigvalB64U = V;
        this.parsedJWS.si = W;

        if (!S) {
            var R = b64utohex(V);
            var B = parseBigInt(R, 16);
            this.parsedJWS.sigvalH = R;
            this.parsedJWS.sigvalBI = B;
        }

        var F = b64utoutf8(J);
        var E = b64utoutf8(C);
        this.parsedJWS.headS = F;
        this.parsedJWS.payloadS = E;
        if (!A(F, this.parsedJWS, "headP")) throw "malformed JSON string for JWS Head: " + F;
    };
};

KJUR.jws.JWS.sign = function (L, S, Y, J, C) {
    var V = KJUR;
    var W = V.jws;
    var R = W.JWS;
    var B = R.readSafeJSONString;
    var F = R.isSafeJSONString;
    var E = V.crypto;
    var I = E.ECDSA;
    var K = E.Mac;
    var T = E.Signature;
    var Z = JSON;
    var M;
    var U;
    var H;
    if (typeof S != "string" && typeof S != "object") throw "spHeader must be JSON string or object: " + S;

    if (typeof S == "object") {
        U = S;
        M = Z.stringify(U);
    }

    if (typeof S == "string") {
        M = S;
        if (!F(M)) throw "JWS Head is not safe JSON string: " + M;
        U = B(M);
    }

    H = Y;

    if (typeof Y == "object") {
        H = Z.stringify(Y);
    }

    if ((L == "" || L == null) && U.alg !== undefined) {
        L = U.alg;
    }

    if (L != "" && L != null && U.alg === undefined) {
        U.alg = L;
        M = Z.stringify(U);
    }

    if (L !== U.alg) throw "alg and sHeader.alg doesn't match: " + L + "!=" + U.alg;
    var O = null;
    if (R.jwsalg2sigalg[L] === undefined) throw "unsupported alg name: " + L;else O = R.jwsalg2sigalg[L];
    var X = utf8tob64u(M);
    var G = utf8tob64u(H);
    var N = X + "." + G;
    var D = "";

    if (O.substr(0, 4) == "Hmac") {
        if (J === undefined) throw "mac key shall be specified for HS* alg";
        var Q = new K({
            "alg": O,
            "prov": "cryptojs",
            "pass": J
        });
        Q.updateString(N);
        D = Q.doFinal();
    } else {
        if (O.indexOf("withECDSA") != -1) {
            var P = new T({
                "alg": O
            });
            P.init(J, C);
            P.updateString(N);
            var p0 = P.sign();
            D = KJUR.crypto.ECDSA.asn1SigToConcatSig(p0);
        } else {
            if (O != "none") {
                var P = new T({
                    "alg": O
                });
                P.init(J, C);
                P.updateString(N);
                D = P.sign();
            }
        }
    }

    var p1 = hextob64u(D);
    return N + "." + p1;
};

KJUR.jws.JWS.verify = function (a, L, S) {
    var Y = KJUR;
    var J = Y.jws;
    var C = J.JWS;
    var V = C.readSafeJSONString;
    var W = Y.crypto;
    var R = W.ECDSA;
    var F = W.Mac;
    var E = W.Signature;
    var I;

    if (typeof RSAKey !== undefined) {
        I = RSAKey;
    }

    var K = a.split(".");
    if (K.length !== 3) return ![];
    var T = K[0];
    var Z = K[1];
    var M = T + "." + Z;
    var U = b64utohex(K[2]);
    var H = V(b64utoutf8(K[0]));
    var O = null;
    var X = null;
    if (H.alg === undefined) throw "algorithm not specified in header";else {
        O = H.alg;
        X = O.substr(0, 2);
    }

    if (S != null && Object.prototype.toString.call(S) === "[object Array]" && S.length > 0) {
        var G = ":" + S.join(":") + ":";
        if (G.indexOf(":" + O + ":") == -1) throw "algorithm '" + O + "' not accepted in the list";
    }

    if (O != "none" && L === null) throw "key shall be specified to verify.";

    if (typeof L == "string" && L.indexOf("-----BEGIN ") != -1) {
        L = KEYUTIL.getKey(L);
    }

    if (X == "RS" || X == "PS") {
        if (!(L instanceof I)) throw "key shall be a RSAKey obj for RS* and PS* algs";
    }

    if (X == "ES") {
        if (!(L instanceof R)) throw "key shall be a ECDSA obj for ES* algs";
    }

    if (O == "none") {}

    var N = null;
    if (C.jwsalg2sigalg[H.alg] === undefined) throw "unsupported alg name: " + O;else N = C.jwsalg2sigalg[O];
    if (N == "none") throw "not supported";else {
        if (N.substr(0, 4) == "Hmac") {
            var D = null;
            if (L === undefined) throw "hexadecimal key shall be specified for HMAC";
            var Q = new F({
                "alg": N,
                "pass": L
            });
            return Q.updateString(M), D = Q.doFinal(), U == D;
        } else {
            if (N.indexOf("withECDSA") != -1) {
                var P = null;

                try {
                    P = R.concatSigToASN1Sig(U);
                } catch (p1) {
                    console.log(p1);
                    return ![];
                }

                var p0 = new E({
                    "alg": N
                });
                return p0.init(L), p0.updateString(M), p0.verify(P);
            } else {
                var p0 = new E({
                    "alg": N
                });
                return p0.init(L), p0.updateString(M), p0.verify(U);
            }
        }
    }
};

KJUR.jws.JWS.parse = function (p) {
    var n = p.split(".");
    var a = {};
    var A;
    var L;
    var S;
    if (n.length != 2 && n.length != 3) throw "malformed sJWS: wrong number of '.' splitted elements";
    return A = n[0], L = n[1], n.length == 3 && (S = n[2]), a.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(A)), a.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(L)), a.headerPP = JSON.stringify(a.headerObj, null, "  "), a.payloadObj == null ? a.payloadPP = b64utoutf8(L) : a.payloadPP = JSON.stringify(a.payloadObj, null, "  "), S !== undefined && (a.sigHex = b64utohex(S)), a;
};

KJUR.jws.JWS.verifyJWT = function (a, A, L) {
    var S = KJUR;
    var Y = S.jws;
    var J = Y.JWS;
    var C = J.readSafeJSONString;
    var V = J.inArray;
    var W = J.includedArray;
    var R = a.split(".");
    var B = R[0];
    var F = R[1];
    var E = B + "." + F;
    var s = b64utohex(R[2]);
    var I = C(b64utoutf8(B));
    var K = C(b64utoutf8(F));
    if (I.alg === undefined) return ![];
    if (L.alg === undefined) throw "acceptField.alg shall be specified";
    if (!V(I.alg, L.alg)) return ![];

    if (K.iss !== undefined && typeof L.iss === "object") {
        if (!V(K.iss, L.iss)) return ![];
    }

    if (K.sub !== undefined && typeof L.sub === "object") {
        if (!V(K.sub, L.sub)) return ![];
    }

    if (K.aud !== undefined && typeof L.aud === "object") {
        if (typeof K.aud == "string") {
            if (!V(K.aud, L.aud)) return ![];
        } else {
            if (typeof K.aud == "object") {
                if (!W(K.aud, L.aud)) return ![];
            }
        }
    }

    var T = Y.IntDate.getNow();

    if (L.verifyAt !== undefined && typeof L.verifyAt === "number") {
        T = L.verifyAt;
    }

    if (L.gracePeriod === undefined || typeof L.gracePeriod !== "number") {
        L.gracePeriod = 0;
    }

    if (K.exp !== undefined && typeof K.exp == "number") {
        if (K.exp + L.gracePeriod < T) return ![];
    }

    if (K.nbf !== undefined && typeof K.nbf == "number") {
        if (T < K.nbf - L.gracePeriod) return ![];
    }

    if (K.iat !== undefined && typeof K.iat == "number") {
        if (T < K.iat - L.gracePeriod) return ![];
    }

    if (K.jti !== undefined && L.jti !== undefined) {
        if (K.jti !== L.jti) return ![];
    }

    if (!J.verify(a, A, L.alg)) return ![];
    return !![];
};

KJUR.jws.JWS.includedArray = function (p, n) {
    var A = KJUR.jws.JWS.inArray;
    if (p === null) return ![];
    if (typeof p !== "object") return ![];
    if (typeof p.length !== "number") return ![];

    for (var L = 0; L < p.length; L++) {
        if (!A(p[L], n)) return ![];
    }

    return !![];
};

KJUR.jws.JWS.inArray = function (p, n) {
    if (n === null) return ![];
    if (typeof n !== "object") return ![];
    if (typeof n.length !== "number") return ![];

    for (var a = 0; a < n.length; a++) {
        if (n[a] == p) return !![];
    }

    return ![];
};

KJUR.jws.JWS.jwsalg2sigalg = {
    "HS256": "HmacSHA256",
    "HS384": "HmacSHA384",
    "HS512": "HmacSHA512",
    "RS256": "SHA256withRSA",
    "RS384": "SHA384withRSA",
    "RS512": "SHA512withRSA",
    "ES256": "SHA256withECDSA",
    "ES384": "SHA384withECDSA",
    "PS256": "SHA256withRSAandMGF1",
    "PS384": "SHA384withRSAandMGF1",
    "PS512": "SHA512withRSAandMGF1",
    "none": "none"
};

KJUR.jws.JWS.isSafeJSONString = function (p, n, A) {
    var L = null;

    try {
        L = jsonParse(p);
        if (typeof L != "object") return 0;
        if (L.constructor === Array) return 0;
        return n && (n[A] = L), 1;
    } catch (g) {
        console.log(g);
        return 0;
    }
};

KJUR.jws.JWS.readSafeJSONString = function (p) {
    var n = null;

    try {
        n = jsonParse(p);
        if (typeof n != "object") return null;
        if (n.constructor === Array) return null;
        return n;
    } catch (A) {
        console.log(A);
        return null;
    }
};

KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function (p) {
    var n = p.match(/^[^.]+\.[^.]+\.([^.]+)$/);
    if (n == null) throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
    return n[1];
};

KJUR.jws.JWS.getJWKthumbprint = function (p) {
    if (p.kty !== "RSA" && p.kty !== "EC" && p.kty !== "oct") throw "unsupported algorithm for JWK Thumprint";
    var n = "{";

    if (p.kty === "RSA") {
        if (typeof p.n != "string" || typeof p.e != "string") throw "wrong n and e value for RSA key";
        n += "\"e\":\"" + p.e + "\",";
        n += "\"kty\":\"" + p.kty + "\",";
        n += "\"n\":\"" + p.n + "\"}";
    } else {
        if (p.kty === "EC") {
            if (typeof p.crv != "string" || typeof p.x != "string" || typeof p.y != "string") throw "wrong crv, x and y value for EC key";
            n += "\"crv\":\"" + p.crv + "\",";
            n += "\"kty\":\"" + p.kty + "\",";
            n += "\"x\":\"" + p.x + "\",";
            n += "\"y\":\"" + p.y + "\"}";
        } else {
            if (p.kty === "oct") {
                if (typeof p.k != "string") throw "wrong k value for oct(symmetric) key";
                n += "\"kty\":\"" + p.kty + "\",";
                n += "\"k\":\"" + p.k + "\"}";
            }
        }
    }

    var A = rstrtohex(n);
    var L = KJUR.crypto.Util.hashHex(A, "sha256");
    var g = hextob64u(L);
    return g;
};

KJUR.jws.IntDate = {};

KJUR.jws.IntDate.get = function (p) {
    var n = KJUR.jws.IntDate;
    var A = n.getNow;
    var L = n.getZulu;
    if (p == "now") return A();else {
        if (p == "now + 1hour") return A() + 3600;else {
            if (p == "now + 1day") return A() + 86400;else {
                if (p == "now + 1month") return A() + 2592000;else {
                    if (p == "now + 1year") return A() + 31536000;else {
                        if (p.match(/Z$/)) return L(p);else {
                            if (p.match(/^[0-9]+$/)) return parseInt(p);
                        }
                    }
                }
            }
        }
    }
    throw "unsupported format: " + p;
};

KJUR.jws.IntDate.getZulu = function (p) {
    return zulutosec(p);
};

KJUR.jws.IntDate.getNow = function () {
    var p = ~~(new Date() / 1000);
    return p;
};

KJUR.jws.IntDate.intDate2UTCString = function (p) {
    var n = new Date(p * 1000);
    return n.toUTCString();
};

KJUR.jws.IntDate.intDate2Zulu = function (p) {
    var n = new Date(p * 1000);
    var A = ("0000" + n.getUTCFullYear()).slice(-4);
    var L = ("00" + (n.getUTCMonth() + 1)).slice(-2);
    var S = ("00" + n.getUTCDate()).slice(-2);
    var Y = ("00" + n.getUTCHours()).slice(-2);
    var J = ("00" + n.getUTCMinutes()).slice(-2);
    var C = ("00" + n.getUTCSeconds()).slice(-2);
    return A + L + S + Y + J + C + "Z";
};

if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {};
}

if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
    KJUR.jws = {};
}

KJUR.jws.JWSJS = function () {
    var p = KJUR;
    var n = p.jws;
    var A = n.JWS;
    var L = A.readSafeJSONString;
    this.aHeader = [];
    this.sPayload = "";
    this.aSignature = [];

    this.init = function () {
        this.aHeader = [];
        this.sPayload = undefined;
        this.aSignature = [];
    };

    this.initWithJWS = function (g) {
        this.init();
        var S = g.split(".");
        if (S.length != 3) throw "malformed input JWS";
        this.aHeader.push(S[0]);
        this.sPayload = S[1];
        this.aSignature.push(S[2]);
    };

    this.addSignature = function (S, Y, J, C) {
        if (this.sPayload === undefined || this.sPayload === null) throw "there's no JSON-JS signature to add.";
        var V = this.aHeader.length;
        if (this.aHeader.length != this.aSignature.length) throw "aHeader.length != aSignature.length";

        try {
            var W = KJUR.jws.JWS.sign(S, Y, this.sPayload, J, C);
            var R = W.split(".");
            var B = R[0];
            var F = R[2];
            this.aHeader.push(R[0]);
            this.aSignature.push(R[2]);
        } catch (E) {
            console.log(E);

            if (this.aHeader.length > V) {
                this.aHeader.pop();
            }

            if (this.aSignature.length > V) {
                this.aSignature.pop();
            }

            throw "addSignature failed: " + E;
        }
    };

    this.verifyAll = function (S) {
        if (this.aHeader.length !== S.length || this.aSignature.length !== S.length) return ![];

        for (var Y = 0; Y < S.length; Y++) {
            var J = S[Y];
            if (J.length !== 2) return ![];
            var C = this.verifyNth(Y, J[0], J[1]);
            if (C === ![]) return ![];
        }

        return !![];
    };

    this.verifyNth = function (S, Y, J) {
        if (this.aHeader.length <= S || this.aSignature.length <= S) return ![];
        var C = this.aHeader[S];
        var V = this.aSignature[S];
        var W = C + "." + this.sPayload + "." + V;
        var R = ![];

        try {
            R = A.verify(W, Y, J);
        } catch (B) {
            console.log(B);
            return ![];
        }

        return R;
    };

    this.readJWSJS = function (S) {
        if (typeof S === "string") {
            var Y = L(S);
            if (Y == null) throw "argument is not safe JSON object string";
            this.aHeader = Y.headers;
            this.sPayload = Y.payload;
            this.aSignature = Y.signatures;
        } else try {
            if (S.headers.length > 0) this.aHeader = S.headers;else throw "malformed header";
            if (typeof S.payload === "string") this.sPayload = S.payload;else throw "malformed signatures";
            if (S.signatures.length > 0) this.aSignature = S.signatures;else throw "malformed signatures";
        } catch (J) {
            console.log(J);
            throw "malformed JWS-JS JSON object: " + J;
        }
    };

    this.getJSON = function () {
        return {
            "headers": this.aHeader,
            "payload": this.sPayload,
            "signatures": this.aSignature
        };
    };

    this.isEmpty = function () {
        if (this.aHeader.length == 0) return 1;
        return 0;
    };
};

var url = "/api/challenge56";

call = function (p) {
    var n = {
        "page": String(p)
    };
    $.ajax({
        "url": url,
        "dataType": "json",
        "async": !![],
        "data": n,
        "type": "POST",
        "beforeSend": function (c) {
            (function () {})();
        },
        "success": function (c) {
            var a = "<tr class=\"odd\">";
            var A = new JSEncrypt();
            A.setPrivateKey(PVA.toString("ascii"));
            datas = JSON.parse(A.decrypt(c.result)).data;
            $.each(datas, function (L, g) {
                var S = "<td class=\"info\">" + g.value + "</td>";
                a += S;
            });
            $(".data").text("").append(a + "</tr>");
        },
        "complete": function () {
            $("#page").paging({
                "nowPage": p,
                "pageNum": 100,
                "buttonNum": 7,
                "canJump": 1,
                "showOne": 1,
                "callback": function (c) {
                    call(c);
                }
            });
        },
        "error": function () {
            alert("检测到异常情况，请关闭抓包工具，使用chrome浏览器再试试");
            location.reload();
        }
    });
};

call(1);