www.suntrust.com Open in urlscan Pro
2600:9000:2250:ca00:5:842a:2dc0:93a1  Public Scan

Submitted URL: https://click.mail.mybrokerageinfo.com/?qs=e17ed6303e94f6444fdd7cf332a7212c76028c57cb3dd54017b4761191991e5056f5e863144cb8c3738110e5c0bd...
Effective URL: https://www.suntrust.com/lp/investment-account-access
Submission: On November 01 via manual from US — Scanned from DE

Form analysis 3 forms found in the DOM

GET /search#all_results

<form id="search-box-form" method="GET" action="/search#all_results" class="sun-header-search-form" role="search">
  <a href="javascript:void(0);" id="adv_search">
            <span class="sun-header-search-icon" data-sun-toggle-overlay-target="sun-header-search-form"></span>
          </a>
  <div class="sun-header-search-field sun-hidden">
    <label class="sun-header-search-label" for="sun-header-search-input">Search</label>
    <input name="searchTerm" tabindex="-1" type="search" id="sun-header-search-input" class="sun-header-search-input" placeholder="Search" onfocus="this.placeholder=''" onblur="this.placeholder='Search'">
    <button type="reset" class="sun-header-search-cancel-button">
      <span class="sun-button-text">Clear</span>
    </button>
  </div>
</form>

Name: herosignon-OLBPOST https://login.onlinebanking.suntrust.com/authentication/post

<form action="https://login.onlinebanking.suntrust.com/authentication/post" class="signOnLoginForm herosignon-OLB" method="post" name="herosignon-OLB" autocomplete="off" data-appid="herosignon-OLB" data-gateway="11g" data-apptype="OLB">
  <div class="suntrust-login-form-field">
    <label for="userID" class="suntrust-accessible-text">User ID</label>
    <input type="text" title="User ID" class="suntrust-login-input suntrust-login-user-input" placeholder="User ID" id="userID" autocomplete="off" value="">
    <input type="hidden" name="username" class="suntrust-login-hidden-user-id" value="">
    <input type="hidden" name="isEncrypted" class="suntrust-login-input-is-encrypted" value="true">
    <input type="hidden" name="trk" class="suntrust-trk-input" value="">
    <input type="hidden" name="devicePrint" class="suntrust-deviceprint-input" value="">
    <input type="hidden" name="geoLocation" class="suntrust-geolocation-input" value="">
  </div>
  <div class="suntrust-login-form-field suntrust-remember-me-accessible">
    <label for="sign-on-herosignon-OLB-password" class="suntrust-accessible-text">Password</label>
    <input type="password" placeholder="Password" class="suntrust-login-input suntrust-login-password-herosignon" id="sign-on-herosignon-OLB-password" title="Password" value="" autocomplete="off">
    <input type="hidden" name="password" class="hiddenPassword" value="">
    <input type="hidden" name="rmUsernameSet" value="false">
    <input type="hidden" class="hiddenPublicKey" value="-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlrOQOKQbXsrk+YW69TAq
mUJeR3CkiXj+HNHnQSFMLwuUwLUYGuTWv0ALs9cDcQ0lTwkv778bwjyLsaBDuZHy
SFJD8R284QxtP4tud4zfWJFFlk2I5FP4jMtkzfozLa06+sMG6z82kH7dYwIxrQiW
Z5i2sCoVfKejw/ZDN0rXLAaLEU6gNZXBLXTe+547Z+ZoIF1TOhV4bCMZmx8j1Ib9
rCqBRfIDkuMMxpMvAosy55afNVjJG+6DlQLRuqVihK7nxaX3rd+JQtSjIEtYK1eJ
cgqIvztR7/zmQeZvKFW2qXJ2rOkNpMJZNKmT2/ga+oAkmzUlgwrk6Ux2ecYwp2HbfwIDAQAB
-----END PUBLIC KEY-----">
    <div class="suntrust-remember-me-field">
      <div class="sun-checkbox-input-container" id="uniform-sign-on-herosignon-OLB-check-hero"><span><input type="checkbox" id="sign-on-herosignon-OLB-check-hero" data-suntrust-class="suntrust-checkbox" class="suntrust-login-checkbox"
            name="chkRememberUser"></span></div>
      <input type="hidden" name="rememberMe" class="suntrust-login-checkbox-hidden" value="false">
      <label for="sign-on-herosignon-OLB-check-hero" class="suntrust-checkbox-label">Remember User ID</label>
    </div>
    <div class="suntrust-login-button-herosignon-container">
      <input class="suntrust-login-button-herosignon" type="submit" value="Sign On">
    </div>
    <div>
      <input type="hidden" name="successurl" value="https://www1.onlinebanking.suntrust.com/UI/authenticate">
      <input type="hidden" name="type" value="P6OLBRM">
    </div>
    <script type="text/javascript">
      /*
       * jsrsasign 4.2.2 (c) 2010-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      /*
      yahoo-min.js
      Copyright (c) 2011, Yahoo! Inc. All rights reserved.
      Code licensed under the BSD License:
      http://developer.yahoo.com/yui/license.html
      version: 2.9.0
      */
      if (typeof YAHOO == "undefined" || !YAHOO) {
        var YAHOO = {};
      }
      YAHOO.namespace = function() {
        var b = arguments,
          g = null,
          e, c, f;
        for (e = 0; e < b.length; e = e + 1) {
          f = ("" + b[e]).split(".");
          g = YAHOO;
          for (c = (f[0] == "YAHOO") ? 1 : 0; c < f.length; c = c + 1) {
            g[f[c]] = g[f[c]] || {};
            g = g[f[c]];
          }
        }
        return g;
      };
      YAHOO.log = function(d, a, c) {
        var b = YAHOO.widget.Logger;
        if (b && b.log) {
          return b.log(d, a, c);
        } else {
          return false;
        }
      };
      YAHOO.register = function(a, f, e) {
        var k = YAHOO.env.modules,
          c, j, h, g, d;
        if (!k[a]) {
          k[a] = {
            versions: [],
            builds: []
          };
        }
        c = k[a];
        j = e.version;
        h = e.build;
        g = YAHOO.env.listeners;
        c.name = a;
        c.version = j;
        c.build = h;
        c.versions.push(j);
        c.builds.push(h);
        c.mainClass = f;
        for (d = 0; d < g.length; d = d + 1) {
          g[d](c);
        }
        if (f) {
          f.VERSION = j;
          f.BUILD = h;
        } else {
          YAHOO.log("mainClass is undefined for module " + a, "warn");
        }
      };
      YAHOO.env = YAHOO.env || {
        modules: [],
        listeners: []
      };
      YAHOO.env.getVersion = function(a) {
        return YAHOO.env.modules[a] || null;
      };
      YAHOO.env.parseUA = function(d) {
        var e = function(i) {
            var j = 0;
            return parseFloat(i.replace(/\./g, function() {
              return (j++ == 1) ? "" : ".";
            }));
          },
          h = navigator,
          g = {
            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: h && h.cajaVersion,
            secure: false,
            os: null
          },
          c = d || (navigator && navigator.userAgent),
          f = window && window.location,
          b = f && f.href,
          a;
        g.secure = b && (b.toLowerCase().indexOf("https") === 0);
        if (c) {
          if ((/windows|win32/i).test(c)) {
            g.os = "windows";
          } else {
            if ((/macintosh/i).test(c)) {
              g.os = "macintosh";
            } else {
              if ((/rhino/i).test(c)) {
                g.os = "rhino";
              }
            }
          }
          if ((/KHTML/).test(c)) {
            g.webkit = 1;
          }
          a = c.match(/AppleWebKit\/([^\s]*)/);
          if (a && a[1]) {
            g.webkit = e(a[1]);
            if (/ Mobile\//.test(c)) {
              g.mobile = "Apple";
              a = c.match(/OS ([^\s]*)/);
              if (a && a[1]) {
                a = e(a[1].replace("_", "."));
              }
              g.ios = a;
              g.ipad = g.ipod = g.iphone = 0;
              a = c.match(/iPad|iPod|iPhone/);
              if (a && a[0]) {
                g[a[0].toLowerCase()] = g.ios;
              }
            } else {
              a = c.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);
              if (a) {
                g.mobile = a[0];
              }
              if (/webOS/.test(c)) {
                g.mobile = "WebOS";
                a = c.match(/webOS\/([^\s]*);/);
                if (a && a[1]) {
                  g.webos = e(a[1]);
                }
              }
              if (/ Android/.test(c)) {
                g.mobile = "Android";
                a = c.match(/Android ([^\s]*);/);
                if (a && a[1]) {
                  g.android = e(a[1]);
                }
              }
            }
            a = c.match(/Chrome\/([^\s]*)/);
            if (a && a[1]) {
              g.chrome = e(a[1]);
            } else {
              a = c.match(/AdobeAIR\/([^\s]*)/);
              if (a) {
                g.air = a[0];
              }
            }
          }
          if (!g.webkit) {
            a = c.match(/Opera[\s\/]([^\s]*)/);
            if (a && a[1]) {
              g.opera = e(a[1]);
              a = c.match(/Version\/([^\s]*)/);
              if (a && a[1]) {
                g.opera = e(a[1]);
              }
              a = c.match(/Opera Mini[^;]*/);
              if (a) {
                g.mobile = a[0];
              }
            } else {
              a = c.match(/MSIE\s([^;]*)/);
              if (a && a[1]) {
                g.ie = e(a[1]);
              } else {
                a = c.match(/Gecko\/([^\s]*)/);
                if (a) {
                  g.gecko = 1;
                  a = c.match(/rv:([^\s\)]*)/);
                  if (a && a[1]) {
                    g.gecko = e(a[1]);
                  }
                }
              }
            }
          }
        }
        return g;
      };
      YAHOO.env.ua = YAHOO.env.parseUA();
      (function() {
        YAHOO.namespace("util", "widget", "example");
        if ("undefined" !== typeof YAHOO_config) {
          var b = YAHOO_config.listener,
            a = YAHOO.env.listeners,
            d = true,
            c;
          if (b) {
            for (c = 0; c < a.length; c++) {
              if (a[c] == b) {
                d = false;
                break;
              }
            }
            if (d) {
              a.push(b);
            }
          }
        }
      })();
      YAHOO.lang = YAHOO.lang || {};
      (function() {
        var f = YAHOO.lang,
          a = Object.prototype,
          c = "[object Array]",
          h = "[object Function]",
          i = "[object Object]",
          b = [],
          g = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': "&quot;",
            "'": "&#x27;",
            "/": "&#x2F;",
            "`": "&#x60;"
          },
          d = ["toString", "valueOf"],
          e = {
            isArray: function(j) {
              return a.toString.apply(j) === c;
            },
            isBoolean: function(j) {
              return typeof j === "boolean";
            },
            isFunction: function(j) {
              return (typeof j === "function") || a.toString.apply(j) === h;
            },
            isNull: function(j) {
              return j === null;
            },
            isNumber: function(j) {
              return typeof j === "number" && isFinite(j);
            },
            isObject: function(j) {
              return (j && (typeof j === "object" || f.isFunction(j))) || false;
            },
            isString: function(j) {
              return typeof j === "string";
            },
            isUndefined: function(j) {
              return typeof j === "undefined";
            },
            _IEEnumFix: (YAHOO.env.ua.ie) ? function(l, k) {
              var j, n, m;
              for (j = 0; j < d.length; j = j + 1) {
                n = d[j];
                m = k[n];
                if (f.isFunction(m) && m != a[n]) {
                  l[n] = m;
                }
              }
            } : function() {},
            escapeHTML: function(j) {
              return j.replace(/[&<>"'\/`]/g, function(k) {
                return g[k];
              });
            },
            extend: function(m, n, l) {
              if (!n || !m) {
                throw new Error("extend failed, please check that " + "all dependencies are included.");
              }
              var k = function() {},
                j;
              k.prototype = n.prototype;
              m.prototype = new k();
              m.prototype.constructor = m;
              m.superclass = n.prototype;
              if (n.prototype.constructor == a.constructor) {
                n.prototype.constructor = n;
              }
              if (l) {
                for (j in l) {
                  if (f.hasOwnProperty(l, j)) {
                    m.prototype[j] = l[j];
                  }
                }
                f._IEEnumFix(m.prototype, l);
              }
            },
            augmentObject: function(n, m) {
              if (!m || !n) {
                throw new Error("Absorb failed, verify dependencies.");
              }
              var j = arguments,
                l, o, k = j[2];
              if (k && k !== true) {
                for (l = 2; l < j.length; l = l + 1) {
                  n[j[l]] = m[j[l]];
                }
              } else {
                for (o in m) {
                  if (k || !(o in n)) {
                    n[o] = m[o];
                  }
                }
                f._IEEnumFix(n, m);
              }
              return n;
            },
            augmentProto: function(m, l) {
              if (!l || !m) {
                throw new Error("Augment failed, verify dependencies.");
              }
              var j = [m.prototype, l.prototype],
                k;
              for (k = 2; k < arguments.length; k = k + 1) {
                j.push(arguments[k]);
              }
              f.augmentObject.apply(this, j);
              return m;
            },
            dump: function(j, p) {
              var l, n, r = [],
                t = "{...}",
                k = "f(){...}",
                q = ", ",
                m = " => ";
              if (!f.isObject(j)) {
                return j + "";
              } else {
                if (j instanceof Date || ("nodeType" in j && "tagName" in j)) {
                  return j;
                } else {
                  if (f.isFunction(j)) {
                    return k;
                  }
                }
              }
              p = (f.isNumber(p)) ? p : 3;
              if (f.isArray(j)) {
                r.push("[");
                for (l = 0, n = j.length; l < n; l = l + 1) {
                  if (f.isObject(j[l])) {
                    r.push((p > 0) ? f.dump(j[l], p - 1) : t);
                  } else {
                    r.push(j[l]);
                  }
                  r.push(q);
                }
                if (r.length > 1) {
                  r.pop();
                }
                r.push("]");
              } else {
                r.push("{");
                for (l in j) {
                  if (f.hasOwnProperty(j, l)) {
                    r.push(l + m);
                    if (f.isObject(j[l])) {
                      r.push((p > 0) ? f.dump(j[l], p - 1) : t);
                    } else {
                      r.push(j[l]);
                    }
                    r.push(q);
                  }
                }
                if (r.length > 1) {
                  r.pop();
                }
                r.push("}");
              }
              return r.join("");
            },
            substitute: function(x, y, E, l) {
              var D, C, B, G, t, u, F = [],
                p, z = x.length,
                A = "dump",
                r = " ",
                q = "{",
                m = "}",
                n, w;
              for (;;) {
                D = x.lastIndexOf(q, z);
                if (D < 0) {
                  break;
                }
                C = x.indexOf(m, D);
                if (D + 1 > C) {
                  break;
                }
                p = x.substring(D + 1, C);
                G = p;
                u = null;
                B = G.indexOf(r);
                if (B > -1) {
                  u = G.substring(B + 1);
                  G = G.substring(0, B);
                }
                t = y[G];
                if (E) {
                  t = E(G, t, u);
                }
                if (f.isObject(t)) {
                  if (f.isArray(t)) {
                    t = f.dump(t, parseInt(u, 10));
                  } else {
                    u = u || "";
                    n = u.indexOf(A);
                    if (n > -1) {
                      u = u.substring(4);
                    }
                    w = t.toString();
                    if (w === i || n > -1) {
                      t = f.dump(t, parseInt(u, 10));
                    } else {
                      t = w;
                    }
                  }
                } else {
                  if (!f.isString(t) && !f.isNumber(t)) {
                    t = "~-" + F.length + "-~";
                    F[F.length] = p;
                  }
                }
                x = x.substring(0, D) + t + x.substring(C + 1);
                if (l === false) {
                  z = D - 1;
                }
              }
              for (D = F.length - 1; D >= 0; D = D - 1) {
                x = x.replace(new RegExp("~-" + D + "-~"), "{" + F[D] + "}", "g");
              }
              return x;
            },
            trim: function(j) {
              try {
                return j.replace(/^\s+|\s+$/g, "");
              } catch (k) {
                return j;
              }
            },
            merge: function() {
              var n = {},
                k = arguments,
                j = k.length,
                m;
              for (m = 0; m < j; m = m + 1) {
                f.augmentObject(n, k[m], true);
              }
              return n;
            },
            later: function(t, k, u, n, p) {
              t = t || 0;
              k = k || {};
              var l = u,
                s = n,
                q, j;
              if (f.isString(u)) {
                l = k[u];
              }
              if (!l) {
                throw new TypeError("method undefined");
              }
              if (!f.isUndefined(n) && !f.isArray(s)) {
                s = [n];
              }
              q = function() {
                l.apply(k, s || b);
              };
              j = (p) ? setInterval(q, t) : setTimeout(q, t);
              return {
                interval: p,
                cancel: function() {
                  if (this.interval) {
                    clearInterval(j);
                  } else {
                    clearTimeout(j);
                  }
                }
              };
            },
            isValue: function(j) {
              return (f.isObject(j) || f.isString(j) || f.isNumber(j) || f.isBoolean(j));
            }
          };
        f.hasOwnProperty = (a.hasOwnProperty) ? function(j, k) {
          return j && j.hasOwnProperty && j.hasOwnProperty(k);
        } : function(j, k) {
          return !f.isUndefined(j[k]) && j.constructor.prototype[k] !== j[k];
        };
        e.augmentObject(f, e, true);
        YAHOO.util.Lang = f;
        f.augment = f.augmentProto;
        YAHOO.augment = f.augmentProto;
        YAHOO.extend = f.extend;
      })();
      YAHOO.register("yahoo", YAHOO, {
        version: "2.9.0",
        build: "2800"
      });
      /*! CryptoJS v3.1.2 core-fix.js
       * code.google.com/p/crypto-js
       * (c) 2009-2013 by Jeff Mott. All rights reserved.
       * code.google.com/p/crypto-js/wiki/License
       * THIS IS FIX of 'core.js' to fix Hmac issue.
       * https://code.google.com/p/crypto-js/issues/detail?id=84
       * https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js
       */
      var CryptoJS = CryptoJS || (function(e, g) {
        var a = {};
        var b = a.lib = {};
        var j = b.Base = (function() {
          function n() {}
          return {
            extend: function(p) {
              n.prototype = this;
              var o = new n();
              if (p) {
                o.mixIn(p)
              }
              if (!o.hasOwnProperty("init")) {
                o.init = function() {
                  o.$super.init.apply(this, arguments)
                }
              }
              o.init.prototype = o;
              o.$super = this;
              return o
            },
            create: function() {
              var o = this.extend();
              o.init.apply(o, arguments);
              return o
            },
            init: function() {},
            mixIn: function(p) {
              for (var o in p) {
                if (p.hasOwnProperty(o)) {
                  this[o] = p[o]
                }
              }
              if (p.hasOwnProperty("toString")) {
                this.toString = p.toString
              }
            },
            clone: function() {
              return this.init.prototype.extend(this)
            }
          }
        }());
        var l = b.WordArray = j.extend({
          init: function(o, n) {
            o = this.words = o || [];
            if (n != g) {
              this.sigBytes = n
            } else {
              this.sigBytes = o.length * 4
            }
          },
          toString: function(n) {
            return (n || h).stringify(this)
          },
          concat: function(t) {
            var q = this.words;
            var p = t.words;
            var n = this.sigBytes;
            var s = t.sigBytes;
            this.clamp();
            if (n % 4) {
              for (var r = 0; r < s; r++) {
                var o = (p[r >>> 2] >>> (24 - (r % 4) * 8)) & 255;
                q[(n + r) >>> 2] |= o << (24 - ((n + r) % 4) * 8)
              }
            } else {
              for (var r = 0; r < s; r += 4) {
                q[(n + r) >>> 2] = p[r >>> 2]
              }
            }
            this.sigBytes += s;
            return this
          },
          clamp: function() {
            var o = this.words;
            var n = this.sigBytes;
            o[n >>> 2] &= 4294967295 << (32 - (n % 4) * 8);
            o.length = e.ceil(n / 4)
          },
          clone: function() {
            var n = j.clone.call(this);
            n.words = this.words.slice(0);
            return n
          },
          random: function(p) {
            var o = [];
            for (var n = 0; n < p; n += 4) {
              o.push((e.random() * 4294967296) | 0)
            }
            return new l.init(o, p)
          }
        });
        var m = a.enc = {};
        var h = m.Hex = {
          stringify: function(p) {
            var r = p.words;
            var o = p.sigBytes;
            var q = [];
            for (var n = 0; n < o; n++) {
              var s = (r[n >>> 2] >>> (24 - (n % 4) * 8)) & 255;
              q.push((s >>> 4).toString(16));
              q.push((s & 15).toString(16))
            }
            return q.join("")
          },
          parse: function(p) {
            var n = p.length;
            var q = [];
            for (var o = 0; o < n; o += 2) {
              q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << (24 - (o % 8) * 4)
            }
            return new l.init(q, n / 2)
          }
        };
        var d = m.Latin1 = {
          stringify: function(q) {
            var r = q.words;
            var p = q.sigBytes;
            var n = [];
            for (var o = 0; o < p; o++) {
              var s = (r[o >>> 2] >>> (24 - (o % 4) * 8)) & 255;
              n.push(String.fromCharCode(s))
            }
            return n.join("")
          },
          parse: function(p) {
            var n = p.length;
            var q = [];
            for (var o = 0; o < n; o++) {
              q[o >>> 2] |= (p.charCodeAt(o) & 255) << (24 - (o % 4) * 8)
            }
            return new l.init(q, n)
          }
        };
        var c = m.Utf8 = {
          stringify: function(n) {
            try {
              return decodeURIComponent(escape(d.stringify(n)))
            } catch (o) {
              throw new Error("Malformed UTF-8 data")
            }
          },
          parse: function(n) {
            return d.parse(unescape(encodeURIComponent(n)))
          }
        };
        var i = b.BufferedBlockAlgorithm = j.extend({
          reset: function() {
            this._data = new l.init();
            this._nDataBytes = 0
          },
          _append: function(n) {
            if (typeof n == "string") {
              n = c.parse(n)
            }
            this._data.concat(n);
            this._nDataBytes += n.sigBytes
          },
          _process: function(w) {
            var q = this._data;
            var x = q.words;
            var n = q.sigBytes;
            var t = this.blockSize;
            var v = t * 4;
            var u = n / v;
            if (w) {
              u = e.ceil(u)
            } else {
              u = e.max((u | 0) - this._minBufferSize, 0)
            }
            var s = u * t;
            var r = e.min(s * 4, n);
            if (s) {
              for (var p = 0; p < s; p += t) {
                this._doProcessBlock(x, p)
              }
              var o = x.splice(0, s);
              q.sigBytes -= r
            }
            return new l.init(o, r)
          },
          clone: function() {
            var n = j.clone.call(this);
            n._data = this._data.clone();
            return n
          },
          _minBufferSize: 0
        });
        var f = b.Hasher = i.extend({
          cfg: j.extend(),
          init: function(n) {
            this.cfg = this.cfg.extend(n);
            this.reset()
          },
          reset: function() {
            i.reset.call(this);
            this._doReset()
          },
          update: function(n) {
            this._append(n);
            this._process();
            return this
          },
          finalize: function(n) {
            if (n) {
              this._append(n)
            }
            var o = this._doFinalize();
            return o
          },
          blockSize: 512 / 32,
          _createHelper: function(n) {
            return function(p, o) {
              return new n.init(o).finalize(p)
            }
          },
          _createHmacHelper: function(n) {
            return function(p, o) {
              return new k.HMAC.init(n, o).finalize(p)
            }
          }
        });
        var k = a.algo = {};
        return a
      }(Math));
      /*
      CryptoJS v3.1.2 x64-core-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function(g) {
        var a = CryptoJS,
          f = a.lib,
          e = f.Base,
          h = f.WordArray,
          a = a.x64 = {};
        a.Word = e.extend({
          init: function(b, c) {
            this.high = b;
            this.low = c
          }
        });
        a.WordArray = e.extend({
          init: function(b, c) {
            b = this.words = b || [];
            this.sigBytes = c != g ? c : 8 * b.length
          },
          toX32: function() {
            for (var b = this.words, c = b.length, a = [], d = 0; d < c; d++) {
              var e = b[d];
              a.push(e.high);
              a.push(e.low)
            }
            return h.create(a, this.sigBytes)
          },
          clone: function() {
            for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a = c.length, d = 0; d < a; d++) c[d] = c[d].clone();
            return b
          }
        })
      })();
      /*
      CryptoJS v3.1.2 hmac-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var c = CryptoJS,
          k = c.enc.Utf8;
        c.algo.HMAC = c.lib.Base.extend({
          init: function(a, b) {
            a = this._hasher = new a.init;
            "string" == typeof b && (b = k.parse(b));
            var c = a.blockSize,
              e = 4 * c;
            b.sigBytes > e && (b = a.finalize(b));
            b.clamp();
            for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h = f.words, j = g.words, d = 0; d < c; d++) h[d] ^= 1549556828, j[d] ^= 909522486;
            f.sigBytes = g.sigBytes = e;
            this.reset()
          },
          reset: function() {
            var a = this._hasher;
            a.reset();
            a.update(this._iKey)
          },
          update: function(a) {
            this._hasher.update(a);
            return this
          },
          finalize: function(a) {
            var b = this._hasher;
            a = b.finalize(a);
            b.reset();
            return b.finalize(this._oKey.clone().concat(a))
          }
        })
      })();
      /*
      CryptoJS v3.1.2 sha256-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function(k) {
        for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function(q) {
            return 4294967296 * (q - (q | 0)) | 0
          }, l = 2, b = 0; 64 > b;) {
          var d;
          a: {
            d = l;
            for (var w = k.sqrt(d), r = 2; r <= w; r++)
              if (!(d % r)) {
                d = !1;
                break a
              } d = !0
          }
          d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);
          l++
        }
        var n = [],
          h = h.SHA256 = j.extend({
            _doReset: function() {
              this._hash = new v.init(s.slice(0))
            },
            _doProcessBlock: function(q, h) {
              for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) {
                if (16 > e) n[e] = q[h + e] | 0;
                else {
                  var m = n[e - 15],
                    p = n[e - 2];
                  n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16]
                }
                m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e];
                p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b);
                l = j;
                j = g;
                g = f;
                f = k + m | 0;
                k = b;
                b = d;
                d = c;
                c = m + p | 0
              }
              a[0] = a[0] + c | 0;
              a[1] = a[1] + d | 0;
              a[2] = a[2] + b | 0;
              a[3] = a[3] + k | 0;
              a[4] = a[4] + f | 0;
              a[5] = a[5] + g | 0;
              a[6] = a[6] + j | 0;
              a[7] = a[7] + l | 0
            },
            _doFinalize: function() {
              var d = this._data,
                b = d.words,
                a = 8 * this._nDataBytes,
                c = 8 * d.sigBytes;
              b[c >>> 5] |= 128 << 24 - c % 32;
              b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);
              b[(c + 64 >>> 9 << 4) + 15] = a;
              d.sigBytes = 4 * b.length;
              this._process();
              return this._hash
            },
            clone: function() {
              var b = j.clone.call(this);
              b._hash = this._hash.clone();
              return b
            }
          });
        g.SHA256 = j._createHelper(h);
        g.HmacSHA256 = j._createHmacHelper(h)
      })(Math);
      /*
      CryptoJS v3.1.2 sha224-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var b = CryptoJS,
          d = b.lib.WordArray,
          a = b.algo,
          c = a.SHA256,
          a = a.SHA224 = c.extend({
            _doReset: function() {
              this._hash = new d.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428])
            },
            _doFinalize: function() {
              var a = c._doFinalize.call(this);
              a.sigBytes -= 4;
              return a
            }
          });
        b.SHA224 = c._createHelper(a);
        b.HmacSHA224 = c._createHmacHelper(a)
      })();
      /*
      CryptoJS v3.1.2 sha512-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        function a() {
          return d.create.apply(d, arguments)
        }
        for (var n = CryptoJS, r = n.lib.Hasher, e = n.x64, d = e.Word, T = e.WordArray, e = n.algo, ea = [a(1116352408, 3609767458), a(1899447441, 602891725), a(3049323471, 3964484399), a(3921009573, 2173295548), a(961987163, 4081628472), a(
              1508970993, 3053834265), a(2453635748, 2937671579), a(2870763221, 3664609560), a(3624381080, 2734883394), a(310598401, 1164996542), a(607225278, 1323610764), a(1426881987, 3590304994), a(1925078388, 4068182383), a(2162078206,
              991336113), a(2614888103, 633803317),
            a(3248222580, 3479774868), a(3835390401, 2666613458), a(4022224774, 944711139), a(264347078, 2341262773), a(604807628, 2007800933), a(770255983, 1495990901), a(1249150122, 1856431235), a(1555081692, 3175218132), a(1996064986,
              2198950837), a(2554220882, 3999719339), a(2821834349, 766784016), a(2952996808, 2566594879), a(3210313671, 3203337956), a(3336571891, 1034457026), a(3584528711, 2466948901), a(113926993, 3758326383), a(338241895, 168717936), a(
              666307205, 1188179964), a(773529912, 1546045734), a(1294757372, 1522805485), a(1396182291, 2643833823), a(1695183700, 2343527390), a(1986661051, 1014477480), a(2177026350, 1206759142), a(2456956037, 344077627), a(2730485921,
              1290863460), a(2820302411, 3158454273), a(3259730800, 3505952657), a(3345764771, 106217008), a(3516065817, 3606008344), a(3600352804, 1432725776), a(4094571909, 1467031594), a(275423344, 851169720), a(430227734, 3100823752), a(
              506948616, 1363258195), a(659060556, 3750685593), a(883997877, 3785050280), a(958139571, 3318307427), a(1322822218, 3812723403), a(1537002063, 2003034995), a(1747873779, 3602036899),
            a(1955562222, 1575990012), a(2024104815, 1125592928), a(2227730452, 2716904306), a(2361852424, 442776044), a(2428436474, 593698344), a(2756734187, 3733110249), a(3204031479, 2999351573), a(3329325298, 3815920427), a(3391569614,
              3928383900), a(3515267271, 566280711), a(3940187606, 3454069534), a(4118630271, 4000239992), a(116418474, 1914138554), a(174292421, 2731055270), a(289380356, 3203993006), a(460393269, 320620315), a(685471733, 587496836), a(
              852142971, 1086792851), a(1017036298, 365543100), a(1126000580, 2618297676), a(1288033470, 3409855158), a(1501505948, 4234509866), a(1607167915, 987167468), a(1816402316, 1246189591)
          ], v = [], w = 0; 80 > w; w++) v[w] = a();
        e = e.SHA512 = r.extend({
          _doReset: function() {
            this._hash = new T.init([new d.init(1779033703, 4089235720), new d.init(3144134277, 2227873595), new d.init(1013904242, 4271175723), new d.init(2773480762, 1595750129), new d.init(1359893119, 2917565137), new d.init(2600822924,
              725511199), new d.init(528734635, 4215389547), new d.init(1541459225, 327033209)])
          },
          _doProcessBlock: function(a, d) {
            for (var f = this._hash.words,
                F = f[0], e = f[1], n = f[2], r = f[3], G = f[4], H = f[5], I = f[6], f = f[7], w = F.high, J = F.low, X = e.high, K = e.low, Y = n.high, L = n.low, Z = r.high, M = r.low, $ = G.high, N = G.low, aa = H.high, O = H.low, ba = I
                .high, P = I.low, ca = f.high, Q = f.low, k = w, g = J, z = X, x = K, A = Y, y = L, U = Z, B = M, l = $, h = N, R = aa, C = O, S = ba, D = P, V = ca, E = Q, m = 0; 80 > m; m++) {
              var s = v[m];
              if (16 > m) var j = s.high = a[d + 2 * m] | 0,
                b = s.low = a[d + 2 * m + 1] | 0;
              else {
                var j = v[m - 15],
                  b = j.high,
                  p = j.low,
                  j = (b >>> 1 | p << 31) ^ (b >>> 8 | p << 24) ^ b >>> 7,
                  p = (p >>> 1 | b << 31) ^ (p >>> 8 | b << 24) ^ (p >>> 7 | b << 25),
                  u = v[m - 2],
                  b = u.high,
                  c = u.low,
                  u = (b >>> 19 | c << 13) ^ (b << 3 | c >>> 29) ^ b >>> 6,
                  c = (c >>> 19 | b << 13) ^ (c << 3 | b >>> 29) ^ (c >>> 6 | b << 26),
                  b = v[m - 7],
                  W = b.high,
                  t = v[m - 16],
                  q = t.high,
                  t = t.low,
                  b = p + b.low,
                  j = j + W + (b >>> 0 < p >>> 0 ? 1 : 0),
                  b = b + c,
                  j = j + u + (b >>> 0 < c >>> 0 ? 1 : 0),
                  b = b + t,
                  j = j + q + (b >>> 0 < t >>> 0 ? 1 : 0);
                s.high = j;
                s.low = b
              }
              var W = l & R ^ ~l & S,
                t = h & C ^ ~h & D,
                s = k & z ^ k & A ^ z & A,
                T = g & x ^ g & y ^ x & y,
                p = (k >>> 28 | g << 4) ^ (k << 30 | g >>> 2) ^ (k << 25 | g >>> 7),
                u = (g >>> 28 | k << 4) ^ (g << 30 | k >>> 2) ^ (g << 25 | k >>> 7),
                c = ea[m],
                fa = c.high,
                da = c.low,
                c = E + ((h >>> 14 | l << 18) ^ (h >>> 18 | l << 14) ^ (h << 23 | l >>> 9)),
                q = V + ((l >>> 14 | h << 18) ^ (l >>> 18 | h << 14) ^ (l << 23 | h >>> 9)) + (c >>> 0 < E >>> 0 ? 1 : 0),
                c = c + t,
                q = q + W + (c >>> 0 < t >>> 0 ? 1 : 0),
                c = c + da,
                q = q + fa + (c >>> 0 < da >>> 0 ? 1 : 0),
                c = c + b,
                q = q + j + (c >>> 0 < b >>> 0 ? 1 : 0),
                b = u + T,
                s = p + s + (b >>> 0 < u >>> 0 ? 1 : 0),
                V = S,
                E = D,
                S = R,
                D = C,
                R = l,
                C = h,
                h = B + c | 0,
                l = U + q + (h >>> 0 < B >>> 0 ? 1 : 0) | 0,
                U = A,
                B = y,
                A = z,
                y = x,
                z = k,
                x = g,
                g = c + b | 0,
                k = q + s + (g >>> 0 < c >>> 0 ? 1 : 0) | 0
            }
            J = F.low = J + g;
            F.high = w + k + (J >>> 0 < g >>> 0 ? 1 : 0);
            K = e.low = K + x;
            e.high = X + z + (K >>> 0 < x >>> 0 ? 1 : 0);
            L = n.low = L + y;
            n.high = Y + A + (L >>> 0 < y >>> 0 ? 1 : 0);
            M = r.low = M + B;
            r.high = Z + U + (M >>> 0 < B >>> 0 ? 1 : 0);
            N = G.low = N + h;
            G.high = $ + l + (N >>> 0 < h >>> 0 ? 1 : 0);
            O = H.low = O + C;
            H.high = aa + R + (O >>> 0 < C >>> 0 ? 1 : 0);
            P = I.low = P + D;
            I.high = ba + S + (P >>> 0 < D >>> 0 ? 1 : 0);
            Q = f.low = Q + E;
            f.high = ca + V + (Q >>> 0 < E >>> 0 ? 1 : 0)
          },
          _doFinalize: function() {
            var a = this._data,
              d = a.words,
              f = 8 * this._nDataBytes,
              e = 8 * a.sigBytes;
            d[e >>> 5] |= 128 << 24 - e % 32;
            d[(e + 128 >>> 10 << 5) + 30] = Math.floor(f / 4294967296);
            d[(e + 128 >>> 10 << 5) + 31] = f;
            a.sigBytes = 4 * d.length;
            this._process();
            return this._hash.toX32()
          },
          clone: function() {
            var a = r.clone.call(this);
            a._hash = this._hash.clone();
            return a
          },
          blockSize: 32
        });
        n.SHA512 = r._createHelper(e);
        n.HmacSHA512 = r._createHmacHelper(e)
      })();
      /*
      CryptoJS v3.1.2 sha384-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var c = CryptoJS,
          a = c.x64,
          b = a.Word,
          e = a.WordArray,
          a = c.algo,
          d = a.SHA512,
          a = a.SHA384 = d.extend({
            _doReset: function() {
              this._hash = new e.init([new b.init(3418070365, 3238371032), new b.init(1654270250, 914150663), new b.init(2438529370, 812702999), new b.init(355462360, 4144912697), new b.init(1731405415, 4290775857), new b.init(2394180231,
                1750603025), new b.init(3675008525, 1694076839), new b.init(1203062813, 3204075428)])
            },
            _doFinalize: function() {
              var a = d._doFinalize.call(this);
              a.sigBytes -= 16;
              return a
            }
          });
        c.SHA384 = d._createHelper(a);
        c.HmacSHA384 = d._createHmacHelper(a)
      })();
      /*
      CryptoJS v3.1.2 md5-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function(E) {
        function h(a, f, g, j, p, h, k) {
          a = a + (f & g | ~f & j) + p + k;
          return (a << h | a >>> 32 - h) + f
        }

        function k(a, f, g, j, p, h, k) {
          a = a + (f & j | g & ~j) + p + k;
          return (a << h | a >>> 32 - h) + f
        }

        function l(a, f, g, j, h, k, l) {
          a = a + (f ^ g ^ j) + h + l;
          return (a << k | a >>> 32 - k) + f
        }

        function n(a, f, g, j, h, k, l) {
          a = a + (g ^ (f | ~j)) + h + l;
          return (a << k | a >>> 32 - k) + f
        }
        for (var r = CryptoJS, q = r.lib, F = q.WordArray, s = q.Hasher, q = r.algo, a = [], t = 0; 64 > t; t++) a[t] = 4294967296 * E.abs(E.sin(t + 1)) | 0;
        q = q.MD5 = s.extend({
          _doReset: function() {
            this._hash = new F.init([1732584193, 4023233417, 2562383102, 271733878])
          },
          _doProcessBlock: function(m, f) {
            for (var g = 0; 16 > g; g++) {
              var j = f + g,
                p = m[j];
              m[j] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360
            }
            var g = this._hash.words,
              j = m[f + 0],
              p = m[f + 1],
              q = m[f + 2],
              r = m[f + 3],
              s = m[f + 4],
              t = m[f + 5],
              u = m[f + 6],
              v = m[f + 7],
              w = m[f + 8],
              x = m[f + 9],
              y = m[f + 10],
              z = m[f + 11],
              A = m[f + 12],
              B = m[f + 13],
              C = m[f + 14],
              D = m[f + 15],
              b = g[0],
              c = g[1],
              d = g[2],
              e = g[3],
              b = h(b, c, d, e, j, 7, a[0]),
              e = h(e, b, c, d, p, 12, a[1]),
              d = h(d, e, b, c, q, 17, a[2]),
              c = h(c, d, e, b, r, 22, a[3]),
              b = h(b, c, d, e, s, 7, a[4]),
              e = h(e, b, c, d, t, 12, a[5]),
              d = h(d, e, b, c, u, 17, a[6]),
              c = h(c, d, e, b, v, 22, a[7]),
              b = h(b, c, d, e, w, 7, a[8]),
              e = h(e, b, c, d, x, 12, a[9]),
              d = h(d, e, b, c, y, 17, a[10]),
              c = h(c, d, e, b, z, 22, a[11]),
              b = h(b, c, d, e, A, 7, a[12]),
              e = h(e, b, c, d, B, 12, a[13]),
              d = h(d, e, b, c, C, 17, a[14]),
              c = h(c, d, e, b, D, 22, a[15]),
              b = k(b, c, d, e, p, 5, a[16]),
              e = k(e, b, c, d, u, 9, a[17]),
              d = k(d, e, b, c, z, 14, a[18]),
              c = k(c, d, e, b, j, 20, a[19]),
              b = k(b, c, d, e, t, 5, a[20]),
              e = k(e, b, c, d, y, 9, a[21]),
              d = k(d, e, b, c, D, 14, a[22]),
              c = k(c, d, e, b, s, 20, a[23]),
              b = k(b, c, d, e, x, 5, a[24]),
              e = k(e, b, c, d, C, 9, a[25]),
              d = k(d, e, b, c, r, 14, a[26]),
              c = k(c, d, e, b, w, 20, a[27]),
              b = k(b, c, d, e, B, 5, a[28]),
              e = k(e, b, c, d, q, 9, a[29]),
              d = k(d, e, b, c, v, 14, a[30]),
              c = k(c, d, e, b, A, 20, a[31]),
              b = l(b, c, d, e, t, 4, a[32]),
              e = l(e, b, c, d, w, 11, a[33]),
              d = l(d, e, b, c, z, 16, a[34]),
              c = l(c, d, e, b, C, 23, a[35]),
              b = l(b, c, d, e, p, 4, a[36]),
              e = l(e, b, c, d, s, 11, a[37]),
              d = l(d, e, b, c, v, 16, a[38]),
              c = l(c, d, e, b, y, 23, a[39]),
              b = l(b, c, d, e, B, 4, a[40]),
              e = l(e, b, c, d, j, 11, a[41]),
              d = l(d, e, b, c, r, 16, a[42]),
              c = l(c, d, e, b, u, 23, a[43]),
              b = l(b, c, d, e, x, 4, a[44]),
              e = l(e, b, c, d, A, 11, a[45]),
              d = l(d, e, b, c, D, 16, a[46]),
              c = l(c, d, e, b, q, 23, a[47]),
              b = n(b, c, d, e, j, 6, a[48]),
              e = n(e, b, c, d, v, 10, a[49]),
              d = n(d, e, b, c, C, 15, a[50]),
              c = n(c, d, e, b, t, 21, a[51]),
              b = n(b, c, d, e, A, 6, a[52]),
              e = n(e, b, c, d, r, 10, a[53]),
              d = n(d, e, b, c, y, 15, a[54]),
              c = n(c, d, e, b, p, 21, a[55]),
              b = n(b, c, d, e, w, 6, a[56]),
              e = n(e, b, c, d, D, 10, a[57]),
              d = n(d, e, b, c, u, 15, a[58]),
              c = n(c, d, e, b, B, 21, a[59]),
              b = n(b, c, d, e, s, 6, a[60]),
              e = n(e, b, c, d, z, 10, a[61]),
              d = n(d, e, b, c, q, 15, a[62]),
              c = n(c, d, e, b, x, 21, a[63]);
            g[0] = g[0] + b | 0;
            g[1] = g[1] + c | 0;
            g[2] = g[2] + d | 0;
            g[3] = g[3] + e | 0
          },
          _doFinalize: function() {
            var a = this._data,
              f = a.words,
              g = 8 * this._nDataBytes,
              j = 8 * a.sigBytes;
            f[j >>> 5] |= 128 << 24 - j % 32;
            var h = E.floor(g / 4294967296);
            f[(j + 64 >>> 9 << 4) + 15] = (h << 8 | h >>> 24) & 16711935 | (h << 24 | h >>> 8) & 4278255360;
            f[(j + 64 >>> 9 << 4) + 14] = (g << 8 | g >>> 24) & 16711935 | (g << 24 | g >>> 8) & 4278255360;
            a.sigBytes = 4 * (f.length + 1);
            this._process();
            a = this._hash;
            f = a.words;
            for (g = 0; 4 > g; g++) j = f[g], f[g] = (j << 8 | j >>> 24) & 16711935 | (j << 24 | j >>> 8) & 4278255360;
            return a
          },
          clone: function() {
            var a = s.clone.call(this);
            a._hash = this._hash.clone();
            return a
          }
        });
        r.MD5 = s._createHelper(q);
        r.HmacMD5 = s._createHmacHelper(q)
      })(Math);
      /*
      CryptoJS v3.1.2 enc-base64-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var h = CryptoJS,
          j = h.lib.WordArray;
        h.enc.Base64 = {
          stringify: function(b) {
            var e = b.words,
              f = b.sigBytes,
              c = this._map;
            b.clamp();
            b = [];
            for (var a = 0; a < f; a += 3)
              for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>>
                6 * (3 - g) & 63));
            if (e = c.charAt(64))
              for (; b.length % 4;) b.push(e);
            return b.join("")
          },
          parse: function(b) {
            var e = b.length,
              f = this._map,
              c = f.charAt(64);
            c && (c = b.indexOf(c), -1 != c && (e = c));
            for (var c = [], a = 0, d = 0; d < e; d++)
              if (d % 4) {
                var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
                  h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
                c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
                a++
              } return j.create(c, a)
          },
          _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
        }
      })();
      /*
      CryptoJS v3.1.2 cipher-core-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      CryptoJS.lib.Cipher || function(u) {
        var g = CryptoJS,
          f = g.lib,
          k = f.Base,
          l = f.WordArray,
          q = f.BufferedBlockAlgorithm,
          r = g.enc.Base64,
          v = g.algo.EvpKDF,
          n = f.Cipher = q.extend({
            cfg: k.extend(),
            createEncryptor: function(a, b) {
              return this.create(this._ENC_XFORM_MODE, a, b)
            },
            createDecryptor: function(a, b) {
              return this.create(this._DEC_XFORM_MODE, a, b)
            },
            init: function(a, b, c) {
              this.cfg = this.cfg.extend(c);
              this._xformMode = a;
              this._key = b;
              this.reset()
            },
            reset: function() {
              q.reset.call(this);
              this._doReset()
            },
            process: function(a) {
              this._append(a);
              return this._process()
            },
            finalize: function(a) {
              a && this._append(a);
              return this._doFinalize()
            },
            keySize: 4,
            ivSize: 4,
            _ENC_XFORM_MODE: 1,
            _DEC_XFORM_MODE: 2,
            _createHelper: function(a) {
              return {
                encrypt: function(b, c, d) {
                  return ("string" == typeof c ? s : j).encrypt(a, b, c, d)
                },
                decrypt: function(b, c, d) {
                  return ("string" == typeof c ? s : j).decrypt(a, b, c, d)
                }
              }
            }
          });
        f.StreamCipher = n.extend({
          _doFinalize: function() {
            return this._process(!0)
          },
          blockSize: 1
        });
        var m = g.mode = {},
          t = function(a, b, c) {
            var d = this._iv;
            d ? this._iv = u : d = this._prevBlock;
            for (var e = 0; e < c; e++) a[b + e] ^= d[e]
          },
          h = (f.BlockCipherMode = k.extend({
            createEncryptor: function(a, b) {
              return this.Encryptor.create(a, b)
            },
            createDecryptor: function(a, b) {
              return this.Decryptor.create(a, b)
            },
            init: function(a, b) {
              this._cipher = a;
              this._iv = b
            }
          })).extend();
        h.Encryptor = h.extend({
          processBlock: function(a, b) {
            var c = this._cipher,
              d = c.blockSize;
            t.call(this, a, b, d);
            c.encryptBlock(a, b);
            this._prevBlock = a.slice(b, b + d)
          }
        });
        h.Decryptor = h.extend({
          processBlock: function(a, b) {
            var c = this._cipher,
              d = c.blockSize,
              e = a.slice(b, b + d);
            c.decryptBlock(a, b);
            t.call(this, a, b, d);
            this._prevBlock = e
          }
        });
        m = m.CBC = h;
        h = (g.pad = {}).Pkcs7 = {
          pad: function(a, b) {
            for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, e = [], f = 0; f < c; f += 4) e.push(d);
            c = l.create(e, c);
            a.concat(c)
          },
          unpad: function(a) {
            a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
          }
        };
        f.BlockCipher = n.extend({
          cfg: n.cfg.extend({
            mode: m,
            padding: h
          }),
          reset: function() {
            n.reset.call(this);
            var a = this.cfg,
              b = a.iv,
              a = a.mode;
            if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor;
            else c = a.createDecryptor, this._minBufferSize = 1;
            this._mode = c.call(a, this, b && b.words)
          },
          _doProcessBlock: function(a, b) {
            this._mode.processBlock(a, b)
          },
          _doFinalize: function() {
            var a = this.cfg.padding;
            if (this._xformMode == this._ENC_XFORM_MODE) {
              a.pad(this._data, this.blockSize);
              var b = this._process(!0)
            } else b = this._process(!0), a.unpad(b);
            return b
          },
          blockSize: 4
        });
        var p = f.CipherParams = k.extend({
            init: function(a) {
              this.mixIn(a)
            },
            toString: function(a) {
              return (a || this.formatter).stringify(this)
            }
          }),
          m = (g.format = {}).OpenSSL = {
            stringify: function(a) {
              var b = a.ciphertext;
              a = a.salt;
              return (a ? l.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r)
            },
            parse: function(a) {
              a = r.parse(a);
              var b = a.words;
              if (1398893684 == b[0] && 1701076831 == b[1]) {
                var c = l.create(b.slice(2, 4));
                b.splice(0, 4);
                a.sigBytes -= 16
              }
              return p.create({
                ciphertext: a,
                salt: c
              })
            }
          },
          j = f.SerializableCipher = k.extend({
            cfg: k.extend({
              format: m
            }),
            encrypt: function(a, b, c, d) {
              d = this.cfg.extend(d);
              var e = a.createEncryptor(c, d);
              b = e.finalize(b);
              e = e.cfg;
              return p.create({
                ciphertext: b,
                key: c,
                iv: e.iv,
                algorithm: a,
                mode: e.mode,
                padding: e.padding,
                blockSize: a.blockSize,
                formatter: d.format
              })
            },
            decrypt: function(a, b, c, d) {
              d = this.cfg.extend(d);
              b = this._parse(b, d.format);
              return a.createDecryptor(c, d).finalize(b.ciphertext)
            },
            _parse: function(a, b) {
              return "string" == typeof a ? b.parse(a, this) : a
            }
          }),
          g = (g.kdf = {}).OpenSSL = {
            execute: function(a, b, c, d) {
              d || (d = l.random(8));
              a = v.create({
                keySize: b + c
              }).compute(a, d);
              c = l.create(a.words.slice(b), 4 * c);
              a.sigBytes = 4 * b;
              return p.create({
                key: a,
                iv: c,
                salt: d
              })
            }
          },
          s = f.PasswordBasedCipher = j.extend({
            cfg: j.cfg.extend({
              kdf: g
            }),
            encrypt: function(a, b, c, d) {
              d = this.cfg.extend(d);
              c = d.kdf.execute(c, a.keySize, a.ivSize);
              d.iv = c.iv;
              a = j.encrypt.call(this, a, b, c.key, d);
              a.mixIn(c);
              return a
            },
            decrypt: function(a, b, c, d) {
              d = this.cfg.extend(d);
              b = this._parse(b, d.format);
              c = d.kdf.execute(c, a.keySize, a.ivSize, b.salt);
              d.iv = c.iv;
              return j.decrypt.call(this, a, b, c.key, d)
            }
          })
      }();
      /*
      CryptoJS v3.1.2 aes-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        for (var q = CryptoJS, x = q.lib.BlockCipher, r = q.algo, j = [], y = [], z = [], A = [], B = [], C = [], s = [], u = [], v = [], w = [], g = [], k = 0; 256 > k; k++) g[k] = 128 > k ? k << 1 : k << 1 ^ 283;
        for (var n = 0, l = 0, k = 0; 256 > k; k++) {
          var f = l ^ l << 1 ^ l << 2 ^ l << 3 ^ l << 4,
            f = f >>> 8 ^ f & 255 ^ 99;
          j[n] = f;
          y[f] = n;
          var t = g[n],
            D = g[t],
            E = g[D],
            b = 257 * g[f] ^ 16843008 * f;
          z[n] = b << 24 | b >>> 8;
          A[n] = b << 16 | b >>> 16;
          B[n] = b << 8 | b >>> 24;
          C[n] = b;
          b = 16843009 * E ^ 65537 * D ^ 257 * t ^ 16843008 * n;
          s[f] = b << 24 | b >>> 8;
          u[f] = b << 16 | b >>> 16;
          v[f] = b << 8 | b >>> 24;
          w[f] = b;
          n ? (n = t ^ g[g[g[E ^ t]]], l ^= g[g[l]]) : n = l = 1
        }
        var F = [0, 1, 2, 4, 8,
            16, 32, 64, 128, 27, 54
          ],
          r = r.AES = x.extend({
            _doReset: function() {
              for (var c = this._key, e = c.words, a = c.sigBytes / 4, c = 4 * ((this._nRounds = a + 6) + 1), b = this._keySchedule = [], h = 0; h < c; h++)
                if (h < a) b[h] = e[h];
                else {
                  var d = b[h - 1];
                  h % a ? 6 < a && 4 == h % a && (d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d & 255]) : (d = d << 8 | d >>> 24, d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d &
                    255], d ^= F[h / a | 0] << 24);
                  b[h] = b[h - a] ^ d
                } e = this._invKeySchedule = [];
              for (a = 0; a < c; a++) h = c - a, d = a % 4 ? b[h] : b[h - 4], e[a] = 4 > a || 4 >= h ? d : s[j[d >>> 24]] ^ u[j[d >>> 16 & 255]] ^ v[j[d >>> 8 & 255]] ^ w[j[d & 255]]
            },
            encryptBlock: function(c, e) {
              this._doCryptBlock(c, e, this._keySchedule, z, A, B, C, j)
            },
            decryptBlock: function(c, e) {
              var a = c[e + 1];
              c[e + 1] = c[e + 3];
              c[e + 3] = a;
              this._doCryptBlock(c, e, this._invKeySchedule, s, u, v, w, y);
              a = c[e + 1];
              c[e + 1] = c[e + 3];
              c[e + 3] = a
            },
            _doCryptBlock: function(c, e, a, b, h, d, j, m) {
              for (var n = this._nRounds, f = c[e] ^ a[0], g = c[e + 1] ^ a[1], k = c[e + 2] ^ a[2], p = c[e + 3] ^ a[3], l = 4, t = 1; t < n; t++) var q = b[f >>> 24] ^ h[g >>> 16 & 255] ^ d[k >>> 8 & 255] ^ j[p & 255] ^ a[l++],
                r = b[g >>> 24] ^ h[k >>> 16 & 255] ^ d[p >>> 8 & 255] ^ j[f & 255] ^ a[l++],
                s = b[k >>> 24] ^ h[p >>> 16 & 255] ^ d[f >>> 8 & 255] ^ j[g & 255] ^ a[l++],
                p = b[p >>> 24] ^ h[f >>> 16 & 255] ^ d[g >>> 8 & 255] ^ j[k & 255] ^ a[l++],
                f = q,
                g = r,
                k = s;
              q = (m[f >>> 24] << 24 | m[g >>> 16 & 255] << 16 | m[k >>> 8 & 255] << 8 | m[p & 255]) ^ a[l++];
              r = (m[g >>> 24] << 24 | m[k >>> 16 & 255] << 16 | m[p >>> 8 & 255] << 8 | m[f & 255]) ^ a[l++];
              s = (m[k >>> 24] << 24 | m[p >>> 16 & 255] << 16 | m[f >>> 8 & 255] << 8 | m[g & 255]) ^ a[l++];
              p = (m[p >>> 24] << 24 | m[f >>> 16 & 255] << 16 | m[g >>> 8 & 255] << 8 | m[k & 255]) ^ a[l++];
              c[e] = q;
              c[e + 1] = r;
              c[e + 2] = s;
              c[e + 3] = p
            },
            keySize: 8
          });
        q.AES = x._createHelper(r)
      })();
      /*
      CryptoJS v3.1.2 tripledes-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        function j(b, c) {
          var a = (this._lBlock >>> b ^ this._rBlock) & c;
          this._rBlock ^= a;
          this._lBlock ^= a << b
        }

        function l(b, c) {
          var a = (this._rBlock >>> b ^ this._lBlock) & c;
          this._lBlock ^= a;
          this._rBlock ^= a << b
        }
        var h = CryptoJS,
          e = h.lib,
          n = e.WordArray,
          e = e.BlockCipher,
          g = h.algo,
          q = [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],
          p = [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
          ],
          r = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
          s = [{
            "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
          }],
          t = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
          m = g.DES = e.extend({
            _doReset: function() {
              for (var b = this._key.words, c = [], a = 0; 56 > a; a++) {
                var f = q[a] - 1;
                c[a] = b[f >>> 5] >>> 31 - f % 32 & 1
              }
              b = this._subKeys = [];
              for (f = 0; 16 > f; f++) {
                for (var d = b[f] = [], e = r[f], a = 0; 24 > a; a++) d[a / 6 | 0] |= c[(p[a] - 1 + e) % 28] << 31 - a % 6, d[4 + (a / 6 | 0)] |= c[28 + (p[a + 24] - 1 + e) % 28] << 31 - a % 6;
                d[0] = d[0] << 1 | d[0] >>> 31;
                for (a = 1; 7 > a; a++) d[a] >>>= 4 * (a - 1) + 3;
                d[7] = d[7] << 5 | d[7] >>> 27
              }
              c = this._invSubKeys = [];
              for (a = 0; 16 > a; a++) c[a] = b[15 - a]
            },
            encryptBlock: function(b, c) {
              this._doCryptBlock(b, c, this._subKeys)
            },
            decryptBlock: function(b, c) {
              this._doCryptBlock(b, c, this._invSubKeys)
            },
            _doCryptBlock: function(b, c, a) {
              this._lBlock = b[c];
              this._rBlock = b[c + 1];
              j.call(this, 4, 252645135);
              j.call(this, 16, 65535);
              l.call(this, 2, 858993459);
              l.call(this, 8, 16711935);
              j.call(this, 1, 1431655765);
              for (var f = 0; 16 > f; f++) {
                for (var d = a[f], e = this._lBlock, h = this._rBlock, g = 0, k = 0; 8 > k; k++) g |= s[k][((h ^ d[k]) & t[k]) >>> 0];
                this._lBlock = h;
                this._rBlock = e ^ g
              }
              a = this._lBlock;
              this._lBlock = this._rBlock;
              this._rBlock = a;
              j.call(this, 1, 1431655765);
              l.call(this, 8, 16711935);
              l.call(this, 2, 858993459);
              j.call(this, 16, 65535);
              j.call(this, 4, 252645135);
              b[c] = this._lBlock;
              b[c + 1] = this._rBlock
            },
            keySize: 2,
            ivSize: 2,
            blockSize: 2
          });
        h.DES = e._createHelper(m);
        g = g.TripleDES = e.extend({
          _doReset: function() {
            var b = this._key.words;
            this._des1 = m.createEncryptor(n.create(b.slice(0, 2)));
            this._des2 = m.createEncryptor(n.create(b.slice(2, 4)));
            this._des3 = m.createEncryptor(n.create(b.slice(4, 6)))
          },
          encryptBlock: function(b, c) {
            this._des1.encryptBlock(b, c);
            this._des2.decryptBlock(b, c);
            this._des3.encryptBlock(b, c)
          },
          decryptBlock: function(b, c) {
            this._des3.decryptBlock(b, c);
            this._des2.encryptBlock(b, c);
            this._des1.decryptBlock(b, c)
          },
          keySize: 6,
          ivSize: 2,
          blockSize: 2
        });
        h.TripleDES = e._createHelper(g)
      })();
      /*
      CryptoJS v3.1.2 sha1-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var k = CryptoJS,
          b = k.lib,
          m = b.WordArray,
          l = b.Hasher,
          d = [],
          b = k.algo.SHA1 = l.extend({
            _doReset: function() {
              this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
            },
            _doProcessBlock: function(n, p) {
              for (var a = this._hash.words, e = a[0], f = a[1], h = a[2], j = a[3], b = a[4], c = 0; 80 > c; c++) {
                if (16 > c) d[c] = n[p + c] | 0;
                else {
                  var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16];
                  d[c] = g << 1 | g >>> 31
                }
                g = (e << 5 | e >>> 27) + b + d[c];
                g = 20 > c ? g + ((f & h | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h ^ j) + 1859775393) : 60 > c ? g + ((f & h | f & j | h & j) - 1894007588) : g + ((f ^ h ^ j) - 899497514);
                b = j;
                j = h;
                h = f << 30 | f >>> 2;
                f = e;
                e = g
              }
              a[0] = a[0] + e | 0;
              a[1] = a[1] + f | 0;
              a[2] = a[2] + h | 0;
              a[3] = a[3] + j | 0;
              a[4] = a[4] + b | 0
            },
            _doFinalize: function() {
              var b = this._data,
                d = b.words,
                a = 8 * this._nDataBytes,
                e = 8 * b.sigBytes;
              d[e >>> 5] |= 128 << 24 - e % 32;
              d[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296);
              d[(e + 64 >>> 9 << 4) + 15] = a;
              b.sigBytes = 4 * d.length;
              this._process();
              return this._hash
            },
            clone: function() {
              var b = l.clone.call(this);
              b._hash = this._hash.clone();
              return b
            }
          });
        k.SHA1 = l._createHelper(b);
        k.HmacSHA1 = l._createHmacHelper(b)
      })();
      /*
      CryptoJS v3.1.2 ripemd160-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      /*

      (c) 2012 by Cedric Mesnil. All rights reserved.

      Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

          - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
          - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      */
      (function() {
        var q = CryptoJS,
          d = q.lib,
          n = d.WordArray,
          p = d.Hasher,
          d = q.algo,
          x = n.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
          ]),
          y = n.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
          ]),
          z = n.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
          ]),
          A = n.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
          ]),
          B = n.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
          C = n.create([1352829926, 1548603684, 1836072691,
            2053994217, 0
          ]),
          d = d.RIPEMD160 = p.extend({
            _doReset: function() {
              this._hash = n.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
            },
            _doProcessBlock: function(e, v) {
              for (var b = 0; 16 > b; b++) {
                var c = v + b,
                  f = e[c];
                e[c] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360
              }
              var c = this._hash.words,
                f = B.words,
                d = C.words,
                n = x.words,
                q = y.words,
                p = z.words,
                w = A.words,
                t, g, h, j, r, u, k, l, m, s;
              u = t = c[0];
              k = g = c[1];
              l = h = c[2];
              m = j = c[3];
              s = r = c[4];
              for (var a, b = 0; 80 > b; b += 1) a = t + e[v + n[b]] | 0, a = 16 > b ? a + ((g ^ h ^ j) + f[0]) : 32 > b ? a + ((g & h | ~g & j) + f[1]) : 48 > b ? a + (((g | ~h) ^ j) + f[2]) : 64 > b ? a + ((g & j | h & ~j) + f[3]) : a + ((g ^
                (h | ~j)) + f[4]), a |= 0, a = a << p[b] | a >>> 32 - p[b], a = a + r | 0, t = r, r = j, j = h << 10 | h >>> 22, h = g, g = a, a = u + e[v + q[b]] | 0, a = 16 > b ? a + ((k ^ (l | ~m)) + d[0]) : 32 > b ? a + ((k & m | l & ~
                m) + d[1]) : 48 > b ? a + (((k | ~l) ^ m) + d[2]) : 64 > b ? a + ((k & l | ~k & m) + d[3]) : a + ((k ^ l ^ m) + d[4]), a |= 0, a = a << w[b] | a >>> 32 - w[b], a = a + s | 0, u = s, s = m, m = l << 10 | l >>> 22, l = k, k = a;
              a = c[1] + h + m | 0;
              c[1] = c[2] + j + s | 0;
              c[2] = c[3] + r + u | 0;
              c[3] = c[4] + t + k | 0;
              c[4] = c[0] + g + l | 0;
              c[0] = a
            },
            _doFinalize: function() {
              var e = this._data,
                d = e.words,
                b = 8 * this._nDataBytes,
                c = 8 * e.sigBytes;
              d[c >>> 5] |= 128 << 24 - c % 32;
              d[(c + 64 >>> 9 << 4) + 14] = (b << 8 | b >>> 24) & 16711935 | (b << 24 | b >>> 8) & 4278255360;
              e.sigBytes = 4 * (d.length + 1);
              this._process();
              e = this._hash;
              d = e.words;
              for (b = 0; 5 > b; b++) c = d[b], d[b] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
              return e
            },
            clone: function() {
              var d = p.clone.call(this);
              d._hash = this._hash.clone();
              return d
            }
          });
        q.RIPEMD160 = p._createHelper(d);
        q.HmacRIPEMD160 = p._createHmacHelper(d)
      })(Math);
      /*
      CryptoJS v3.1.2 pbkdf2-min.js
      code.google.com/p/crypto-js
      (c) 2009-2013 by Jeff Mott. All rights reserved.
      code.google.com/p/crypto-js/wiki/License
      */
      (function() {
        var b = CryptoJS,
          a = b.lib,
          d = a.Base,
          m = a.WordArray,
          a = b.algo,
          q = a.HMAC,
          l = a.PBKDF2 = d.extend({
            cfg: d.extend({
              keySize: 4,
              hasher: a.SHA1,
              iterations: 1
            }),
            init: function(a) {
              this.cfg = this.cfg.extend(a)
            },
            compute: function(a, b) {
              for (var c = this.cfg, f = q.create(c.hasher, a), g = m.create(), d = m.create([1]), l = g.words, r = d.words, n = c.keySize, c = c.iterations; l.length < n;) {
                var h = f.update(b).finalize(d);
                f.reset();
                for (var j = h.words, s = j.length, k = h, p = 1; p < c; p++) {
                  k = f.finalize(k);
                  f.reset();
                  for (var t = k.words, e = 0; e < s; e++) j[e] ^= t[e]
                }
                g.concat(h);
                r[0]++
              }
              g.sigBytes = 4 * n;
              return g
            }
          });
        b.PBKDF2 = function(a, b, c) {
          return l.create(c).compute(a, b)
        }
      })();
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var b64pad = "=";

      function hex2b64(d) {
        var b;
        var e;
        var a = "";
        for (b = 0; b + 3 <= d.length; b += 3) {
          e = parseInt(d.substring(b, b + 3), 16);
          a += b64map.charAt(e >> 6) + b64map.charAt(e & 63)
        }
        if (b + 1 == d.length) {
          e = parseInt(d.substring(b, b + 1), 16);
          a += b64map.charAt(e << 2)
        } else {
          if (b + 2 == d.length) {
            e = parseInt(d.substring(b, b + 2), 16);
            a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4)
          }
        }
        if (b64pad) {
          while ((a.length & 3) > 0) {
            a += b64pad
          }
        }
        return a
      }

      function b64tohex(f) {
        var d = "";
        var e;
        var b = 0;
        var c;
        var a;
        for (e = 0; e < f.length; ++e) {
          if (f.charAt(e) == b64pad) {
            break
          }
          a = b64map.indexOf(f.charAt(e));
          if (a < 0) {
            continue
          }
          if (b == 0) {
            d += int2char(a >> 2);
            c = a & 3;
            b = 1
          } else {
            if (b == 1) {
              d += int2char((c << 2) | (a >> 4));
              c = a & 15;
              b = 2
            } else {
              if (b == 2) {
                d += int2char(c);
                d += int2char(a >> 2);
                c = a & 3;
                b = 3
              } else {
                d += int2char((c << 2) | (a >> 4));
                d += int2char(a & 15);
                b = 0
              }
            }
          }
        }
        if (b == 1) {
          d += int2char(c << 2)
        }
        return d
      }

      function b64toBA(e) {
        var d = b64tohex(e);
        var c;
        var b = new Array();
        for (c = 0; 2 * c < d.length; ++c) {
          b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16)
        }
        return b
      };
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      var dbits;
      var canary = 244837814094590;
      var j_lm = ((canary & 16777215) == 15715070);

      function BigInteger(e, d, f) {
        if (e != null) {
          if ("number" == typeof e) {
            this.fromNumber(e, d, f)
          } else {
            if (d == null && "string" != typeof e) {
              this.fromString(e, 256)
            } else {
              this.fromString(e, d)
            }
          }
        }
      }

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

      function am1(f, a, b, e, h, g) {
        while (--g >= 0) {
          var d = a * this[f++] + b[e] + h;
          h = Math.floor(d / 67108864);
          b[e++] = d & 67108863
        }
        return h
      }

      function am2(f, q, r, e, o, a) {
        var k = q & 32767,
          p = q >> 15;
        while (--a >= 0) {
          var d = this[f] & 32767;
          var g = this[f++] >> 15;
          var b = p * d + g * k;
          d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);
          o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);
          r[e++] = d & 1073741823
        }
        return o
      }

      function am3(f, q, r, e, o, a) {
        var k = q & 16383,
          p = q >> 14;
        while (--a >= 0) {
          var d = this[f] & 16383;
          var g = this[f++] >> 14;
          var b = p * d + g * k;
          d = k * d + ((b & 16383) << 14) + r[e] + o;
          o = (d >> 28) + (b >> 14) + p * g;
          r[e++] = d & 268435455
        }
        return o
      }
      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, 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(a) {
        return BI_RM.charAt(a)
      }

      function intAt(b, a) {
        var d = BI_RC[b.charCodeAt(a)];
        return (d == null) ? -1 : d
      }

      function bnpCopyTo(b) {
        for (var a = this.t - 1; a >= 0; --a) {
          b[a] = this[a]
        }
        b.t = this.t;
        b.s = this.s
      }

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

      function nbv(a) {
        var b = nbi();
        b.fromInt(a);
        return b
      }

      function bnpFromString(h, c) {
        var e;
        if (c == 16) {
          e = 4
        } else {
          if (c == 8) {
            e = 3
          } else {
            if (c == 256) {
              e = 8
            } else {
              if (c == 2) {
                e = 1
              } else {
                if (c == 32) {
                  e = 5
                } else {
                  if (c == 4) {
                    e = 2
                  } else {
                    this.fromRadix(h, c);
                    return
                  }
                }
              }
            }
          }
        }
        this.t = 0;
        this.s = 0;
        var g = h.length,
          d = false,
          f = 0;
        while (--g >= 0) {
          var a = (e == 8) ? h[g] & 255 : intAt(h, g);
          if (a < 0) {
            if (h.charAt(g) == "-") {
              d = true
            }
            continue
          }
          d = false;
          if (f == 0) {
            this[this.t++] = a
          } else {
            if (f + e > this.DB) {
              this[this.t - 1] |= (a & ((1 << (this.DB - f)) - 1)) << f;
              this[this.t++] = (a >> (this.DB - f))
            } else {
              this[this.t - 1] |= a << f
            }
          }
          f += e;
          if (f >= this.DB) {
            f -= this.DB
          }
        }
        if (e == 8 && (h[0] & 128) != 0) {
          this.s = -1;
          if (f > 0) {
            this[this.t - 1] |= ((1 << (this.DB - f)) - 1) << f
          }
        }
        this.clamp();
        if (d) {
          BigInteger.ZERO.subTo(this, this)
        }
      }

      function bnpClamp() {
        var a = this.s & this.DM;
        while (this.t > 0 && this[this.t - 1] == a) {
          --this.t
        }
      }

      function bnToString(c) {
        if (this.s < 0) {
          return "-" + this.negate().toString(c)
        }
        var e;
        if (c == 16) {
          e = 4
        } else {
          if (c == 8) {
            e = 3
          } else {
            if (c == 2) {
              e = 1
            } else {
              if (c == 32) {
                e = 5
              } else {
                if (c == 4) {
                  e = 2
                } else {
                  return this.toRadix(c)
                }
              }
            }
          }
        }
        var g = (1 << e) - 1,
          l, a = false,
          h = "",
          f = this.t;
        var j = this.DB - (f * this.DB) % e;
        if (f-- > 0) {
          if (j < this.DB && (l = this[f] >> j) > 0) {
            a = true;
            h = int2char(l)
          }
          while (f >= 0) {
            if (j < e) {
              l = (this[f] & ((1 << j) - 1)) << (e - j);
              l |= this[--f] >> (j += this.DB - e)
            } else {
              l = (this[f] >> (j -= e)) & g;
              if (j <= 0) {
                j += this.DB;
                --f
              }
            }
            if (l > 0) {
              a = true
            }
            if (a) {
              h += int2char(l)
            }
          }
        }
        return a ? h : "0"
      }

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

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

      function bnCompareTo(b) {
        var d = this.s - b.s;
        if (d != 0) {
          return d
        }
        var c = this.t;
        d = c - b.t;
        if (d != 0) {
          return (this.s < 0) ? -d : d
        }
        while (--c >= 0) {
          if ((d = this[c] - b[c]) != 0) {
            return d
          }
        }
        return 0
      }

      function nbits(a) {
        var c = 1,
          b;
        if ((b = a >>> 16) != 0) {
          a = b;
          c += 16
        }
        if ((b = a >> 8) != 0) {
          a = b;
          c += 8
        }
        if ((b = a >> 4) != 0) {
          a = b;
          c += 4
        }
        if ((b = a >> 2) != 0) {
          a = b;
          c += 2
        }
        if ((b = a >> 1) != 0) {
          a = b;
          c += 1
        }
        return c
      }

      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(c, b) {
        var a;
        for (a = this.t - 1; a >= 0; --a) {
          b[a + c] = this[a]
        }
        for (a = c - 1; a >= 0; --a) {
          b[a] = 0
        }
        b.t = this.t + c;
        b.s = this.s
      }

      function bnpDRShiftTo(c, b) {
        for (var a = c; a < this.t; ++a) {
          b[a - c] = this[a]
        }
        b.t = Math.max(this.t - c, 0);
        b.s = this.s
      }

      function bnpLShiftTo(j, e) {
        var b = j % this.DB;
        var a = this.DB - b;
        var g = (1 << a) - 1;
        var f = Math.floor(j / this.DB),
          h = (this.s << b) & this.DM,
          d;
        for (d = this.t - 1; d >= 0; --d) {
          e[d + f + 1] = (this[d] >> a) | h;
          h = (this[d] & g) << b
        }
        for (d = f - 1; d >= 0; --d) {
          e[d] = 0
        }
        e[f] = h;
        e.t = this.t + f + 1;
        e.s = this.s;
        e.clamp()
      }

      function bnpRShiftTo(g, d) {
        d.s = this.s;
        var e = Math.floor(g / this.DB);
        if (e >= this.t) {
          d.t = 0;
          return
        }
        var b = g % this.DB;
        var a = this.DB - b;
        var f = (1 << b) - 1;
        d[0] = this[e] >> b;
        for (var c = e + 1; c < this.t; ++c) {
          d[c - e - 1] |= (this[c] & f) << a;
          d[c - e] = this[c] >> b
        }
        if (b > 0) {
          d[this.t - e - 1] |= (this.s & f) << a
        }
        d.t = this.t - e;
        d.clamp()
      }

      function bnpSubTo(d, f) {
        var e = 0,
          g = 0,
          b = Math.min(d.t, this.t);
        while (e < b) {
          g += this[e] - d[e];
          f[e++] = g & this.DM;
          g >>= this.DB
        }
        if (d.t < this.t) {
          g -= d.s;
          while (e < this.t) {
            g += this[e];
            f[e++] = g & this.DM;
            g >>= this.DB
          }
          g += this.s
        } else {
          g += this.s;
          while (e < d.t) {
            g -= d[e];
            f[e++] = g & this.DM;
            g >>= this.DB
          }
          g -= d.s
        }
        f.s = (g < 0) ? -1 : 0;
        if (g < -1) {
          f[e++] = this.DV + g
        } else {
          if (g > 0) {
            f[e++] = g
          }
        }
        f.t = e;
        f.clamp()
      }

      function bnpMultiplyTo(c, e) {
        var b = this.abs(),
          f = c.abs();
        var d = b.t;
        e.t = d + f.t;
        while (--d >= 0) {
          e[d] = 0
        }
        for (d = 0; d < f.t; ++d) {
          e[d + b.t] = b.am(0, f[d], e, d, 0, b.t)
        }
        e.s = 0;
        e.clamp();
        if (this.s != c.s) {
          BigInteger.ZERO.subTo(e, e)
        }
      }

      function bnpSquareTo(d) {
        var a = this.abs();
        var b = d.t = 2 * a.t;
        while (--b >= 0) {
          d[b] = 0
        }
        for (b = 0; b < a.t - 1; ++b) {
          var e = a.am(b, a[b], d, 2 * b, 0, 1);
          if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
            d[b + a.t] -= a.DV;
            d[b + a.t + 1] = 1
          }
        }
        if (d.t > 0) {
          d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1)
        }
        d.s = 0;
        d.clamp()
      }

      function bnpDivRemTo(n, h, g) {
        var w = n.abs();
        if (w.t <= 0) {
          return
        }
        var k = this.abs();
        if (k.t < w.t) {
          if (h != null) {
            h.fromInt(0)
          }
          if (g != null) {
            this.copyTo(g)
          }
          return
        }
        if (g == null) {
          g = nbi()
        }
        var d = nbi(),
          a = this.s,
          l = n.s;
        var v = this.DB - nbits(w[w.t - 1]);
        if (v > 0) {
          w.lShiftTo(v, d);
          k.lShiftTo(v, g)
        } else {
          w.copyTo(d);
          k.copyTo(g)
        }
        var p = d.t;
        var b = d[p - 1];
        if (b == 0) {
          return
        }
        var o = b * (1 << this.F1) + ((p > 1) ? d[p - 2] >> this.F2 : 0);
        var A = this.FV / o,
          z = (1 << this.F1) / o,
          x = 1 << this.F2;
        var u = g.t,
          s = u - p,
          f = (h == null) ? nbi() : h;
        d.dlShiftTo(s, f);
        if (g.compareTo(f) >= 0) {
          g[g.t++] = 1;
          g.subTo(f, g)
        }
        BigInteger.ONE.dlShiftTo(p, f);
        f.subTo(d, d);
        while (d.t < p) {
          d[d.t++] = 0
        }
        while (--s >= 0) {
          var c = (g[--u] == b) ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);
          if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
            d.dlShiftTo(s, f);
            g.subTo(f, g);
            while (g[u] < --c) {
              g.subTo(f, g)
            }
          }
        }
        if (h != null) {
          g.drShiftTo(p, h);
          if (a != l) {
            BigInteger.ZERO.subTo(h, h)
          }
        }
        g.t = p;
        g.clamp();
        if (v > 0) {
          g.rShiftTo(v, g)
        }
        if (a < 0) {
          BigInteger.ZERO.subTo(g, g)
        }
      }

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

      function Classic(a) {
        this.m = a
      }

      function cConvert(a) {
        if (a.s < 0 || a.compareTo(this.m) >= 0) {
          return a.mod(this.m)
        } else {
          return a
        }
      }

      function cRevert(a) {
        return a
      }

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

      function cMulTo(a, c, b) {
        a.multiplyTo(c, b);
        this.reduce(b)
      }

      function cSqrTo(a, b) {
        a.squareTo(b);
        this.reduce(b)
      }
      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 a = this[0];
        if ((a & 1) == 0) {
          return 0
        }
        var b = a & 3;
        b = (b * (2 - (a & 15) * b)) & 15;
        b = (b * (2 - (a & 255) * b)) & 255;
        b = (b * (2 - (((a & 65535) * b) & 65535))) & 65535;
        b = (b * (2 - a * b % this.DV)) % this.DV;
        return (b > 0) ? this.DV - b : -b
      }

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

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

      function montRevert(a) {
        var b = nbi();
        a.copyTo(b);
        this.reduce(b);
        return b
      }

      function montReduce(a) {
        while (a.t <= this.mt2) {
          a[a.t++] = 0
        }
        for (var c = 0; c < this.m.t; ++c) {
          var b = a[c] & 32767;
          var d = (b * this.mpl + (((b * this.mph + (a[c] >> 15) * this.mpl) & this.um) << 15)) & a.DM;
          b = c + this.m.t;
          a[b] += this.m.am(0, d, a, c, 0, this.m.t);
          while (a[b] >= a.DV) {
            a[b] -= a.DV;
            a[++b]++
          }
        }
        a.clamp();
        a.drShiftTo(this.m.t, a);
        if (a.compareTo(this.m) >= 0) {
          a.subTo(this.m, a)
        }
      }

      function montSqrTo(a, b) {
        a.squareTo(b);
        this.reduce(b)
      }

      function montMulTo(a, c, b) {
        a.multiplyTo(c, b);
        this.reduce(b)
      }
      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(h, j) {
        if (h > 4294967295 || h < 1) {
          return BigInteger.ONE
        }
        var f = nbi(),
          a = nbi(),
          d = j.convert(this),
          c = nbits(h) - 1;
        d.copyTo(f);
        while (--c >= 0) {
          j.sqrTo(f, a);
          if ((h & (1 << c)) > 0) {
            j.mulTo(a, d, f)
          } else {
            var b = f;
            f = a;
            a = b
          }
        }
        return j.revert(f)
      }

      function bnModPowInt(b, a) {
        var c;
        if (b < 256 || a.isEven()) {
          c = new Classic(a)
        } else {
          c = new Montgomery(a)
        }
        return this.exp(b, c)
      }
      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);
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      function bnClone() {
        var a = nbi();
        this.copyTo(a);
        return a
      }

      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(a) {
        return Math.floor(Math.LN2 * this.DB / Math.log(a))
      }

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

      function bnpToRadix(c) {
        if (c == null) {
          c = 10
        }
        if (this.signum() == 0 || c < 2 || c > 36) {
          return "0"
        }
        var f = this.chunkSize(c);
        var e = Math.pow(c, f);
        var i = nbv(e),
          j = nbi(),
          h = nbi(),
          g = "";
        this.divRemTo(i, j, h);
        while (j.signum() > 0) {
          g = (e + h.intValue()).toString(c).substr(1) + g;
          j.divRemTo(i, j, h)
        }
        return h.intValue().toString(c) + g
      }

      function bnpFromRadix(m, h) {
        this.fromInt(0);
        if (h == null) {
          h = 10
        }
        var f = this.chunkSize(h);
        var g = Math.pow(h, f),
          e = false,
          a = 0,
          l = 0;
        for (var c = 0; c < m.length; ++c) {
          var k = intAt(m, c);
          if (k < 0) {
            if (m.charAt(c) == "-" && this.signum() == 0) {
              e = true
            }
            continue
          }
          l = h * l + k;
          if (++a >= f) {
            this.dMultiply(g);
            this.dAddOffset(l, 0);
            a = 0;
            l = 0
          }
        }
        if (a > 0) {
          this.dMultiply(Math.pow(h, a));
          this.dAddOffset(l, 0)
        }
        if (e) {
          BigInteger.ZERO.subTo(this, this)
        }
      }

      function bnpFromNumber(f, e, h) {
        if ("number" == typeof e) {
          if (f < 2) {
            this.fromInt(1)
          } else {
            this.fromNumber(f, h);
            if (!this.testBit(f - 1)) {
              this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this)
            }
            if (this.isEven()) {
              this.dAddOffset(1, 0)
            }
            while (!this.isProbablePrime(e)) {
              this.dAddOffset(2, 0);
              if (this.bitLength() > f) {
                this.subTo(BigInteger.ONE.shiftLeft(f - 1), this)
              }
            }
          }
        } else {
          var d = new Array(),
            g = f & 7;
          d.length = (f >> 3) + 1;
          e.nextBytes(d);
          if (g > 0) {
            d[0] &= ((1 << g) - 1)
          } else {
            d[0] = 0
          }
          this.fromString(d, 256)
        }
      }

      function bnToByteArray() {
        var b = this.t,
          c = new Array();
        c[0] = this.s;
        var e = this.DB - (b * this.DB) % 8,
          f, a = 0;
        if (b-- > 0) {
          if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
            c[a++] = f | (this.s << (this.DB - e))
          }
          while (b >= 0) {
            if (e < 8) {
              f = (this[b] & ((1 << e) - 1)) << (8 - e);
              f |= this[--b] >> (e += this.DB - 8)
            } else {
              f = (this[b] >> (e -= 8)) & 255;
              if (e <= 0) {
                e += this.DB;
                --b
              }
            }
            if ((f & 128) != 0) {
              f |= -256
            }
            if (a == 0 && (this.s & 128) != (f & 128)) {
              ++a
            }
            if (a > 0 || f != this.s) {
              c[a++] = f
            }
          }
        }
        return c
      }

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

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

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

      function bnpBitwiseTo(c, h, e) {
        var d, g, b = Math.min(c.t, this.t);
        for (d = 0; d < b; ++d) {
          e[d] = h(this[d], c[d])
        }
        if (c.t < this.t) {
          g = c.s & this.DM;
          for (d = b; d < this.t; ++d) {
            e[d] = h(this[d], g)
          }
          e.t = this.t
        } else {
          g = this.s & this.DM;
          for (d = b; d < c.t; ++d) {
            e[d] = h(g, c[d])
          }
          e.t = c.t
        }
        e.s = h(this.s, c.s);
        e.clamp()
      }

      function op_and(a, b) {
        return a & b
      }

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

      function op_or(a, b) {
        return a | b
      }

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

      function op_xor(a, b) {
        return a ^ b
      }

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

      function op_andnot(a, b) {
        return a & ~b
      }

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

      function bnNot() {
        var b = nbi();
        for (var a = 0; a < this.t; ++a) {
          b[a] = this.DM & ~this[a]
        }
        b.t = this.t;
        b.s = ~this.s;
        return b
      }

      function bnShiftLeft(b) {
        var a = nbi();
        if (b < 0) {
          this.rShiftTo(-b, a)
        } else {
          this.lShiftTo(b, a)
        }
        return a
      }

      function bnShiftRight(b) {
        var a = nbi();
        if (b < 0) {
          this.lShiftTo(-b, a)
        } else {
          this.rShiftTo(b, a)
        }
        return a
      }

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

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

      function cbit(a) {
        var b = 0;
        while (a != 0) {
          a &= a - 1;
          ++b
        }
        return b
      }

      function bnBitCount() {
        var c = 0,
          a = this.s & this.DM;
        for (var b = 0; b < this.t; ++b) {
          c += cbit(this[b] ^ a)
        }
        return c
      }

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

      function bnpChangeBit(c, b) {
        var a = BigInteger.ONE.shiftLeft(c);
        this.bitwiseTo(a, b, a);
        return a
      }

      function bnSetBit(a) {
        return this.changeBit(a, op_or)
      }

      function bnClearBit(a) {
        return this.changeBit(a, op_andnot)
      }

      function bnFlipBit(a) {
        return this.changeBit(a, op_xor)
      }

      function bnpAddTo(d, f) {
        var e = 0,
          g = 0,
          b = Math.min(d.t, this.t);
        while (e < b) {
          g += this[e] + d[e];
          f[e++] = g & this.DM;
          g >>= this.DB
        }
        if (d.t < this.t) {
          g += d.s;
          while (e < this.t) {
            g += this[e];
            f[e++] = g & this.DM;
            g >>= this.DB
          }
          g += this.s
        } else {
          g += this.s;
          while (e < d.t) {
            g += d[e];
            f[e++] = g & this.DM;
            g >>= this.DB
          }
          g += d.s
        }
        f.s = (g < 0) ? -1 : 0;
        if (g > 0) {
          f[e++] = g
        } else {
          if (g < -1) {
            f[e++] = this.DV + g
          }
        }
        f.t = e;
        f.clamp()
      }

      function bnAdd(b) {
        var c = nbi();
        this.addTo(b, c);
        return c
      }

      function bnSubtract(b) {
        var c = nbi();
        this.subTo(b, c);
        return c
      }

      function bnMultiply(b) {
        var c = nbi();
        this.multiplyTo(b, c);
        return c
      }

      function bnSquare() {
        var a = nbi();
        this.squareTo(a);
        return a
      }

      function bnDivide(b) {
        var c = nbi();
        this.divRemTo(b, c, null);
        return c
      }

      function bnRemainder(b) {
        var c = nbi();
        this.divRemTo(b, null, c);
        return c
      }

      function bnDivideAndRemainder(b) {
        var d = nbi(),
          c = nbi();
        this.divRemTo(b, d, c);
        return new Array(d, c)
      }

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

      function bnpDAddOffset(b, a) {
        if (b == 0) {
          return
        }
        while (this.t <= a) {
          this[this.t++] = 0
        }
        this[a] += b;
        while (this[a] >= this.DV) {
          this[a] -= this.DV;
          if (++a >= this.t) {
            this[this.t++] = 0
          }++this[a]
        }
      }

      function NullExp() {}

      function nNop(a) {
        return a
      }

      function nMulTo(a, c, b) {
        a.multiplyTo(c, b)
      }

      function nSqrTo(a, b) {
        a.squareTo(b)
      }
      NullExp.prototype.convert = nNop;
      NullExp.prototype.revert = nNop;
      NullExp.prototype.mulTo = nMulTo;
      NullExp.prototype.sqrTo = nSqrTo;

      function bnPow(a) {
        return this.exp(a, new NullExp())
      }

      function bnpMultiplyLowerTo(b, f, e) {
        var d = Math.min(this.t + b.t, f);
        e.s = 0;
        e.t = d;
        while (d > 0) {
          e[--d] = 0
        }
        var c;
        for (c = e.t - this.t; d < c; ++d) {
          e[d + this.t] = this.am(0, b[d], e, d, 0, this.t)
        }
        for (c = Math.min(b.t, f); d < c; ++d) {
          this.am(0, b[d], e, d, 0, f - d)
        }
        e.clamp()
      }

      function bnpMultiplyUpperTo(b, e, d) {
        --e;
        var c = d.t = this.t + b.t - e;
        d.s = 0;
        while (--c >= 0) {
          d[c] = 0
        }
        for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
          d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e)
        }
        d.clamp();
        d.drShiftTo(1, d)
      }

      function Barrett(a) {
        this.r2 = nbi();
        this.q3 = nbi();
        BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
        this.mu = this.r2.divide(a);
        this.m = a
      }

      function barrettConvert(a) {
        if (a.s < 0 || a.t > 2 * this.m.t) {
          return a.mod(this.m)
        } else {
          if (a.compareTo(this.m) < 0) {
            return a
          } else {
            var b = nbi();
            a.copyTo(b);
            this.reduce(b);
            return b
          }
        }
      }

      function barrettRevert(a) {
        return a
      }

      function barrettReduce(a) {
        a.drShiftTo(this.m.t - 1, this.r2);
        if (a.t > this.m.t + 1) {
          a.t = this.m.t + 1;
          a.clamp()
        }
        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
        this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
        while (a.compareTo(this.r2) < 0) {
          a.dAddOffset(1, this.m.t + 1)
        }
        a.subTo(this.r2, a);
        while (a.compareTo(this.m) >= 0) {
          a.subTo(this.m, a)
        }
      }

      function barrettSqrTo(a, b) {
        a.squareTo(b);
        this.reduce(b)
      }

      function barrettMulTo(a, c, b) {
        a.multiplyTo(c, b);
        this.reduce(b)
      }
      Barrett.prototype.convert = barrettConvert;
      Barrett.prototype.revert = barrettRevert;
      Barrett.prototype.reduce = barrettReduce;
      Barrett.prototype.mulTo = barrettMulTo;
      Barrett.prototype.sqrTo = barrettSqrTo;

      function bnModPow(q, f) {
        var o = q.bitLength(),
          h, b = nbv(1),
          v;
        if (o <= 0) {
          return b
        } else {
          if (o < 18) {
            h = 1
          } else {
            if (o < 48) {
              h = 3
            } else {
              if (o < 144) {
                h = 4
              } else {
                if (o < 768) {
                  h = 5
                } else {
                  h = 6
                }
              }
            }
          }
        }
        if (o < 8) {
          v = new Classic(f)
        } else {
          if (f.isEven()) {
            v = new Barrett(f)
          } else {
            v = new Montgomery(f)
          }
        }
        var p = new Array(),
          d = 3,
          s = h - 1,
          a = (1 << h) - 1;
        p[1] = v.convert(this);
        if (h > 1) {
          var A = nbi();
          v.sqrTo(p[1], A);
          while (d <= a) {
            p[d] = nbi();
            v.mulTo(A, p[d - 2], p[d]);
            d += 2
          }
        }
        var l = q.t - 1,
          x, u = true,
          c = nbi(),
          y;
        o = nbits(q[l]) - 1;
        while (l >= 0) {
          if (o >= s) {
            x = (q[l] >> (o - s)) & a
          } else {
            x = (q[l] & ((1 << (o + 1)) - 1)) << (s - o);
            if (l > 0) {
              x |= q[l - 1] >> (this.DB + o - s)
            }
          }
          d = h;
          while ((x & 1) == 0) {
            x >>= 1;
            --d
          }
          if ((o -= d) < 0) {
            o += this.DB;
            --l
          }
          if (u) {
            p[x].copyTo(b);
            u = false
          } else {
            while (d > 1) {
              v.sqrTo(b, c);
              v.sqrTo(c, b);
              d -= 2
            }
            if (d > 0) {
              v.sqrTo(b, c)
            } else {
              y = b;
              b = c;
              c = y
            }
            v.mulTo(c, p[x], b)
          }
          while (l >= 0 && (q[l] & (1 << o)) == 0) {
            v.sqrTo(b, c);
            y = b;
            b = c;
            c = y;
            if (--o < 0) {
              o = this.DB - 1;
              --l
            }
          }
        }
        return v.revert(b)
      }

      function bnGCD(c) {
        var b = (this.s < 0) ? this.negate() : this.clone();
        var h = (c.s < 0) ? c.negate() : c.clone();
        if (b.compareTo(h) < 0) {
          var e = b;
          b = h;
          h = e
        }
        var d = b.getLowestSetBit(),
          f = h.getLowestSetBit();
        if (f < 0) {
          return b
        }
        if (d < f) {
          f = d
        }
        if (f > 0) {
          b.rShiftTo(f, b);
          h.rShiftTo(f, h)
        }
        while (b.signum() > 0) {
          if ((d = b.getLowestSetBit()) > 0) {
            b.rShiftTo(d, b)
          }
          if ((d = h.getLowestSetBit()) > 0) {
            h.rShiftTo(d, h)
          }
          if (b.compareTo(h) >= 0) {
            b.subTo(h, b);
            b.rShiftTo(1, b)
          } else {
            h.subTo(b, h);
            h.rShiftTo(1, h)
          }
        }
        if (f > 0) {
          h.lShiftTo(f, h)
        }
        return h
      }

      function bnpModInt(e) {
        if (e <= 0) {
          return 0
        }
        var c = this.DV % e,
          b = (this.s < 0) ? e - 1 : 0;
        if (this.t > 0) {
          if (c == 0) {
            b = this[0] % e
          } else {
            for (var a = this.t - 1; a >= 0; --a) {
              b = (c * b + this[a]) % e
            }
          }
        }
        return b
      }

      function bnModInverse(f) {
        var j = f.isEven();
        if ((this.isEven() && j) || f.signum() == 0) {
          return BigInteger.ZERO
        }
        var i = f.clone(),
          h = this.clone();
        var g = nbv(1),
          e = nbv(0),
          l = nbv(0),
          k = nbv(1);
        while (i.signum() != 0) {
          while (i.isEven()) {
            i.rShiftTo(1, i);
            if (j) {
              if (!g.isEven() || !e.isEven()) {
                g.addTo(this, g);
                e.subTo(f, e)
              }
              g.rShiftTo(1, g)
            } else {
              if (!e.isEven()) {
                e.subTo(f, e)
              }
            }
            e.rShiftTo(1, e)
          }
          while (h.isEven()) {
            h.rShiftTo(1, h);
            if (j) {
              if (!l.isEven() || !k.isEven()) {
                l.addTo(this, l);
                k.subTo(f, k)
              }
              l.rShiftTo(1, l)
            } else {
              if (!k.isEven()) {
                k.subTo(f, k)
              }
            }
            k.rShiftTo(1, k)
          }
          if (i.compareTo(h) >= 0) {
            i.subTo(h, i);
            if (j) {
              g.subTo(l, g)
            }
            e.subTo(k, e)
          } else {
            h.subTo(i, h);
            if (j) {
              l.subTo(g, l)
            }
            k.subTo(e, k)
          }
        }
        if (h.compareTo(BigInteger.ONE) != 0) {
          return BigInteger.ZERO
        }
        if (k.compareTo(f) >= 0) {
          return k.subtract(f)
        }
        if (k.signum() < 0) {
          k.addTo(f, k)
        } else {
          return k
        }
        if (k.signum() < 0) {
          return k.add(f)
        } else {
          return k
        }
      }
      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 = (1 << 26) / lowprimes[lowprimes.length - 1];

      function bnIsProbablePrime(e) {
        var d, b = this.abs();
        if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
          for (d = 0; d < lowprimes.length; ++d) {
            if (b[0] == lowprimes[d]) {
              return true
            }
          }
          return false
        }
        if (b.isEven()) {
          return false
        }
        d = 1;
        while (d < lowprimes.length) {
          var a = lowprimes[d],
            c = d + 1;
          while (c < lowprimes.length && a < lplim) {
            a *= lowprimes[c++]
          }
          a = b.modInt(a);
          while (d < c) {
            if (a % lowprimes[d++] == 0) {
              return false
            }
          }
        }
        return b.millerRabin(e)
      }

      function bnpMillerRabin(f) {
        var g = this.subtract(BigInteger.ONE);
        var c = g.getLowestSetBit();
        if (c <= 0) {
          return false
        }
        var h = g.shiftRight(c);
        f = (f + 1) >> 1;
        if (f > lowprimes.length) {
          f = lowprimes.length
        }
        var b = nbi();
        for (var e = 0; e < f; ++e) {
          b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
          var l = b.modPow(h, this);
          if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
            var d = 1;
            while (d++ < c && l.compareTo(g) != 0) {
              l = l.modPowInt(2, this);
              if (l.compareTo(BigInteger.ONE) == 0) {
                return false
              }
            }
            if (l.compareTo(g) != 0) {
              return false
            }
          }
        }
        return true
      }
      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;
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      function Arcfour() {
        this.i = 0;
        this.j = 0;
        this.S = new Array()
      }

      function ARC4init(d) {
        var c, a, b;
        for (c = 0; c < 256; ++c) {
          this.S[c] = c
        }
        a = 0;
        for (c = 0; c < 256; ++c) {
          a = (a + this.S[c] + d[c % d.length]) & 255;
          b = this.S[c];
          this.S[c] = this.S[a];
          this.S[a] = b
        }
        this.i = 0;
        this.j = 0
      }

      function ARC4next() {
        var a;
        this.i = (this.i + 1) & 255;
        this.j = (this.j + this.S[this.i]) & 255;
        a = this.S[this.i];
        this.S[this.i] = this.S[this.j];
        this.S[this.j] = a;
        return this.S[(a + this.S[this.i]) & 255]
      }
      Arcfour.prototype.init = ARC4init;
      Arcfour.prototype.next = ARC4next;

      function prng_newstate() {
        return new Arcfour()
      }
      var rng_psize = 256;
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      var rng_state;
      var rng_pool;
      var rng_pptr;

      function rng_seed_int(a) {
        rng_pool[rng_pptr++] ^= a & 255;
        rng_pool[rng_pptr++] ^= (a >> 8) & 255;
        rng_pool[rng_pptr++] ^= (a >> 16) & 255;
        rng_pool[rng_pptr++] ^= (a >> 24) & 255;
        if (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 (navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto) {
          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(b) {
        var a;
        for (a = 0; a < b.length; ++a) {
          b[a] = rng_get_byte()
        }
      }

      function SecureRandom() {}
      SecureRandom.prototype.nextBytes = rng_get_bytes;
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      function parseBigInt(b, a) {
        return new BigInteger(b, a)
      }

      function linebrk(c, d) {
        var a = "";
        var b = 0;
        while (b + d < c.length) {
          a += c.substring(b, b + d) + "\n";
          b += d
        }
        return a + c.substring(b, c.length)
      }

      function byte2Hex(a) {
        if (a < 16) {
          return "0" + a.toString(16)
        } else {
          return a.toString(16)
        }
      }

      function pkcs1pad2(e, h) {
        if (h < e.length + 11) {
          alert("Message too long for RSA");
          return null
        }
        var g = new Array();
        var d = e.length - 1;
        while (d >= 0 && h > 0) {
          var f = e.charCodeAt(d--);
          if (f < 128) {
            g[--h] = f
          } else {
            if ((f > 127) && (f < 2048)) {
              g[--h] = (f & 63) | 128;
              g[--h] = (f >> 6) | 192
            } else {
              g[--h] = (f & 63) | 128;
              g[--h] = ((f >> 6) & 63) | 128;
              g[--h] = (f >> 12) | 224
            }
          }
        }
        g[--h] = 0;
        var b = new SecureRandom();
        var a = new Array();
        while (h > 2) {
          a[0] = 0;
          while (a[0] == 0) {
            b.nextBytes(a)
          }
          g[--h] = a[0]
        }
        g[--h] = 2;
        g[--h] = 0;
        return new BigInteger(g)
      }

      function oaep_mgf1_arr(c, a, e) {
        var b = "",
          d = 0;
        while (b.length < a) {
          b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));
          d += 1
        }
        return b
      }
      var SHA1_SIZE = 20;

      function oaep_pad(l, a, c) {
        if (l.length + 2 * SHA1_SIZE + 2 > a) {
          throw "Message too long for RSA"
        }
        var h = "",
          d;
        for (d = 0; d < a - l.length - 2 * SHA1_SIZE - 2; d += 1) {
          h += "\x00"
        }
        var e = rstr_sha1("") + h + "\x01" + l;
        var f = new Array(SHA1_SIZE);
        new SecureRandom().nextBytes(f);
        var g = oaep_mgf1_arr(f, e.length, c || rstr_sha1);
        var k = [];
        for (d = 0; d < e.length; d += 1) {
          k[d] = e.charCodeAt(d) ^ g.charCodeAt(d)
        }
        var j = oaep_mgf1_arr(k, f.length, rstr_sha1);
        var b = [0];
        for (d = 0; d < f.length; d += 1) {
          b[d + 1] = f[d] ^ j.charCodeAt(d)
        }
        return new BigInteger(b.concat(k))
      }

      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(b, a) {
        this.isPublic = true;
        if (typeof b !== "string") {
          this.n = b;
          this.e = a
        } else {
          if (b != null && a != null && b.length > 0 && a.length > 0) {
            this.n = parseBigInt(b, 16);
            this.e = parseInt(a, 16)
          } else {
            alert("Invalid RSA public key")
          }
        }
      }

      function RSADoPublic(a) {
        return a.modPowInt(this.e, this.n)
      }

      function RSAEncrypt(d) {
        var a = pkcs1pad2(d, (this.n.bitLength() + 7) >> 3);
        if (a == null) {
          return null
        }
        var e = this.doPublic(a);
        if (e == null) {
          return null
        }
        var b = e.toString(16);
        if ((b.length & 1) == 0) {
          return b
        } else {
          return "0" + b
        }
      }

      function RSAEncryptOAEP(e, d) {
        var a = oaep_pad(e, (this.n.bitLength() + 7) >> 3, d);
        if (a == null) {
          return null
        }
        var f = this.doPublic(a);
        if (f == null) {
          return null
        }
        var b = f.toString(16);
        if ((b.length & 1) == 0) {
          return b
        } else {
          return "0" + b
        }
      }
      RSAKey.prototype.doPublic = RSADoPublic;
      RSAKey.prototype.setPublic = RSASetPublic;
      RSAKey.prototype.encrypt = RSAEncrypt;
      RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
      RSAKey.prototype.type = "RSA";
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      function pkcs1unpad2(g, j) {
        var a = g.toByteArray();
        var f = 0;
        while (f < a.length && a[f] == 0) {
          ++f
        }
        if (a.length - f != j - 1 || a[f] != 2) {
          return null
        }++f;
        while (a[f] != 0) {
          if (++f >= a.length) {
            return null
          }
        }
        var e = "";
        while (++f < a.length) {
          var h = a[f] & 255;
          if (h < 128) {
            e += String.fromCharCode(h)
          } else {
            if ((h > 191) && (h < 224)) {
              e += String.fromCharCode(((h & 31) << 6) | (a[f + 1] & 63));
              ++f
            } else {
              e += String.fromCharCode(((h & 15) << 12) | ((a[f + 1] & 63) << 6) | (a[f + 2] & 63));
              f += 2
            }
          }
        }
        return e
      }

      function oaep_mgf1_str(c, a, e) {
        var b = "",
          d = 0;
        while (b.length < a) {
          b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));
          d += 1
        }
        return b
      }
      var SHA1_SIZE = 20;

      function oaep_unpad(l, b, e) {
        l = l.toByteArray();
        var f;
        for (f = 0; f < l.length; f += 1) {
          l[f] &= 255
        }
        while (l.length < b) {
          l.unshift(0)
        }
        l = String.fromCharCode.apply(String, l);
        if (l.length < 2 * SHA1_SIZE + 2) {
          throw "Cipher too short"
        }
        var c = l.substr(1, SHA1_SIZE);
        var o = l.substr(SHA1_SIZE + 1);
        var m = oaep_mgf1_str(o, SHA1_SIZE, e || rstr_sha1);
        var h = [],
          f;
        for (f = 0; f < c.length; f += 1) {
          h[f] = c.charCodeAt(f) ^ m.charCodeAt(f)
        }
        var j = oaep_mgf1_str(String.fromCharCode.apply(String, h), l.length - SHA1_SIZE, rstr_sha1);
        var g = [];
        for (f = 0; f < o.length; f += 1) {
          g[f] = o.charCodeAt(f) ^ j.charCodeAt(f)
        }
        g = String.fromCharCode.apply(String, g);
        if (g.substr(0, SHA1_SIZE) !== rstr_sha1("")) {
          throw "Hash mismatch"
        }
        g = g.substr(SHA1_SIZE);
        var a = g.indexOf("\x01");
        var k = (a != -1) ? g.substr(0, a).lastIndexOf("\x00") : -1;
        if (k + 1 != a) {
          throw "Malformed data"
        }
        return g.substr(a + 1)
      }

      function RSASetPrivate(c, a, b) {
        this.isPrivate = true;
        if (typeof c !== "string") {
          this.n = c;
          this.e = a;
          this.d = b
        } else {
          if (c != null && a != null && c.length > 0 && a.length > 0) {
            this.n = parseBigInt(c, 16);
            this.e = parseInt(a, 16);
            this.d = parseBigInt(b, 16)
          } else {
            alert("Invalid RSA private key")
          }
        }
      }

      function RSASetPrivateEx(g, d, e, c, b, a, h, f) {
        this.isPrivate = true;
        if (g == null) {
          throw "RSASetPrivateEx N == null"
        }
        if (d == null) {
          throw "RSASetPrivateEx E == null"
        }
        if (g.length == 0) {
          throw "RSASetPrivateEx N.length == 0"
        }
        if (d.length == 0) {
          throw "RSASetPrivateEx E.length == 0"
        }
        if (g != null && d != null && g.length > 0 && d.length > 0) {
          this.n = parseBigInt(g, 16);
          this.e = parseInt(d, 16);
          this.d = parseBigInt(e, 16);
          this.p = parseBigInt(c, 16);
          this.q = parseBigInt(b, 16);
          this.dmp1 = parseBigInt(a, 16);
          this.dmq1 = parseBigInt(h, 16);
          this.coeff = parseBigInt(f, 16)
        } else {
          alert("Invalid RSA private key in RSASetPrivateEx")
        }
      }

      function RSAGenerate(b, i) {
        var a = new SecureRandom();
        var f = b >> 1;
        this.e = parseInt(i, 16);
        var c = new BigInteger(i, 16);
        for (;;) {
          for (;;) {
            this.p = new BigInteger(b - f, 1, a);
            if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
              break
            }
          }
          for (;;) {
            this.q = new BigInteger(f, 1, a);
            if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
              break
            }
          }
          if (this.p.compareTo(this.q) <= 0) {
            var h = this.p;
            this.p = this.q;
            this.q = h
          }
          var g = this.p.subtract(BigInteger.ONE);
          var d = this.q.subtract(BigInteger.ONE);
          var e = g.multiply(d);
          if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {
            this.n = this.p.multiply(this.q);
            this.d = c.modInverse(e);
            this.dmp1 = this.d.mod(g);
            this.dmq1 = this.d.mod(d);
            this.coeff = this.q.modInverse(this.p);
            break
          }
        }
      }

      function RSADoPrivate(a) {
        if (this.p == null || this.q == null) {
          return a.modPow(this.d, this.n)
        }
        var c = a.mod(this.p).modPow(this.dmp1, this.p);
        var b = a.mod(this.q).modPow(this.dmq1, this.q);
        while (c.compareTo(b) < 0) {
          c = c.add(this.p)
        }
        return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)
      }

      function RSADecrypt(b) {
        var d = parseBigInt(b, 16);
        var a = this.doPrivate(d);
        if (a == null) {
          return null
        }
        return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
      }

      function RSADecryptOAEP(d, b) {
        var e = parseBigInt(d, 16);
        var a = this.doPrivate(e);
        if (a == null) {
          return null
        }
        return oaep_unpad(a, (this.n.bitLength() + 7) >> 3, b)
      }
      RSAKey.prototype.doPrivate = RSADoPrivate;
      RSAKey.prototype.setPrivate = RSASetPrivate;
      RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
      RSAKey.prototype.generate = RSAGenerate;
      RSAKey.prototype.decrypt = RSADecrypt;
      RSAKey.prototype.decryptOAEP = RSADecryptOAEP;
      /*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
       */
      function ECFieldElementFp(b, a) {
        this.x = a;
        this.q = b
      }

      function feFpEquals(a) {
        if (a == this) {
          return true
        }
        return (this.q.equals(a.q) && this.x.equals(a.x))
      }

      function feFpToBigInteger() {
        return this.x
      }

      function feFpNegate() {
        return new ECFieldElementFp(this.q, this.x.negate().mod(this.q))
      }

      function feFpAdd(a) {
        return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q))
      }

      function feFpSubtract(a) {
        return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q))
      }

      function feFpMultiply(a) {
        return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q))
      }

      function feFpSquare() {
        return new ECFieldElementFp(this.q, this.x.square().mod(this.q))
      }

      function feFpDivide(a) {
        return new ECFieldElementFp(this.q, this.x.multiply(a.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(c, a, d, b) {
        this.curve = c;
        this.x = a;
        this.y = d;
        if (b == null) {
          this.z = BigInteger.ONE
        } else {
          this.z = b
        }
        this.zinv = null
      }

      function pointFpGetX() {
        if (this.zinv == null) {
          this.zinv = this.z.modInverse(this.curve.q)
        }
        return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))
      }

      function pointFpGetY() {
        if (this.zinv == null) {
          this.zinv = this.z.modInverse(this.curve.q)
        }
        return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))
      }

      function pointFpEquals(a) {
        if (a == this) {
          return true
        }
        if (this.isInfinity()) {
          return a.isInfinity()
        }
        if (a.isInfinity()) {
          return this.isInfinity()
        }
        var c, b;
        c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);
        if (!c.equals(BigInteger.ZERO)) {
          return false
        }
        b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);
        return b.equals(BigInteger.ZERO)
      }

      function pointFpIsInfinity() {
        if ((this.x == null) && (this.y == null)) {
          return true
        }
        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(l) {
        if (this.isInfinity()) {
          return l
        }
        if (l.isInfinity()) {
          return this
        }
        var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);
        var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);
        if (BigInteger.ZERO.equals(o)) {
          if (BigInteger.ZERO.equals(p)) {
            return this.twice()
          }
          return this.curve.getInfinity()
        }
        var j = new BigInteger("3");
        var e = this.x.toBigInteger();
        var n = this.y.toBigInteger();
        var c = l.x.toBigInteger();
        var k = l.y.toBigInteger();
        var m = o.square();
        var i = m.multiply(o);
        var d = e.multiply(m);
        var g = p.square().multiply(this.z);
        var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);
        var h = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);
        var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);
        return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h), f)
      }

      function pointFpTwice() {
        if (this.isInfinity()) {
          return this
        }
        if (this.y.toBigInteger().signum() == 0) {
          return this.curve.getInfinity()
        }
        var g = new BigInteger("3");
        var c = this.x.toBigInteger();
        var h = this.y.toBigInteger();
        var e = h.multiply(this.z);
        var j = e.multiply(h).mod(this.curve.q);
        var i = this.curve.a.toBigInteger();
        var k = c.square().multiply(g);
        if (!BigInteger.ZERO.equals(i)) {
          k = k.add(this.z.square().multiply(i))
        }
        k = k.mod(this.curve.q);
        var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);
        var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);
        var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);
        return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d)
      }

      function pointFpMultiply(b) {
        if (this.isInfinity()) {
          return this
        }
        if (b.signum() == 0) {
          return this.curve.getInfinity()
        }
        var g = b;
        var f = g.multiply(new BigInteger("3"));
        var l = this.negate();
        var d = this;
        var c;
        for (c = f.bitLength() - 2; c > 0; --c) {
          d = d.twice();
          var a = f.testBit(c);
          var j = g.testBit(c);
          if (a != j) {
            d = d.add(a ? this : l)
          }
        }
        return d
      }

      function pointFpMultiplyTwo(c, a, b) {
        var d;
        if (c.bitLength() > b.bitLength()) {
          d = c.bitLength() - 1
        } else {
          d = b.bitLength() - 1
        }
        var f = this.curve.getInfinity();
        var e = this.add(a);
        while (d >= 0) {
          f = f.twice();
          if (c.testBit(d)) {
            if (b.testBit(d)) {
              f = f.add(e)
            } else {
              f = f.add(this)
            }
          } else {
            if (b.testBit(d)) {
              f = f.add(a)
            }
          }--d
        }
        return f
      }
      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(e, d, c) {
        this.q = e;
        this.a = this.fromBigInteger(d);
        this.b = this.fromBigInteger(c);
        this.infinity = new ECPointFp(this, null, null)
      }

      function curveFpGetQ() {
        return this.q
      }

      function curveFpGetA() {
        return this.a
      }

      function curveFpGetB() {
        return this.b
      }

      function curveFpEquals(a) {
        if (a == this) {
          return true
        }
        return (this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b))
      }

      function curveFpGetInfinity() {
        return this.infinity
      }

      function curveFpFromBigInteger(a) {
        return new ECFieldElementFp(this.q, a)
      }

      function curveFpDecodePointHex(d) {
        switch (parseInt(d.substr(0, 2), 16)) {
          case 0:
            return this.infinity;
          case 2:
          case 3:
            return null;
          case 4:
          case 6:
          case 7:
            var a = (d.length - 2) / 2;
            var c = d.substr(2, a);
            var b = d.substr(a + 2, a);
            return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 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;
      /*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
       */
      ECFieldElementFp.prototype.getByteLength = function() {
        return Math.floor((this.toBigInteger().bitLength() + 7) / 8)
      };
      ECPointFp.prototype.getEncoded = function(c) {
        var d = function(h, f) {
          var g = h.toByteArrayUnsigned();
          if (f < g.length) {
            g = g.slice(g.length - f)
          } else {
            while (f > g.length) {
              g.unshift(0)
            }
          }
          return g
        };
        var a = this.getX().toBigInteger();
        var e = this.getY().toBigInteger();
        var b = d(a, 32);
        if (c) {
          if (e.isEven()) {
            b.unshift(2)
          } else {
            b.unshift(3)
          }
        } else {
          b.unshift(4);
          b = b.concat(d(e, 32))
        }
        return b
      };
      ECPointFp.decodeFrom = function(g, c) {
        var f = c[0];
        var e = c.length - 1;
        var d = c.slice(1, 1 + e / 2);
        var b = c.slice(1 + e / 2, 1 + e);
        d.unshift(0);
        b.unshift(0);
        var a = new BigInteger(d);
        var h = new BigInteger(b);
        return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
      };
      ECPointFp.decodeFromHex = function(g, c) {
        var f = c.substr(0, 2);
        var e = c.length - 2;
        var d = c.substr(2, e / 2);
        var b = c.substr(2 + e / 2, e / 2);
        var a = new BigInteger(d, 16);
        var h = new BigInteger(b, 16);
        return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
      };
      ECPointFp.prototype.add2D = function(c) {
        if (this.isInfinity()) {
          return c
        }
        if (c.isInfinity()) {
          return this
        }
        if (this.x.equals(c.x)) {
          if (this.y.equals(c.y)) {
            return this.twice()
          }
          return this.curve.getInfinity()
        }
        var g = c.x.subtract(this.x);
        var e = c.y.subtract(this.y);
        var a = e.divide(g);
        var d = a.square().subtract(this.x).subtract(c.x);
        var f = a.multiply(this.x.subtract(d)).subtract(this.y);
        return new ECPointFp(this.curve, d, f)
      };
      ECPointFp.prototype.twice2D = function() {
        if (this.isInfinity()) {
          return this
        }
        if (this.y.toBigInteger().signum() == 0) {
          return this.curve.getInfinity()
        }
        var b = this.curve.fromBigInteger(BigInteger.valueOf(2));
        var e = this.curve.fromBigInteger(BigInteger.valueOf(3));
        var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));
        var c = a.square().subtract(this.x.multiply(b));
        var d = a.multiply(this.x.subtract(c)).subtract(this.y);
        return new ECPointFp(this.curve, c, d)
      };
      ECPointFp.prototype.multiply2D = function(b) {
        if (this.isInfinity()) {
          return this
        }
        if (b.signum() == 0) {
          return this.curve.getInfinity()
        }
        var g = b;
        var f = g.multiply(new BigInteger("3"));
        var l = this.negate();
        var d = this;
        var c;
        for (c = f.bitLength() - 2; c > 0; --c) {
          d = d.twice();
          var a = f.testBit(c);
          var j = g.testBit(c);
          if (a != j) {
            d = d.add2D(a ? this : l)
          }
        }
        return d
      };
      ECPointFp.prototype.isOnCurve = function() {
        var d = this.getX().toBigInteger();
        var i = this.getY().toBigInteger();
        var f = this.curve.getA().toBigInteger();
        var c = this.curve.getB().toBigInteger();
        var h = this.curve.getQ();
        var e = i.multiply(i).mod(h);
        var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);
        return e.equals(g)
      };
      ECPointFp.prototype.toString = function() {
        return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")"
      };
      ECPointFp.prototype.validate = function() {
        var c = this.curve.getQ();
        if (this.isInfinity()) {
          throw new Error("Point is at infinity.")
        }
        var a = this.getX().toBigInteger();
        var b = this.getY().toBigInteger();
        if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) {
          throw new Error("x coordinate out of bounds")
        }
        if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.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(c).isInfinity()) {
          throw new Error("Point is not a scalar multiple of G.")
        }
        return true
      };
      /*! asn1-1.0.6.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      if (typeof KJUR == "undefined" || !KJUR) {
        KJUR = {}
      }
      if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
        KJUR.asn1 = {}
      }
      KJUR.asn1.ASN1Util = new function() {
        this.integerToByteHex = function(a) {
          var b = a.toString(16);
          if ((b.length % 2) == 1) {
            b = "0" + b
          }
          return b
        };
        this.bigIntToMinTwosComplementsHex = function(j) {
          var f = j.toString(16);
          if (f.substr(0, 1) != "-") {
            if (f.length % 2 == 1) {
              f = "0" + f
            } else {
              if (!f.match(/^[0-7]/)) {
                f = "00" + f
              }
            }
          } else {
            var a = f.substr(1);
            var e = a.length;
            if (e % 2 == 1) {
              e += 1
            } else {
              if (!f.match(/^[0-7]/)) {
                e += 2
              }
            }
            var g = "";
            for (var d = 0; d < e; d++) {
              g += "f"
            }
            var c = new BigInteger(g, 16);
            var b = c.xor(j).add(BigInteger.ONE);
            f = b.toString(16).replace(/^-/, "")
          }
          return f
        };
        this.getPEMStringFromHex = function(a, b) {
          var c = KJUR.asn1;
          var f = CryptoJS.enc.Hex.parse(a);
          var d = CryptoJS.enc.Base64.stringify(f);
          var e = d.replace(/(.{64})/g, "$1\r\n");
          e = e.replace(/\r\n$/, "");
          return "-----BEGIN " + b + "-----\r\n" + e + "\r\n-----END " + b + "-----\r\n"
        };
        this.newObject = function(b) {
          var g = KJUR.asn1;
          var k = Object.keys(b);
          if (k.length != 1) {
            throw "key of param shall be only one."
          }
          var j = k[0];
          if (":bool:int:bitstr:octstr:null:oid:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + j + ":") == -1) {
            throw "undefined key: " + j
          }
          if (j == "bool") {
            return new g.DERBoolean(b[j])
          }
          if (j == "int") {
            return new g.DERInteger(b[j])
          }
          if (j == "bitstr") {
            return new g.DERBitString(b[j])
          }
          if (j == "octstr") {
            return new g.DEROctetString(b[j])
          }
          if (j == "null") {
            return new g.DERNull(b[j])
          }
          if (j == "oid") {
            return new g.DERObjectIdentifier(b[j])
          }
          if (j == "utf8str") {
            return new g.DERUTF8String(b[j])
          }
          if (j == "numstr") {
            return new g.DERNumericString(b[j])
          }
          if (j == "prnstr") {
            return new g.DERPrintableString(b[j])
          }
          if (j == "telstr") {
            return new g.DERTeletexString(b[j])
          }
          if (j == "ia5str") {
            return new g.DERIA5String(b[j])
          }
          if (j == "utctime") {
            return new g.DERUTCTime(b[j])
          }
          if (j == "gentime") {
            return new g.DERGeneralizedTime(b[j])
          }
          if (j == "seq") {
            var m = b[j];
            var h = [];
            for (var e = 0; e < m.length; e++) {
              var l = g.ASN1Util.newObject(m[e]);
              h.push(l)
            }
            return new g.DERSequence({
              array: h
            })
          }
          if (j == "set") {
            var m = b[j];
            var h = [];
            for (var e = 0; e < m.length; e++) {
              var l = g.ASN1Util.newObject(m[e]);
              h.push(l)
            }
            return new g.DERSet({
              array: h
            })
          }
          if (j == "tag") {
            var c = b[j];
            if (Object.prototype.toString.call(c) === "[object Array]" && c.length == 3) {
              var d = g.ASN1Util.newObject(c[2]);
              return new g.DERTaggedObject({
                tag: c[0],
                explicit: c[1],
                obj: d
              })
            } else {
              var f = {};
              if (c.explicit !== undefined) {
                f.explicit = c.explicit
              }
              if (c.tag !== undefined) {
                f.tag = c.tag
              }
              if (c.obj === undefined) {
                throw "obj shall be specified for 'tag'."
              }
              f.obj = g.ASN1Util.newObject(c.obj);
              return new g.DERTaggedObject(f)
            }
          }
        };
        this.jsonToASN1HEX = function(b) {
          var a = this.newObject(b);
          return a.getEncodedHex()
        }
      };
      KJUR.asn1.ASN1Object = function() {
        var c = true;
        var b = null;
        var d = "00";
        var e = "00";
        var a = "";
        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=" + a.length + ",v=" + this.hV
          }
          var i = this.hV.length / 2;
          var h = i.toString(16);
          if (h.length % 2 == 1) {
            h = "0" + h
          }
          if (i < 128) {
            return h
          } else {
            var g = h.length / 2;
            if (g > 15) {
              throw "ASN.1 length too long to represent by 8x: n = " + i.toString(16)
            }
            var f = 128 + g;
            return f.toString(16) + h
          }
        };
        this.getEncodedHex = function() {
          if (this.hTLV == null || this.isModified) {
            this.hV = this.getFreshValueHex();
            this.hL = this.getLengthHexFromValue();
            this.hTLV = this.hT + this.hL + this.hV;
            this.isModified = false
          }
          return this.hTLV
        };
        this.getValueHex = function() {
          this.getEncodedHex();
          return this.hV
        };
        this.getFreshValueHex = function() {
          return ""
        }
      };
      KJUR.asn1.DERAbstractString = function(c) {
        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
        var b = null;
        var a = null;
        this.getString = function() {
          return this.s
        };
        this.setString = function(d) {
          this.hTLV = null;
          this.isModified = true;
          this.s = d;
          this.hV = stohex(this.s)
        };
        this.setStringHex = function(d) {
          this.hTLV = null;
          this.isModified = true;
          this.s = null;
          this.hV = d
        };
        this.getFreshValueHex = function() {
          return this.hV
        };
        if (typeof c != "undefined") {
          if (typeof c == "string") {
            this.setString(c)
          } else {
            if (typeof c.str != "undefined") {
              this.setString(c.str)
            } else {
              if (typeof c.hex != "undefined") {
                this.setStringHex(c.hex)
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
      KJUR.asn1.DERAbstractTime = function(c) {
        KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
        var b = null;
        var a = null;
        this.localDateToUTC = function(f) {
          utc = f.getTime() + (f.getTimezoneOffset() * 60000);
          var e = new Date(utc);
          return e
        };
        this.formatDate = function(m, o, e) {
          var g = this.zeroPadding;
          var n = this.localDateToUTC(m);
          var p = String(n.getFullYear());
          if (o == "utc") {
            p = p.substr(2, 2)
          }
          var l = g(String(n.getMonth() + 1), 2);
          var q = g(String(n.getDate()), 2);
          var h = g(String(n.getHours()), 2);
          var i = g(String(n.getMinutes()), 2);
          var j = g(String(n.getSeconds()), 2);
          var r = p + l + q + h + i + j;
          if (e === true) {
            var f = n.getMilliseconds();
            if (f != 0) {
              var k = g(String(f), 3);
              k = k.replace(/[0]+$/, "");
              r = r + "." + k
            }
          }
          return r + "Z"
        };
        this.zeroPadding = function(e, d) {
          if (e.length >= d) {
            return e
          }
          return new Array(d - e.length + 1).join("0") + e
        };
        this.getString = function() {
          return this.s
        };
        this.setString = function(d) {
          this.hTLV = null;
          this.isModified = true;
          this.s = d;
          this.hV = stohex(d)
        };
        this.setByDateValue = function(h, j, e, d, f, g) {
          var i = new Date(Date.UTC(h, j - 1, e, d, f, g, 0));
          this.setByDate(i)
        };
        this.getFreshValueHex = function() {
          return this.hV
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
      KJUR.asn1.DERAbstractStructured = function(b) {
        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
        var a = null;
        this.setByASN1ObjectArray = function(c) {
          this.hTLV = null;
          this.isModified = true;
          this.asn1Array = c
        };
        this.appendASN1Object = function(c) {
          this.hTLV = null;
          this.isModified = true;
          this.asn1Array.push(c)
        };
        this.asn1Array = new Array();
        if (typeof b != "undefined") {
          if (typeof b.array != "undefined") {
            this.asn1Array = b.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(a) {
        KJUR.asn1.DERInteger.superclass.constructor.call(this);
        this.hT = "02";
        this.setByBigInteger = function(b) {
          this.hTLV = null;
          this.isModified = true;
          this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)
        };
        this.setByInteger = function(c) {
          var b = new BigInteger(String(c), 10);
          this.setByBigInteger(b)
        };
        this.setValueHex = function(b) {
          this.hV = b
        };
        this.getFreshValueHex = function() {
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a.bigint != "undefined") {
            this.setByBigInteger(a.bigint)
          } else {
            if (typeof a["int"] != "undefined") {
              this.setByInteger(a["int"])
            } else {
              if (typeof a == "number") {
                this.setByInteger(a)
              } else {
                if (typeof a.hex != "undefined") {
                  this.setValueHex(a.hex)
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
      KJUR.asn1.DERBitString = function(a) {
        KJUR.asn1.DERBitString.superclass.constructor.call(this);
        this.hT = "03";
        this.setHexValueIncludingUnusedBits = function(b) {
          this.hTLV = null;
          this.isModified = true;
          this.hV = b
        };
        this.setUnusedBitsAndHexValue = function(b, d) {
          if (b < 0 || 7 < b) {
            throw "unused bits shall be from 0 to 7: u = " + b
          }
          var c = "0" + b;
          this.hTLV = null;
          this.isModified = true;
          this.hV = c + d
        };
        this.setByBinaryString = function(e) {
          e = e.replace(/0+$/, "");
          var f = 8 - e.length % 8;
          if (f == 8) {
            f = 0
          }
          for (var g = 0; g <= f; g++) {
            e += "0"
          }
          var j = "";
          for (var g = 0; g < e.length - 1; g += 8) {
            var d = e.substr(g, 8);
            var c = parseInt(d, 2).toString(16);
            if (c.length == 1) {
              c = "0" + c
            }
            j += c
          }
          this.hTLV = null;
          this.isModified = true;
          this.hV = "0" + f + j
        };
        this.setByBooleanArray = function(d) {
          var c = "";
          for (var b = 0; b < d.length; b++) {
            if (d[b] == true) {
              c += "1"
            } else {
              c += "0"
            }
          }
          this.setByBinaryString(c)
        };
        this.newFalseArray = function(d) {
          var b = new Array(d);
          for (var c = 0; c < d; c++) {
            b[c] = false
          }
          return b
        };
        this.getFreshValueHex = function() {
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a == "string" && a.toLowerCase().match(/^[0-9a-f]+$/)) {
            this.setHexValueIncludingUnusedBits(a)
          } else {
            if (typeof a.hex != "undefined") {
              this.setHexValueIncludingUnusedBits(a.hex)
            } else {
              if (typeof a.bin != "undefined") {
                this.setByBinaryString(a.bin)
              } else {
                if (typeof a.array != "undefined") {
                  this.setByBooleanArray(a.array)
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
      KJUR.asn1.DEROctetString = function(a) {
        KJUR.asn1.DEROctetString.superclass.constructor.call(this, a);
        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(c) {
        var b = function(d) {
          var e = d.toString(16);
          if (e.length == 1) {
            e = "0" + e
          }
          return e
        };
        var a = function(k) {
          var j = "";
          var e = new BigInteger(k, 10);
          var d = e.toString(2);
          var f = 7 - d.length % 7;
          if (f == 7) {
            f = 0
          }
          var m = "";
          for (var g = 0; g < f; g++) {
            m += "0"
          }
          d = m + d;
          for (var g = 0; g < d.length - 1; g += 7) {
            var l = d.substr(g, 7);
            if (g != d.length - 7) {
              l = "1" + l
            }
            j += b(parseInt(l, 2))
          }
          return j
        };
        KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
        this.hT = "06";
        this.setValueHex = function(d) {
          this.hTLV = null;
          this.isModified = true;
          this.s = null;
          this.hV = d
        };
        this.setValueOidString = function(f) {
          if (!f.match(/^[0-9.]+$/)) {
            throw "malformed oid string: " + f
          }
          var g = "";
          var d = f.split(".");
          var j = parseInt(d[0]) * 40 + parseInt(d[1]);
          g += b(j);
          d.splice(0, 2);
          for (var e = 0; e < d.length; e++) {
            g += a(d[e])
          }
          this.hTLV = null;
          this.isModified = true;
          this.s = null;
          this.hV = g
        };
        this.setValueName = function(e) {
          if (typeof KJUR.asn1.x509.OID.name2oidList[e] != "undefined") {
            var d = KJUR.asn1.x509.OID.name2oidList[e];
            this.setValueOidString(d)
          } else {
            throw "DERObjectIdentifier oidName undefined: " + e
          }
        };
        this.getFreshValueHex = function() {
          return this.hV
        };
        if (typeof c != "undefined") {
          if (typeof c == "string" && c.match(/^[0-2].[0-9.]+$/)) {
            this.setValueOidString(c)
          } else {
            if (KJUR.asn1.x509.OID.name2oidList[c] !== undefined) {
              this.setValueOidString(KJUR.asn1.x509.OID.name2oidList[c])
            } else {
              if (typeof c.oid != "undefined") {
                this.setValueOidString(c.oid)
              } else {
                if (typeof c.hex != "undefined") {
                  this.setValueHex(c.hex)
                } else {
                  if (typeof c.name != "undefined") {
                    this.setValueName(c.name)
                  }
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
      KJUR.asn1.DERUTF8String = function(a) {
        KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);
        this.hT = "0c"
      };
      YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
      KJUR.asn1.DERNumericString = function(a) {
        KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);
        this.hT = "12"
      };
      YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
      KJUR.asn1.DERPrintableString = function(a) {
        KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);
        this.hT = "13"
      };
      YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
      KJUR.asn1.DERTeletexString = function(a) {
        KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);
        this.hT = "14"
      };
      YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
      KJUR.asn1.DERIA5String = function(a) {
        KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);
        this.hT = "16"
      };
      YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
      KJUR.asn1.DERUTCTime = function(a) {
        KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);
        this.hT = "17";
        this.setByDate = function(b) {
          this.hTLV = null;
          this.isModified = true;
          this.date = b;
          this.s = this.formatDate(this.date, "utc");
          this.hV = stohex(this.s)
        };
        this.getFreshValueHex = function() {
          if (typeof this.date == "undefined" && typeof this.s == "undefined") {
            this.date = new Date();
            this.s = this.formatDate(this.date, "utc");
            this.hV = stohex(this.s)
          }
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a.str != "undefined") {
            this.setString(a.str)
          } else {
            if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) {
              this.setString(a)
            } else {
              if (typeof a.hex != "undefined") {
                this.setStringHex(a.hex)
              } else {
                if (typeof a.date != "undefined") {
                  this.setByDate(a.date)
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
      KJUR.asn1.DERGeneralizedTime = function(a) {
        KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);
        this.hT = "18";
        this.withMillis = false;
        this.setByDate = function(b) {
          this.hTLV = null;
          this.isModified = true;
          this.date = b;
          this.s = this.formatDate(this.date, "gen", this.withMillis);
          this.hV = stohex(this.s)
        };
        this.getFreshValueHex = function() {
          if (typeof this.date == "undefined" && typeof this.s == "undefined") {
            this.date = new Date();
            this.s = this.formatDate(this.date, "gen", this.withMillis);
            this.hV = stohex(this.s)
          }
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a.str != "undefined") {
            this.setString(a.str)
          } else {
            if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) {
              this.setString(a)
            } else {
              if (typeof a.hex != "undefined") {
                this.setStringHex(a.hex)
              } else {
                if (typeof a.date != "undefined") {
                  this.setByDate(a.date)
                } else {
                  if (a.millis === true) {
                    this.withMillis = true
                  }
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
      KJUR.asn1.DERSequence = function(a) {
        KJUR.asn1.DERSequence.superclass.constructor.call(this, a);
        this.hT = "30";
        this.getFreshValueHex = function() {
          var c = "";
          for (var b = 0; b < this.asn1Array.length; b++) {
            var d = this.asn1Array[b];
            c += d.getEncodedHex()
          }
          this.hV = c;
          return this.hV
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
      KJUR.asn1.DERSet = function(a) {
        KJUR.asn1.DERSet.superclass.constructor.call(this, a);
        this.hT = "31";
        this.sortFlag = true;
        this.getFreshValueHex = function() {
          var b = new Array();
          for (var c = 0; c < this.asn1Array.length; c++) {
            var d = this.asn1Array[c];
            b.push(d.getEncodedHex())
          }
          if (this.sortFlag == true) {
            b.sort()
          }
          this.hV = b.join("");
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a.sortflag != "undefined" && a.sortflag == false) {
            this.sortFlag = false
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
      KJUR.asn1.DERTaggedObject = function(a) {
        KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
        this.hT = "a0";
        this.hV = "";
        this.isExplicit = true;
        this.asn1Object = null;
        this.setASN1Object = function(b, c, d) {
          this.hT = c;
          this.isExplicit = b;
          this.asn1Object = d;
          if (this.isExplicit) {
            this.hV = this.asn1Object.getEncodedHex();
            this.hTLV = null;
            this.isModified = true
          } else {
            this.hV = null;
            this.hTLV = d.getEncodedHex();
            this.hTLV = this.hTLV.replace(/^../, c);
            this.isModified = false
          }
        };
        this.getFreshValueHex = function() {
          return this.hV
        };
        if (typeof a != "undefined") {
          if (typeof a.tag != "undefined") {
            this.hT = a.tag
          }
          if (typeof a.explicit != "undefined") {
            this.isExplicit = a.explicit
          }
          if (typeof a.obj != "undefined") {
            this.asn1Object = a.obj;
            this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
      /*! asn1hex-1.1.5.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      var ASN1HEX = new function() {
        this.getByteLengthOfL_AtObj = function(b, c) {
          if (b.substring(c + 2, c + 3) != "8") {
            return 1
          }
          var a = parseInt(b.substring(c + 3, c + 4));
          if (a == 0) {
            return -1
          }
          if (0 < a && a < 10) {
            return a + 1
          }
          return -2
        };
        this.getHexOfL_AtObj = function(b, c) {
          var a = this.getByteLengthOfL_AtObj(b, c);
          if (a < 1) {
            return ""
          }
          return b.substring(c + 2, c + 2 + a * 2)
        };
        this.getIntOfL_AtObj = function(c, d) {
          var b = this.getHexOfL_AtObj(c, d);
          if (b == "") {
            return -1
          }
          var a;
          if (parseInt(b.substring(0, 1)) < 8) {
            a = new BigInteger(b, 16)
          } else {
            a = new BigInteger(b.substring(2), 16)
          }
          return a.intValue()
        };
        this.getStartPosOfV_AtObj = function(b, c) {
          var a = this.getByteLengthOfL_AtObj(b, c);
          if (a < 0) {
            return a
          }
          return c + (a + 1) * 2
        };
        this.getHexOfV_AtObj = function(c, d) {
          var b = this.getStartPosOfV_AtObj(c, d);
          var a = this.getIntOfL_AtObj(c, d);
          return c.substring(b, b + a * 2)
        };
        this.getHexOfTLV_AtObj = function(c, e) {
          var b = c.substr(e, 2);
          var d = this.getHexOfL_AtObj(c, e);
          var a = this.getHexOfV_AtObj(c, e);
          return b + d + a
        };
        this.getPosOfNextSibling_AtObj = function(c, d) {
          var b = this.getStartPosOfV_AtObj(c, d);
          var a = this.getIntOfL_AtObj(c, d);
          return b + a * 2
        };
        this.getPosArrayOfChildren_AtObj = function(f, j) {
          var c = new Array();
          var i = this.getStartPosOfV_AtObj(f, j);
          c.push(i);
          var b = this.getIntOfL_AtObj(f, j);
          var g = i;
          var d = 0;
          while (1) {
            var e = this.getPosOfNextSibling_AtObj(f, g);
            if (e == null || (e - i >= (b * 2))) {
              break
            }
            if (d >= 200) {
              break
            }
            c.push(e);
            g = e;
            d++
          }
          return c
        };
        this.getNthChildIndex_AtObj = function(d, b, e) {
          var c = this.getPosArrayOfChildren_AtObj(d, b);
          return c[e]
        };
        this.getDecendantIndexByNthList = function(e, d, c) {
          if (c.length == 0) {
            return d
          }
          var f = c.shift();
          var b = this.getPosArrayOfChildren_AtObj(e, d);
          return this.getDecendantIndexByNthList(e, b[f], c)
        };
        this.getDecendantHexTLVByNthList = function(d, c, b) {
          var a = this.getDecendantIndexByNthList(d, c, b);
          return this.getHexOfTLV_AtObj(d, a)
        };
        this.getDecendantHexVByNthList = function(d, c, b) {
          var a = this.getDecendantIndexByNthList(d, c, b);
          return this.getHexOfV_AtObj(d, a)
        }
      };
      ASN1HEX.getVbyList = function(d, c, b, e) {
        var a = this.getDecendantIndexByNthList(d, c, b);
        if (a === undefined) {
          throw "can't find nthList object"
        }
        if (e !== undefined) {
          if (d.substr(a, 2) != e) {
            throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + e
          }
        }
        return this.getHexOfV_AtObj(d, a)
      };
      ASN1HEX.hextooidstr = function(e) {
        var h = function(b, a) {
          if (b.length >= a) {
            return b
          }
          return new Array(a - b.length + 1).join("0") + b
        };
        var l = [];
        var o = e.substr(0, 2);
        var f = parseInt(o, 16);
        l[0] = new String(Math.floor(f / 40));
        l[1] = new String(f % 40);
        var m = e.substr(2);
        var k = [];
        for (var g = 0; g < m.length / 2; g++) {
          k.push(parseInt(m.substr(g * 2, 2), 16))
        }
        var j = [];
        var d = "";
        for (var g = 0; g < k.length; g++) {
          if (k[g] & 128) {
            d = d + h((k[g] & 127).toString(2), 7)
          } else {
            d = d + h((k[g] & 127).toString(2), 7);
            j.push(new String(parseInt(d, 2)));
            d = ""
          }
        }
        var n = l.join(".");
        if (j.length > 0) {
          n = n + "." + j.join(".")
        }
        return n
      };
      /*! asn1x509-1.0.9.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      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(g) {
        KJUR.asn1.x509.Certificate.superclass.constructor.call(this);
        var b = null;
        var d = null;
        var f = null;
        var c = null;
        var a = null;
        var e = null;
        this.setRsaPrvKeyByPEMandPass = function(i, k) {
          var h = PKCS5PKEY.getDecryptedKeyHex(i, k);
          var j = new RSAKey();
          j.readPrivateKeyFromASN1HexString(h);
          this.prvKey = j
        };
        this.sign = function() {
          this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
          sig = new KJUR.crypto.Signature({
            alg: "SHA1withRSA"
          });
          sig.init(this.prvKey);
          sig.updateHex(this.asn1TBSCert.getEncodedHex());
          this.hexSig = sig.sign();
          this.asn1Sig = new KJUR.asn1.DERBitString({
            hex: "00" + this.hexSig
          });
          var h = new KJUR.asn1.DERSequence({
            array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
          });
          this.hTLV = h.getEncodedHex();
          this.isModified = false
        };
        this.setSignatureHex = function(h) {
          this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
          this.hexSig = h;
          this.asn1Sig = new KJUR.asn1.DERBitString({
            hex: "00" + this.hexSig
          });
          var i = new KJUR.asn1.DERSequence({
            array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
          });
          this.hTLV = i.getEncodedHex();
          this.isModified = false
        };
        this.getEncodedHex = function() {
          if (this.isModified == false && this.hTLV != null) {
            return this.hTLV
          }
          throw "not signed yet"
        };
        this.getPEMString = function() {
          var j = this.getEncodedHex();
          var h = CryptoJS.enc.Hex.parse(j);
          var i = CryptoJS.enc.Base64.stringify(h);
          var k = i.replace(/(.{64})/g, "$1\r\n");
          return "-----BEGIN CERTIFICATE-----\r\n" + k + "\r\n-----END CERTIFICATE-----\r\n"
        };
        if (typeof g != "undefined") {
          if (typeof g.tbscertobj != "undefined") {
            this.asn1TBSCert = g.tbscertobj
          }
          if (typeof g.prvkeyobj != "undefined") {
            this.prvKey = g.prvkeyobj
          } else {
            if (typeof g.rsaprvkey != "undefined") {
              this.prvKey = g.rsaprvkey
            } else {
              if ((typeof g.rsaprvpem != "undefined") && (typeof g.rsaprvpas != "undefined")) {
                this.setRsaPrvKeyByPEMandPass(g.rsaprvpem, g.rsaprvpas)
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.TBSCertificate = function(a) {
        KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);
        this._initialize = function() {
          this.asn1Array = new Array();
          this.asn1Version = new KJUR.asn1.DERTaggedObject({
            obj: new KJUR.asn1.DERInteger({
              "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(b) {
          this.asn1SerialNumber = new KJUR.asn1.DERInteger(b)
        };
        this.setSignatureAlgByParam = function(b) {
          this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(b)
        };
        this.setIssuerByParam = function(b) {
          this.asn1Issuer = new KJUR.asn1.x509.X500Name(b)
        };
        this.setNotBeforeByParam = function(b) {
          this.asn1NotBefore = new KJUR.asn1.x509.Time(b)
        };
        this.setNotAfterByParam = function(b) {
          this.asn1NotAfter = new KJUR.asn1.x509.Time(b)
        };
        this.setSubjectByParam = function(b) {
          this.asn1Subject = new KJUR.asn1.x509.X500Name(b)
        };
        this.setSubjectPublicKeyByParam = function(b) {
          this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(b)
        };
        this.setSubjectPublicKeyByGetKey = function(c) {
          var b = KEYUTIL.getKey(c);
          this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(b)
        };
        this.appendExtension = function(b) {
          this.extensionsArray.push(b)
        };
        this.appendExtensionByName = function(d, b) {
          if (d.toLowerCase() == "basicconstraints") {
            var c = new KJUR.asn1.x509.BasicConstraints(b);
            this.appendExtension(c)
          } else {
            if (d.toLowerCase() == "keyusage") {
              var c = new KJUR.asn1.x509.KeyUsage(b);
              this.appendExtension(c)
            } else {
              if (d.toLowerCase() == "crldistributionpoints") {
                var c = new KJUR.asn1.x509.CRLDistributionPoints(b);
                this.appendExtension(c)
              } else {
                if (d.toLowerCase() == "extkeyusage") {
                  var c = new KJUR.asn1.x509.ExtKeyUsage(b);
                  this.appendExtension(c)
                } else {
                  if (d.toLowerCase() == "authoritykeyidentifier") {
                    var c = new KJUR.asn1.x509.AuthorityKeyIdentifier(b);
                    this.appendExtension(c)
                  } else {
                    throw "unsupported extension name: " + d
                  }
                }
              }
            }
          }
        };
        this.getEncodedHex = function() {
          if (this.asn1NotBefore == null || this.asn1NotAfter == null) {
            throw "notBefore and/or notAfter not set"
          }
          var c = new KJUR.asn1.DERSequence({
            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(c);
          this.asn1Array.push(this.asn1Subject);
          this.asn1Array.push(this.asn1SubjPKey);
          if (this.extensionsArray.length > 0) {
            var d = new KJUR.asn1.DERSequence({
              array: this.extensionsArray
            });
            var b = new KJUR.asn1.DERTaggedObject({
              explicit: true,
              tag: "a3",
              obj: d
            });
            this.asn1Array.push(b)
          }
          var e = new KJUR.asn1.DERSequence({
            array: this.asn1Array
          });
          this.hTLV = e.getEncodedHex();
          this.isModified = false;
          return this.hTLV
        };
        this._initialize()
      };
      YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.Extension = function(b) {
        KJUR.asn1.x509.Extension.superclass.constructor.call(this);
        var a = null;
        this.getEncodedHex = function() {
          var f = new KJUR.asn1.DERObjectIdentifier({
            oid: this.oid
          });
          var e = new KJUR.asn1.DEROctetString({
            hex: this.getExtnValueHex()
          });
          var d = new Array();
          d.push(f);
          if (this.critical) {
            d.push(new KJUR.asn1.DERBoolean())
          }
          d.push(e);
          var c = new KJUR.asn1.DERSequence({
            array: d
          });
          return c.getEncodedHex()
        };
        this.critical = false;
        if (typeof b != "undefined") {
          if (typeof b.critical != "undefined") {
            this.critical = b.critical
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.KeyUsage = function(a) {
        KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, a);
        this.getExtnValueHex = function() {
          return this.asn1ExtnValue.getEncodedHex()
        };
        this.oid = "2.5.29.15";
        if (typeof a != "undefined") {
          if (typeof a.bin != "undefined") {
            this.asn1ExtnValue = new KJUR.asn1.DERBitString(a)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension);
      KJUR.asn1.x509.BasicConstraints = function(c) {
        KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, c);
        var a = false;
        var b = -1;
        this.getExtnValueHex = function() {
          var e = new Array();
          if (this.cA) {
            e.push(new KJUR.asn1.DERBoolean())
          }
          if (this.pathLen > -1) {
            e.push(new KJUR.asn1.DERInteger({
              "int": this.pathLen
            }))
          }
          var d = new KJUR.asn1.DERSequence({
            array: e
          });
          this.asn1ExtnValue = d;
          return this.asn1ExtnValue.getEncodedHex()
        };
        this.oid = "2.5.29.19";
        this.cA = false;
        this.pathLen = -1;
        if (typeof c != "undefined") {
          if (typeof c.cA != "undefined") {
            this.cA = c.cA
          }
          if (typeof c.pathLen != "undefined") {
            this.pathLen = c.pathLen
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension);
      KJUR.asn1.x509.CRLDistributionPoints = function(a) {
        KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, a);
        this.getExtnValueHex = function() {
          return this.asn1ExtnValue.getEncodedHex()
        };
        this.setByDPArray = function(b) {
          this.asn1ExtnValue = new KJUR.asn1.DERSequence({
            array: b
          })
        };
        this.setByOneURI = function(e) {
          var b = new KJUR.asn1.x509.GeneralNames([{
            uri: e
          }]);
          var d = new KJUR.asn1.x509.DistributionPointName(b);
          var c = new KJUR.asn1.x509.DistributionPoint({
            dpobj: d
          });
          this.setByDPArray([c])
        };
        this.oid = "2.5.29.31";
        if (typeof a != "undefined") {
          if (typeof a.array != "undefined") {
            this.setByDPArray(a.array)
          } else {
            if (typeof a.uri != "undefined") {
              this.setByOneURI(a.uri)
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension);
      KJUR.asn1.x509.ExtKeyUsage = function(a) {
        KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, a);
        this.setPurposeArray = function(b) {
          this.asn1ExtnValue = new KJUR.asn1.DERSequence();
          for (var c = 0; c < b.length; c++) {
            var d = new KJUR.asn1.DERObjectIdentifier(b[c]);
            this.asn1ExtnValue.appendASN1Object(d)
          }
        };
        this.getExtnValueHex = function() {
          return this.asn1ExtnValue.getEncodedHex()
        };
        this.oid = "2.5.29.37";
        if (typeof a != "undefined") {
          if (typeof a.array != "undefined") {
            this.setPurposeArray(a.array)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension);
      KJUR.asn1.x509.AuthorityKeyIdentifier = function(a) {
        KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, a);
        this.asn1KID = null;
        this.asn1CertIssuer = null;
        this.asn1CertSN = null;
        this.getExtnValueHex = function() {
          var c = new Array();
          if (this.asn1KID) {
            c.push(new KJUR.asn1.DERTaggedObject({
              explicit: false,
              tag: "80",
              obj: this.asn1KID
            }))
          }
          if (this.asn1CertIssuer) {
            c.push(new KJUR.asn1.DERTaggedObject({
              explicit: false,
              tag: "a1",
              obj: this.asn1CertIssuer
            }))
          }
          if (this.asn1CertSN) {
            c.push(new KJUR.asn1.DERTaggedObject({
              explicit: false,
              tag: "82",
              obj: this.asn1CertSN
            }))
          }
          var b = new KJUR.asn1.DERSequence({
            array: c
          });
          this.asn1ExtnValue = b;
          return this.asn1ExtnValue.getEncodedHex()
        };
        this.setKIDByParam = function(b) {
          this.asn1KID = new KJUR.asn1.DEROctetString(b)
        };
        this.setCertIssuerByParam = function(b) {
          this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(b)
        };
        this.setCertSNByParam = function(b) {
          this.asn1CertSN = new KJUR.asn1.DERInteger(b)
        };
        this.oid = "2.5.29.35";
        if (typeof a != "undefined") {
          if (typeof a.kid != "undefined") {
            this.setKIDByParam(a.kid)
          }
          if (typeof a.issuer != "undefined") {
            this.setCertIssuerByParam(a.issuer)
          }
          if (typeof a.sn != "undefined") {
            this.setCertSNByParam(a.sn)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension);
      KJUR.asn1.x509.CRL = function(f) {
        KJUR.asn1.x509.CRL.superclass.constructor.call(this);
        var a = null;
        var c = null;
        var e = null;
        var b = null;
        var d = null;
        this.setRsaPrvKeyByPEMandPass = function(h, j) {
          var g = PKCS5PKEY.getDecryptedKeyHex(h, j);
          var i = new RSAKey();
          i.readPrivateKeyFromASN1HexString(g);
          this.rsaPrvKey = i
        };
        this.sign = function() {
          this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg;
          sig = new KJUR.crypto.Signature({
            alg: "SHA1withRSA",
            prov: "cryptojs/jsrsa"
          });
          sig.initSign(this.rsaPrvKey);
          sig.updateHex(this.asn1TBSCertList.getEncodedHex());
          this.hexSig = sig.sign();
          this.asn1Sig = new KJUR.asn1.DERBitString({
            hex: "00" + this.hexSig
          });
          var g = new KJUR.asn1.DERSequence({
            array: [this.asn1TBSCertList, this.asn1SignatureAlg, this.asn1Sig]
          });
          this.hTLV = g.getEncodedHex();
          this.isModified = false
        };
        this.getEncodedHex = function() {
          if (this.isModified == false && this.hTLV != null) {
            return this.hTLV
          }
          throw "not signed yet"
        };
        this.getPEMString = function() {
          var i = this.getEncodedHex();
          var g = CryptoJS.enc.Hex.parse(i);
          var h = CryptoJS.enc.Base64.stringify(g);
          var j = h.replace(/(.{64})/g, "$1\r\n");
          return "-----BEGIN X509 CRL-----\r\n" + j + "\r\n-----END X509 CRL-----\r\n"
        };
        if (typeof f != "undefined") {
          if (typeof f.tbsobj != "undefined") {
            this.asn1TBSCertList = f.tbsobj
          }
          if (typeof f.rsaprvkey != "undefined") {
            this.rsaPrvKey = f.rsaprvkey
          }
          if ((typeof f.rsaprvpem != "undefined") && (typeof f.rsaprvpas != "undefined")) {
            this.setRsaPrvKeyByPEMandPass(f.rsaprvpem, f.rsaprvpas)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.TBSCertList = function(b) {
        KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);
        var a = null;
        this.setSignatureAlgByParam = function(c) {
          this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(c)
        };
        this.setIssuerByParam = function(c) {
          this.asn1Issuer = new KJUR.asn1.x509.X500Name(c)
        };
        this.setThisUpdateByParam = function(c) {
          this.asn1ThisUpdate = new KJUR.asn1.x509.Time(c)
        };
        this.setNextUpdateByParam = function(c) {
          this.asn1NextUpdate = new KJUR.asn1.x509.Time(c)
        };
        this.addRevokedCert = function(c, d) {
          var f = {};
          if (c != undefined && c != null) {
            f.sn = c
          }
          if (d != undefined && d != null) {
            f.time = d
          }
          var e = new KJUR.asn1.x509.CRLEntry(f);
          this.aRevokedCert.push(e)
        };
        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 KJUR.asn1.DERSequence({
              array: this.aRevokedCert
            });
            this.asn1Array.push(c)
          }
          var d = new KJUR.asn1.DERSequence({
            array: this.asn1Array
          });
          this.hTLV = d.getEncodedHex();
          this.isModified = false;
          return 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(c) {
        KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);
        var b = null;
        var a = null;
        this.setCertSerial = function(d) {
          this.sn = new KJUR.asn1.DERInteger(d)
        };
        this.setRevocationDate = function(d) {
          this.time = new KJUR.asn1.x509.Time(d)
        };
        this.getEncodedHex = function() {
          var d = new KJUR.asn1.DERSequence({
            array: [this.sn, this.time]
          });
          this.TLV = d.getEncodedHex();
          return this.TLV
        };
        if (typeof c != "undefined") {
          if (typeof c.time != "undefined") {
            this.setRevocationDate(c.time)
          }
          if (typeof c.sn != "undefined") {
            this.setCertSerial(c.sn)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.X500Name = function(b) {
        KJUR.asn1.x509.X500Name.superclass.constructor.call(this);
        this.asn1Array = new Array();
        this.setByString = function(c) {
          var d = c.split("/");
          d.shift();
          for (var e = 0; e < d.length; e++) {
            this.asn1Array.push(new KJUR.asn1.x509.RDN({
              str: d[e]
            }))
          }
        };
        this.getEncodedHex = function() {
          if (typeof this.hTLV == "string") {
            return this.hTLV
          }
          var c = new KJUR.asn1.DERSequence({
            array: this.asn1Array
          });
          this.hTLV = c.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (typeof b.str != "undefined") {
            this.setByString(b.str)
          }
          if (typeof b.certissuer != "undefined") {
            var a = new X509();
            a.hex = X509.pemToHex(b.certissuer);
            this.hTLV = a.getIssuerHex()
          }
          if (typeof b.certsubject != "undefined") {
            var a = new X509();
            a.hex = X509.pemToHex(b.certsubject);
            this.hTLV = a.getSubjectHex()
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.RDN = function(a) {
        KJUR.asn1.x509.RDN.superclass.constructor.call(this);
        this.asn1Array = new Array();
        this.addByString = function(b) {
          this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({
            str: b
          }))
        };
        this.getEncodedHex = function() {
          var b = new KJUR.asn1.DERSet({
            array: this.asn1Array
          });
          this.TLV = b.getEncodedHex();
          return this.TLV
        };
        if (typeof a != "undefined") {
          if (typeof a.str != "undefined") {
            this.addByString(a.str)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.AttributeTypeAndValue = function(b) {
        KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);
        var d = null;
        var c = null;
        var a = "utf8";
        this.setByString = function(e) {
          if (e.match(/^([^=]+)=(.+)$/)) {
            this.setByAttrTypeAndValueStr(RegExp.$1, RegExp.$2)
          } else {
            throw "malformed attrTypeAndValueStr: " + e
          }
        };
        this.setByAttrTypeAndValueStr = function(g, f) {
          this.typeObj = KJUR.asn1.x509.OID.atype2obj(g);
          var e = a;
          if (g == "C") {
            e = "prn"
          }
          this.valueObj = this.getValueObj(e, f)
        };
        this.getValueObj = function(f, e) {
          if (f == "utf8") {
            return new KJUR.asn1.DERUTF8String({
              str: e
            })
          }
          if (f == "prn") {
            return new KJUR.asn1.DERPrintableString({
              str: e
            })
          }
          if (f == "tel") {
            return new KJUR.asn1.DERTeletexString({
              str: e
            })
          }
          if (f == "ia5") {
            return new KJUR.asn1.DERIA5String({
              str: e
            })
          }
          throw "unsupported directory string type: type=" + f + " value=" + e
        };
        this.getEncodedHex = function() {
          var e = new KJUR.asn1.DERSequence({
            array: [this.typeObj, this.valueObj]
          });
          this.TLV = e.getEncodedHex();
          return this.TLV
        };
        if (typeof b != "undefined") {
          if (typeof b.str != "undefined") {
            this.setByString(b.str)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.SubjectPublicKeyInfo = function(d) {
        KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);
        var b = null;
        var c = null;
        var a = null;
        this.setRSAKey = function(e) {
          if (!RSAKey.prototype.isPrototypeOf(e)) {
            throw "argument is not RSAKey instance"
          }
          this.rsaKey = e;
          var g = new KJUR.asn1.DERInteger({
            bigint: e.n
          });
          var f = new KJUR.asn1.DERInteger({
            "int": e.e
          });
          var i = new KJUR.asn1.DERSequence({
            array: [g, f]
          });
          var h = i.getEncodedHex();
          this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
            name: "rsaEncryption"
          });
          this.asn1SubjPKey = new KJUR.asn1.DERBitString({
            hex: "00" + h
          })
        };
        this.setRSAPEM = function(g) {
          if (g.match(/-----BEGIN PUBLIC KEY-----/)) {
            var n = g;
            n = n.replace(/^-----[^-]+-----/, "");
            n = n.replace(/-----[^-]+-----\s*$/, "");
            var m = n.replace(/\s+/g, "");
            var f = CryptoJS.enc.Base64.parse(m);
            var i = CryptoJS.enc.Hex.stringify(f);
            var k = _rsapem_getHexValueArrayOfChildrenFromHex(i);
            var h = k[1];
            var l = h.substr(2);
            var e = _rsapem_getHexValueArrayOfChildrenFromHex(l);
            var j = new RSAKey();
            j.setPublic(e[0], e[1]);
            this.setRSAKey(j)
          } else {
            throw "key not supported"
          }
        };
        this.getASN1Object = function() {
          if (this.asn1AlgId == null || this.asn1SubjPKey == null) {
            throw "algId and/or subjPubKey not set"
          }
          var e = new KJUR.asn1.DERSequence({
            array: [this.asn1AlgId, this.asn1SubjPKey]
          });
          return e
        };
        this.getEncodedHex = function() {
          var e = this.getASN1Object();
          this.hTLV = e.getEncodedHex();
          return this.hTLV
        };
        this._setRSAKey = function(e) {
          var g = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": {
                bigint: e.n
              }
            }, {
              "int": {
                "int": e.e
              }
            }]
          });
          var f = g.getEncodedHex();
          this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
            name: "rsaEncryption"
          });
          this.asn1SubjPKey = new KJUR.asn1.DERBitString({
            hex: "00" + f
          })
        };
        this._setEC = function(e) {
          var f = new KJUR.asn1.DERObjectIdentifier({
            name: e.curveName
          });
          this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
            name: "ecPublicKey",
            asn1params: f
          });
          this.asn1SubjPKey = new KJUR.asn1.DERBitString({
            hex: "00" + e.pubKeyHex
          })
        };
        this._setDSA = function(e) {
          var f = new KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": {
                bigint: e.p
              }
            }, {
              "int": {
                bigint: e.q
              }
            }, {
              "int": {
                bigint: e.g
              }
            }]
          });
          this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
            name: "dsa",
            asn1params: f
          });
          var g = new KJUR.asn1.DERInteger({
            bigint: e.y
          });
          this.asn1SubjPKey = new KJUR.asn1.DERBitString({
            hex: "00" + g.getEncodedHex()
          })
        };
        if (typeof d != "undefined") {
          if (typeof RSAKey != "undefined" && d instanceof RSAKey) {
            this._setRSAKey(d)
          } else {
            if (typeof KJUR.crypto.ECDSA != "undefined" && d instanceof KJUR.crypto.ECDSA) {
              this._setEC(d)
            } else {
              if (typeof KJUR.crypto.DSA != "undefined" && d instanceof KJUR.crypto.DSA) {
                this._setDSA(d)
              } else {
                if (typeof d.rsakey != "undefined") {
                  this.setRSAKey(d.rsakey)
                } else {
                  if (typeof d.rsapem != "undefined") {
                    this.setRSAPEM(d.rsapem)
                  }
                }
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.Time = function(c) {
        KJUR.asn1.x509.Time.superclass.constructor.call(this);
        var b = null;
        var a = null;
        this.setTimeParams = function(d) {
          this.timeParams = d
        };
        this.getEncodedHex = function() {
          var d = null;
          if (this.timeParams != null) {
            if (this.type == "utc") {
              d = new KJUR.asn1.DERUTCTime(this.timeParams)
            } else {
              d = new KJUR.asn1.DERGeneralizedTime(this.timeParams)
            }
          } else {
            if (this.type == "utc") {
              d = new KJUR.asn1.DERUTCTime()
            } else {
              d = new KJUR.asn1.DERGeneralizedTime()
            }
          }
          this.TLV = d.getEncodedHex();
          return this.TLV
        };
        this.type = "utc";
        if (typeof c != "undefined") {
          if (typeof c.type != "undefined") {
            this.type = c.type
          } else {
            if (typeof c.str != "undefined") {
              if (c.str.match(/^[0-9]{12}Z$/)) {
                this.type = "utc"
              }
              if (c.str.match(/^[0-9]{14}Z$/)) {
                this.type = "gen"
              }
            }
          }
          this.timeParams = c
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.AlgorithmIdentifier = function(e) {
        KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);
        var a = null;
        var d = null;
        var b = null;
        var c = false;
        this.getEncodedHex = function() {
          if (this.nameAlg == null && this.asn1Alg == null) {
            throw "algorithm not specified"
          }
          if (this.nameAlg != null && this.asn1Alg == null) {
            this.asn1Alg = KJUR.asn1.x509.OID.name2obj(this.nameAlg)
          }
          var f = [this.asn1Alg];
          if (!this.paramEmpty) {
            f.push(this.asn1Params)
          }
          var g = new KJUR.asn1.DERSequence({
            array: f
          });
          this.hTLV = g.getEncodedHex();
          return this.hTLV
        };
        if (typeof e != "undefined") {
          if (typeof e.name != "undefined") {
            this.nameAlg = e.name
          }
          if (typeof e.asn1params != "undefined") {
            this.asn1Params = e.asn1params
          }
          if (typeof e.paramempty != "undefined") {
            this.paramEmpty = e.paramempty
          }
        }
        if (this.asn1Params == null) {
          this.asn1Params = new KJUR.asn1.DERNull()
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.GeneralName = function(d) {
        KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);
        var c = null;
        var b = null;
        var a = {
          rfc822: "81",
          dns: "82",
          uri: "86"
        };
        this.setByParam = function(g) {
          var f = null;
          var e = null;
          if (typeof g.rfc822 != "undefined") {
            this.type = "rfc822";
            e = new KJUR.asn1.DERIA5String({
              str: g[this.type]
            })
          }
          if (typeof g.dns != "undefined") {
            this.type = "dns";
            e = new KJUR.asn1.DERIA5String({
              str: g[this.type]
            })
          }
          if (typeof g.uri != "undefined") {
            this.type = "uri";
            e = new KJUR.asn1.DERIA5String({
              str: g[this.type]
            })
          }
          if (this.type == null) {
            throw "unsupported type in params=" + g
          }
          this.asn1Obj = new KJUR.asn1.DERTaggedObject({
            explicit: false,
            tag: a[this.type],
            obj: e
          })
        };
        this.getEncodedHex = function() {
          return this.asn1Obj.getEncodedHex()
        };
        if (typeof d != "undefined") {
          this.setByParam(d)
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.GeneralNames = function(b) {
        KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);
        var a = null;
        this.setByParamArray = function(e) {
          for (var c = 0; c < e.length; c++) {
            var d = new KJUR.asn1.x509.GeneralName(e[c]);
            this.asn1Array.push(d)
          }
        };
        this.getEncodedHex = function() {
          var c = new KJUR.asn1.DERSequence({
            array: this.asn1Array
          });
          return c.getEncodedHex()
        };
        this.asn1Array = new Array();
        if (typeof b != "undefined") {
          this.setByParamArray(b)
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.DistributionPointName = function(b) {
        KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);
        var e = null;
        var c = null;
        var a = null;
        var d = null;
        this.getEncodedHex = function() {
          if (this.type != "full") {
            throw "currently type shall be 'full': " + this.type
          }
          this.asn1Obj = new KJUR.asn1.DERTaggedObject({
            explicit: false,
            tag: this.tag,
            obj: this.asn1V
          });
          this.hTLV = this.asn1Obj.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (KJUR.asn1.x509.GeneralNames.prototype.isPrototypeOf(b)) {
            this.type = "full";
            this.tag = "a0";
            this.asn1V = b
          } else {
            throw "This class supports GeneralNames only as argument"
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.DistributionPoint = function(b) {
        KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);
        var a = null;
        this.getEncodedHex = function() {
          var c = new KJUR.asn1.DERSequence();
          if (this.asn1DP != null) {
            var d = new KJUR.asn1.DERTaggedObject({
              explicit: true,
              tag: "a0",
              obj: this.asn1DP
            });
            c.appendASN1Object(d)
          }
          this.hTLV = c.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (typeof b.dpobj != "undefined") {
            this.asn1DP = b.dpobj
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object);
      KJUR.asn1.x509.OID = new function(a) {
        this.atype2oidList = {
          C: "2.5.4.6",
          O: "2.5.4.10",
          OU: "2.5.4.11",
          ST: "2.5.4.8",
          L: "2.5.4.7",
          CN: "2.5.4.3",
          DN: "2.5.4.49",
          DC: "0.9.2342.19200300.100.1.25"
        };
        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",
          subjectKeyIdentifier: "2.5.29.14",
          countryName: "2.5.4.6",
          organization: "2.5.4.10",
          organizationalUnit: "2.5.4.11",
          stateOrProvinceName: "2.5.4.8",
          locality: "2.5.4.7",
          commonName: "2.5.4.3",
          keyUsage: "2.5.29.15",
          basicConstraints: "2.5.29.19",
          cRLDistributionPoints: "2.5.29.31",
          certificatePolicies: "2.5.29.32",
          authorityKeyIdentifier: "2.5.29.35",
          extKeyUsage: "2.5.29.37",
          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"
        };
        this.objCache = {};
        this.name2obj = function(b) {
          if (typeof this.objCache[b] != "undefined") {
            return this.objCache[b]
          }
          if (typeof this.name2oidList[b] == "undefined") {
            throw "Name of ObjectIdentifier not defined: " + b
          }
          var c = this.name2oidList[b];
          var d = new KJUR.asn1.DERObjectIdentifier({
            oid: c
          });
          this.objCache[b] = d;
          return d
        };
        this.atype2obj = function(b) {
          if (typeof this.objCache[b] != "undefined") {
            return this.objCache[b]
          }
          if (typeof this.atype2oidList[b] == "undefined") {
            throw "AttributeType name undefined: " + b
          }
          var c = this.atype2oidList[b];
          var d = new KJUR.asn1.DERObjectIdentifier({
            oid: c
          });
          this.objCache[b] = d;
          return d
        }
      };
      KJUR.asn1.x509.OID.oid2name = function(b) {
        var c = KJUR.asn1.x509.OID.name2oidList;
        for (var a in c) {
          if (c[a] == b) {
            return a
          }
        }
        return ""
      };
      KJUR.asn1.x509.X509Util = new function() {
        this.getPKCS8PubKeyPEMfromRSAKey = function(i) {
          var h = null;
          var f = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(i.n);
          var j = KJUR.asn1.ASN1Util.integerToByteHex(i.e);
          var a = new KJUR.asn1.DERInteger({
            hex: f
          });
          var g = new KJUR.asn1.DERInteger({
            hex: j
          });
          var l = new KJUR.asn1.DERSequence({
            array: [a, g]
          });
          var c = l.getEncodedHex();
          var d = new KJUR.asn1.x509.AlgorithmIdentifier({
            name: "rsaEncryption"
          });
          var b = new KJUR.asn1.DERBitString({
            hex: "00" + c
          });
          var k = new KJUR.asn1.DERSequence({
            array: [d, b]
          });
          var e = k.getEncodedHex();
          var h = KJUR.asn1.ASN1Util.getPEMStringFromHex(e, "PUBLIC KEY");
          return h
        }
      };
      KJUR.asn1.x509.X509Util.newCertPEM = function(f) {
        var c = KJUR.asn1.x509;
        var e = new c.TBSCertificate();
        if (f.serial !== undefined) {
          e.setSerialNumberByParam(f.serial)
        } else {
          throw "serial number undefined."
        }
        if (typeof f.sigalg.name == "string") {
          e.setSignatureAlgByParam(f.sigalg)
        } else {
          throw "unproper signature algorithm name"
        }
        if (f.issuer !== undefined) {
          e.setIssuerByParam(f.issuer)
        } else {
          throw "issuer name undefined."
        }
        if (f.notbefore !== undefined) {
          e.setNotBeforeByParam(f.notbefore)
        } else {
          throw "notbefore undefined."
        }
        if (f.notafter !== undefined) {
          e.setNotAfterByParam(f.notafter)
        } else {
          throw "notafter undefined."
        }
        if (f.subject !== undefined) {
          e.setSubjectByParam(f.subject)
        } else {
          throw "subject name undefined."
        }
        if (f.sbjpubkey !== undefined) {
          e.setSubjectPublicKeyByGetKey(f.sbjpubkey)
        } else {
          throw "subject public key undefined."
        }
        if (f.ext !== undefined && f.ext.length !== undefined) {
          for (var b = 0; b < f.ext.length; b++) {
            for (key in f.ext[b]) {
              e.appendExtensionByName(key, f.ext[b][key])
            }
          }
        }
        if (f.cakey === undefined && f.sighex === undefined) {
          throw "param cakey and sighex undefined."
        }
        var d = null;
        var a = null;
        if (f.cakey) {
          d = KEYUTIL.getKey.apply(null, f.cakey);
          a = new c.Certificate({
            tbscertobj: e,
            prvkeyobj: d
          });
          a.sign()
        }
        if (f.sighex) {
          a = new c.Certificate({
            tbscertobj: e
          });
          a.setSignatureHex(f.sighex)
        }
        return a.getPEMString()
      };
      /*! asn1cms-1.0.2.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      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(b) {
        KJUR.asn1.cms.Attribute.superclass.constructor.call(this);
        var a = [];
        this.getEncodedHex = function() {
          var f, e, c;
          f = new KJUR.asn1.DERObjectIdentifier({
            oid: this.attrTypeOid
          });
          e = new KJUR.asn1.DERSet({
            array: this.valueList
          });
          try {
            e.getEncodedHex()
          } catch (d) {
            throw "fail valueSet.getEncodedHex in Attribute(1)/" + d
          }
          c = new KJUR.asn1.DERSequence({
            array: [f, e]
          });
          try {
            this.hTLV = c.getEncodedHex()
          } catch (d) {
            throw "failed seq.getEncodedHex in Attribute(2)/" + d
          }
          return this.hTLV
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.ContentType = function(b) {
        KJUR.asn1.cms.ContentType.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.3";
        var a = null;
        if (typeof b != "undefined") {
          var a = new KJUR.asn1.DERObjectIdentifier(b);
          this.valueList = [a]
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cms.MessageDigest = function(e) {
        KJUR.asn1.cms.MessageDigest.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.4";
        if (typeof e != "undefined") {
          if (e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo && typeof e.hashAlg == "string") {
            var b = e.eciObj.eContentValueHex;
            var a = e.hashAlg;
            var c = KJUR.crypto.Util.hashHex(b, a);
            var d = new KJUR.asn1.DEROctetString({
              hex: c
            });
            d.getEncodedHex();
            this.valueList = [d]
          } else {
            var d = new KJUR.asn1.DEROctetString(e);
            d.getEncodedHex();
            this.valueList = [d]
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cms.SigningTime = function(c) {
        KJUR.asn1.cms.SigningTime.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.5";
        if (typeof c != "undefined") {
          var a = new KJUR.asn1.x509.Time(c);
          try {
            a.getEncodedHex()
          } catch (b) {
            throw "SigningTime.getEncodedHex() failed/" + b
          }
          this.valueList = [a]
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cms.SigningCertificate = function(d) {
        KJUR.asn1.cms.SigningCertificate.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.16.2.12";
        var a = KJUR.asn1;
        var c = KJUR.asn1.cms;
        var b = KJUR.crypto;
        this.setCerts = function(l) {
          var j = [];
          for (var h = 0; h < l.length; h++) {
            var f = KEYUTIL.getHexFromPEM(l[h]);
            var e = b.Util.hashHex(f, "sha1");
            var m = new a.DEROctetString({
              hex: e
            });
            m.getEncodedHex();
            var k = new c.IssuerAndSerialNumber({
              cert: l[h]
            });
            k.getEncodedHex();
            var n = new a.DERSequence({
              array: [m, k]
            });
            n.getEncodedHex();
            j.push(n)
          }
          var g = new a.DERSequence({
            array: j
          });
          g.getEncodedHex();
          this.valueList = [g]
        };
        if (typeof d != "undefined") {
          if (typeof d.array == "object") {
            this.setCerts(d.array)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cms.SigningCertificateV2 = function(e) {
        KJUR.asn1.cms.SigningCertificateV2.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.16.2.47";
        var b = KJUR.asn1;
        var f = KJUR.asn1.x509;
        var d = KJUR.asn1.cms;
        var c = KJUR.crypto;
        this.setCerts = function(p, h) {
          var n = [];
          for (var l = 0; l < p.length; l++) {
            var j = KEYUTIL.getHexFromPEM(p[l]);
            var r = [];
            if (h != "sha256") {
              r.push(new f.AlgorithmIdentifier({
                name: h
              }))
            }
            var g = c.Util.hashHex(j, h);
            var q = new b.DEROctetString({
              hex: g
            });
            q.getEncodedHex();
            r.push(q);
            var m = new d.IssuerAndSerialNumber({
              cert: p[l]
            });
            m.getEncodedHex();
            r.push(m);
            var o = new b.DERSequence({
              array: r
            });
            o.getEncodedHex();
            n.push(o)
          }
          var k = new b.DERSequence({
            array: n
          });
          k.getEncodedHex();
          this.valueList = [k]
        };
        if (typeof e != "undefined") {
          if (typeof e.array == "object") {
            var a = "sha256";
            if (typeof e.hashAlg == "string") {
              a = e.hashAlg
            }
            this.setCerts(e.array, a)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cms.IssuerAndSerialNumber = function(c) {
        KJUR.asn1.cms.IssuerAndSerialNumber.superclass.constructor.call(this);
        var e = null;
        var b = null;
        var a = KJUR.asn1;
        var d = a.x509;
        this.setByCertPEM = function(i) {
          var g = KEYUTIL.getHexFromPEM(i);
          var f = new X509();
          f.hex = g;
          var j = f.getIssuerHex();
          this.dIssuer = new d.X500Name();
          this.dIssuer.hTLV = j;
          var h = f.getSerialNumberHex();
          this.dSerial = new a.DERInteger({
            hex: h
          })
        };
        this.getEncodedHex = function() {
          var f = new KJUR.asn1.DERSequence({
            array: [this.dIssuer, this.dSerial]
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (typeof c == "string" && c.indexOf("-----BEGIN ") != -1) {
            this.setByCertPEM(c)
          }
          if (c.issuer && c.serial) {
            if (c.issuer instanceof KJUR.asn1.x509.X500Name) {
              this.dIssuer = c.issuer
            } else {
              this.dIssuer = new KJUR.asn1.x509.X500Name(c.issuer)
            }
            if (c.serial instanceof KJUR.asn1.DERInteger) {
              this.dSerial = c.serial
            } else {
              this.dSerial = new KJUR.asn1.DERInteger(c.serial)
            }
          }
          if (typeof c.cert == "string") {
            this.setByCertPEM(c.cert)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.AttributeList = function(a) {
        KJUR.asn1.cms.AttributeList.superclass.constructor.call(this);
        this.list = new Array();
        this.sortFlag = true;
        this.add = function(b) {
          if (b instanceof KJUR.asn1.cms.Attribute) {
            this.list.push(b)
          }
        };
        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 b = new KJUR.asn1.DERSet({
            array: this.list,
            sortflag: this.sortFlag
          });
          this.hTLV = b.getEncodedHex();
          return this.hTLV
        };
        if (typeof a != "undefined") {
          if (typeof a.sortflag != "undefined" && a.sortflag == false) {
            this.sortFlag = false
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.SignerInfo = function(c) {
        KJUR.asn1.cms.SignerInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.cms;
        var d = KJUR.asn1.x509;
        this.dCMSVersion = new a.DERInteger({
          "int": 1
        });
        this.dSignerIdentifier = null;
        this.dDigestAlgorithm = null;
        this.dSignedAttrs = new b.AttributeList();
        this.dSigAlg = null;
        this.dSig = null;
        this.dUnsignedAttrs = new b.AttributeList();
        this.setSignerIdentifier = function(f) {
          if (typeof f == "string" && f.indexOf("CERTIFICATE") != -1 && f.indexOf("BEGIN") != -1 && f.indexOf("END") != -1) {
            var e = f;
            this.dSignerIdentifier = new b.IssuerAndSerialNumber({
              cert: f
            })
          }
        };
        this.setForContentAndHash = function(e) {
          if (typeof e != "undefined") {
            if (e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo) {
              this.dSignedAttrs.add(new b.ContentType({
                oid: "1.2.840.113549.1.7.1"
              }));
              this.dSignedAttrs.add(new b.MessageDigest({
                eciObj: e.eciObj,
                hashAlg: e.hashAlg
              }))
            }
            if (typeof e.sdObj != "undefined" && e.sdObj instanceof KJUR.asn1.cms.SignedData) {
              if (e.sdObj.digestAlgNameList.join(":").indexOf(e.hashAlg) == -1) {
                e.sdObj.digestAlgNameList.push(e.hashAlg)
              }
            }
            if (typeof e.hashAlg == "string") {
              this.dDigestAlgorithm = new d.AlgorithmIdentifier({
                name: e.hashAlg
              })
            }
          }
        };
        this.sign = function(j, f) {
          this.dSigAlg = new d.AlgorithmIdentifier({
            name: f
          });
          var g = this.dSignedAttrs.getEncodedHex();
          var e = KEYUTIL.getKey(j);
          var i = new KJUR.crypto.Signature({
            alg: f
          });
          i.init(e);
          i.updateHex(g);
          var h = i.sign();
          this.dSig = new a.DEROctetString({
            hex: h
          })
        };
        this.addUnsigned = function(e) {
          this.hTLV = null;
          this.dUnsignedAttrs.hTLV = null;
          this.dUnsignedAttrs.add(e)
        };
        this.getEncodedHex = function() {
          if (this.dSignedAttrs instanceof KJUR.asn1.cms.AttributeList && this.dSignedAttrs.length() == 0) {
            throw "SignedAttrs length = 0 (empty)"
          }
          var e = new a.DERTaggedObject({
            obj: this.dSignedAttrs,
            tag: "a0",
            explicit: false
          });
          var h = null;
          if (this.dUnsignedAttrs.length() > 0) {
            h = new a.DERTaggedObject({
              obj: this.dUnsignedAttrs,
              tag: "a1",
              explicit: false
            })
          }
          var g = [this.dCMSVersion, this.dSignerIdentifier, this.dDigestAlgorithm, e, this.dSigAlg, this.dSig, ];
          if (h != null) {
            g.push(h)
          }
          var f = new a.DERSequence({
            array: g
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.EncapsulatedContentInfo = function(c) {
        KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.cms;
        var d = KJUR.asn1.x509;
        this.dEContentType = new a.DERObjectIdentifier({
          name: "data"
        });
        this.dEContent = null;
        this.isDetached = false;
        this.eContentValueHex = null;
        this.setContentType = function(e) {
          if (e.match(/^[0-2][.][0-9.]+$/)) {
            this.dEContentType = new a.DERObjectIdentifier({
              oid: e
            })
          } else {
            this.dEContentType = new a.DERObjectIdentifier({
              name: e
            })
          }
        };
        this.setContentValue = function(e) {
          if (typeof e != "undefined") {
            if (typeof e.hex == "string") {
              this.eContentValueHex = e.hex
            } else {
              if (typeof e.str == "string") {
                this.eContentValueHex = utf8tohex(e.str)
              }
            }
          }
        };
        this.setContentValueHex = function(e) {
          this.eContentValueHex = e
        };
        this.setContentValueStr = function(e) {
          this.eContentValueHex = utf8tohex(e)
        };
        this.getEncodedHex = function() {
          if (typeof this.eContentValueHex != "string") {
            throw "eContentValue not yet set"
          }
          var g = new a.DEROctetString({
            hex: this.eContentValueHex
          });
          this.dEContent = new a.DERTaggedObject({
            obj: g,
            tag: "a0",
            explicit: true
          });
          var e = [this.dEContentType];
          if (!this.isDetached) {
            e.push(this.dEContent)
          }
          var f = new a.DERSequence({
            array: e
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.ContentInfo = function(c) {
        KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.cms;
        var d = KJUR.asn1.x509;
        this.dContentType = null;
        this.dContent = null;
        this.setContentType = function(e) {
          if (typeof e == "string") {
            this.dContentType = d.OID.name2obj(e)
          }
        };
        this.getEncodedHex = function() {
          var f = new a.DERTaggedObject({
            obj: this.dContent,
            tag: "a0",
            explicit: true
          });
          var e = new a.DERSequence({
            array: [this.dContentType, f]
          });
          this.hTLV = e.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (c.type) {
            this.setContentType(c.type)
          }
          if (c.obj && c.obj instanceof a.ASN1Object) {
            this.dContent = c.obj
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.SignedData = function(c) {
        KJUR.asn1.cms.SignedData.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.cms;
        var d = KJUR.asn1.x509;
        this.dCMSVersion = new a.DERInteger({
          "int": 1
        });
        this.dDigestAlgs = null;
        this.digestAlgNameList = [];
        this.dEncapContentInfo = new b.EncapsulatedContentInfo();
        this.dCerts = null;
        this.certificateList = [];
        this.crlList = [];
        this.signerInfoList = [new b.SignerInfo()];
        this.addCertificatesByPEM = function(e) {
          var f = KEYUTIL.getHexFromPEM(e);
          var g = new a.ASN1Object();
          g.hTLV = f;
          this.certificateList.push(g)
        };
        this.getEncodedHex = function() {
          if (typeof this.hTLV == "string") {
            return this.hTLV
          }
          if (this.dDigestAlgs == null) {
            var k = [];
            for (var j = 0; j < this.digestAlgNameList.length; j++) {
              var h = this.digestAlgNameList[j];
              var m = new d.AlgorithmIdentifier({
                name: h
              });
              k.push(m)
            }
            this.dDigestAlgs = new a.DERSet({
              array: k
            })
          }
          var e = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo];
          if (this.dCerts == null) {
            if (this.certificateList.length > 0) {
              var l = new a.DERSet({
                array: this.certificateList
              });
              this.dCerts = new a.DERTaggedObject({
                obj: l,
                tag: "a0",
                explicit: false
              })
            }
          }
          if (this.dCerts != null) {
            e.push(this.dCerts)
          }
          var g = new a.DERSet({
            array: this.signerInfoList
          });
          e.push(g);
          var f = new a.DERSequence({
            array: e
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        };
        this.getContentInfo = function() {
          this.getEncodedHex();
          var e = new b.ContentInfo({
            type: "signed-data",
            obj: this
          });
          return e
        };
        this.getContentInfoEncodedHex = function() {
          var e = this.getContentInfo();
          var f = e.getEncodedHex();
          return f
        };
        this.getPEM = function() {
          var e = this.getContentInfoEncodedHex();
          var f = a.ASN1Util.getPEMStringFromHex(e, "CMS");
          return f
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object);
      KJUR.asn1.cms.CMSUtil = new function() {};
      KJUR.asn1.cms.CMSUtil.newSignedData = function(a) {
        var h = KJUR.asn1.cms;
        var g = KJUR.asn1.cades;
        var f = new h.SignedData();
        f.dEncapContentInfo.setContentValue(a.content);
        if (typeof a.certs == "object") {
          for (var b = 0; b < a.certs.length; b++) {
            f.addCertificatesByPEM(a.certs[b])
          }
        }
        f.signerInfoList = [];
        for (var b = 0; b < a.signerInfos.length; b++) {
          var d = a.signerInfos[b];
          var c = new h.SignerInfo();
          c.setSignerIdentifier(d.signerCert);
          c.setForContentAndHash({
            sdObj: f,
            eciObj: f.dEncapContentInfo,
            hashAlg: d.hashAlg
          });
          for (attrName in d.sAttr) {
            var j = d.sAttr[attrName];
            if (attrName == "SigningTime") {
              var e = new h.SigningTime(j);
              c.dSignedAttrs.add(e)
            }
            if (attrName == "SigningCertificate") {
              var e = new h.SigningCertificate(j);
              c.dSignedAttrs.add(e)
            }
            if (attrName == "SigningCertificateV2") {
              var e = new h.SigningCertificateV2(j);
              c.dSignedAttrs.add(e)
            }
            if (attrName == "SignaturePolicyIdentifier") {
              var e = new g.SignaturePolicyIdentifier(j);
              c.dSignedAttrs.add(e)
            }
          }
          c.sign(d.signerPrvKey, d.sigAlg);
          f.signerInfoList.push(c)
        }
        return f
      };
      /*! asn1tsp-1.0.1.js (c) 2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      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(b) {
        KJUR.asn1.tsp.Accuracy.superclass.constructor.call(this);
        var a = KJUR.asn1;
        this.seconds = null;
        this.millis = null;
        this.micros = null;
        this.getEncodedHex = function() {
          var e = null;
          var g = null;
          var i = null;
          var c = [];
          if (this.seconds != null) {
            e = new a.DERInteger({
              "int": this.seconds
            });
            c.push(e)
          }
          if (this.millis != null) {
            var h = new a.DERInteger({
              "int": this.millis
            });
            g = new a.DERTaggedObject({
              obj: h,
              tag: "80",
              explicit: false
            });
            c.push(g)
          }
          if (this.micros != null) {
            var f = new a.DERInteger({
              "int": this.micros
            });
            i = new a.DERTaggedObject({
              obj: f,
              tag: "81",
              explicit: false
            });
            c.push(i)
          }
          var d = new a.DERSequence({
            array: c
          });
          this.hTLV = d.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (typeof b.seconds == "number") {
            this.seconds = b.seconds
          }
          if (typeof b.millis == "number") {
            this.millis = b.millis
          }
          if (typeof b.micros == "number") {
            this.micros = b.micros
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.MessageImprint = function(b) {
        KJUR.asn1.tsp.MessageImprint.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var c = KJUR.asn1.x509;
        this.dHashAlg = null;
        this.dHashValue = null;
        this.getEncodedHex = function() {
          if (typeof this.hTLV == "string") {
            return this.hTLV
          }
          var d = new a.DERSequence({
            array: [this.dHashAlg, this.dHashValue]
          });
          return d.getEncodedHex()
        };
        if (typeof b != "undefined") {
          if (typeof b.hashAlg == "string") {
            this.dHashAlg = new c.AlgorithmIdentifier({
              name: b.hashAlg
            })
          }
          if (typeof b.hashValue == "string") {
            this.dHashValue = new a.DEROctetString({
              hex: b.hashValue
            })
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.TimeStampReq = function(c) {
        KJUR.asn1.tsp.TimeStampReq.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.tsp;
        this.dVersion = new a.DERInteger({
          "int": 1
        });
        this.dMessageImprint = null;
        this.dPolicy = null;
        this.dNonce = null;
        this.certReq = true;
        this.setMessageImprint = function(d) {
          if (d instanceof KJUR.asn1.tsp.MessageImprint) {
            this.dMessageImprint = d;
            return
          }
          if (typeof d == "object") {
            this.dMessageImprint = new b.MessageImprint(d)
          }
        };
        this.getEncodedHex = function() {
          if (this.dMessageImprint == null) {
            throw "messageImprint shall be specified"
          }
          var d = [this.dVersion, this.dMessageImprint];
          if (this.dPolicy != null) {
            d.push(this.dPolicy)
          }
          if (this.dNonce != null) {
            d.push(this.dNonce)
          }
          if (this.certReq) {
            d.push(new a.DERBoolean())
          }
          var e = new a.DERSequence({
            array: d
          });
          this.hTLV = e.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (typeof c.mi == "object") {
            this.setMessageImprint(c.mi)
          }
          if (typeof c.policy == "object") {
            this.dPolicy = new a.DERObjectIdentifier(c.policy)
          }
          if (typeof c.nonce == "object") {
            this.dNonce = new a.DERInteger(c.nonce)
          }
          if (typeof c.certreq == "boolean") {
            this.certReq = c.certreq
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.TSTInfo = function(c) {
        KJUR.asn1.tsp.TSTInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var d = KJUR.asn1.x509;
        var b = KJUR.asn1.tsp;
        this.dVersion = new a.DERInteger({
          "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 e = [this.dVersion];
          if (this.dPolicy == null) {
            throw "policy shall be specified."
          }
          e.push(this.dPolicy);
          if (this.dMessageImprint == null) {
            throw "messageImprint shall be specified."
          }
          e.push(this.dMessageImprint);
          if (this.dSerialNumber == null) {
            throw "serialNumber shall be specified."
          }
          e.push(this.dSerialNumber);
          if (this.dGenTime == null) {
            throw "genTime shall be specified."
          }
          e.push(this.dGenTime);
          if (this.dAccuracy != null) {
            e.push(this.dAccuracy)
          }
          if (this.dOrdering != null) {
            e.push(this.dOrdering)
          }
          if (this.dNonce != null) {
            e.push(this.dNonce)
          }
          if (this.dTsa != null) {
            e.push(this.dTsa)
          }
          var f = new a.DERSequence({
            array: e
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (typeof c.policy == "string") {
            if (!c.policy.match(/^[0-9.]+$/)) {
              throw "policy shall be oid like 0.1.4.134"
            }
            this.dPolicy = new a.DERObjectIdentifier({
              oid: c.policy
            })
          }
          if (typeof c.messageImprint != "undefined") {
            this.dMessageImprint = new b.MessageImprint(c.messageImprint)
          }
          if (typeof c.serialNumber != "undefined") {
            this.dSerialNumber = new a.DERInteger(c.serialNumber)
          }
          if (typeof c.genTime != "undefined") {
            this.dGenTime = new a.DERGeneralizedTime(c.genTime)
          }
          if (typeof c.accuracy != "undefind") {
            this.dAccuracy = new b.Accuracy(c.accuracy)
          }
          if (typeof c.ordering != "undefined" && c.ordering == true) {
            this.dOrdering = new a.DERBoolean()
          }
          if (typeof c.nonce != "undefined") {
            this.dNonce = new a.DERInteger(c.nonce)
          }
          if (typeof c.tsa != "undefined") {
            this.dTsa = new d.X500Name(c.tsa)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.TimeStampResp = function(c) {
        KJUR.asn1.tsp.TimeStampResp.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.tsp;
        this.dStatus = null;
        this.dTST = null;
        this.getEncodedHex = function() {
          if (this.dStatus == null) {
            throw "status shall be specified"
          }
          var d = [this.dStatus];
          if (this.dTST != null) {
            d.push(this.dTST)
          }
          var e = new a.DERSequence({
            array: d
          });
          this.hTLV = e.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (typeof c.status == "object") {
            this.dStatus = new b.PKIStatusInfo(c.status)
          }
          if (typeof c.tst != "undefined" && c.tst instanceof KJUR.asn1.ASN1Object) {
            this.dTST = c.tst.getContentInfo()
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.PKIStatusInfo = function(c) {
        KJUR.asn1.tsp.PKIStatusInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.tsp;
        this.dStatus = null;
        this.dStatusString = null;
        this.dFailureInfo = null;
        this.getEncodedHex = function() {
          if (this.dStatus == null) {
            throw "status shall be specified"
          }
          var d = [this.dStatus];
          if (this.dStatusString != null) {
            d.push(this.dStatusString)
          }
          if (this.dFailureInfo != null) {
            d.push(this.dFailureInfo)
          }
          var e = new a.DERSequence({
            array: d
          });
          this.hTLV = e.getEncodedHex();
          return this.hTLV
        };
        if (typeof c != "undefined") {
          if (typeof c.status == "object") {
            this.dStatus = new b.PKIStatus(c.status)
          }
          if (typeof c.statstr == "object") {
            this.dStatusString = new b.PKIFreeText({
              array: c.statstr
            })
          }
          if (typeof c.failinfo == "object") {
            this.dFailureInfo = new b.PKIFailureInfo(c.failinfo)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.PKIStatus = function(e) {
        KJUR.asn1.tsp.PKIStatus.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.tsp;
        var d = null;
        this.getEncodedHex = function() {
          this.hTLV = this.dStatus.getEncodedHex();
          return this.hTLV
        };
        if (typeof e != "undefined") {
          if (typeof e.name != "undefined") {
            var c = b.PKIStatus.valueList;
            if (typeof c[e.name] == "undefined") {
              throw "name undefined: " + e.name
            }
            this.dStatus = new a.DERInteger({
              "int": c[e.name]
            })
          } else {
            this.dStatus = new a.DERInteger(e)
          }
        }
      };
      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(b) {
        KJUR.asn1.tsp.PKIFreeText.superclass.constructor.call(this);
        var a = KJUR.asn1;
        this.textList = [];
        this.getEncodedHex = function() {
          var c = [];
          for (var e = 0; e < this.textList.length; e++) {
            c.push(new a.DERUTF8String({
              str: this.textList[e]
            }))
          }
          var d = new a.DERSequence({
            array: c
          });
          this.hTLV = d.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (typeof b.array == "object") {
            this.textList = b.array
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText, KJUR.asn1.ASN1Object);
      KJUR.asn1.tsp.PKIFailureInfo = function(d) {
        KJUR.asn1.tsp.PKIFailureInfo.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.tsp;
        this.value = null;
        this.getEncodedHex = function() {
          if (this.value == null) {
            throw "value shall be specified"
          }
          var e = new Number(this.value).toString(2);
          var f = new a.DERBitString();
          f.setByBinaryString(e);
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        };
        if (typeof d != "undefined") {
          if (typeof d.name == "string") {
            var c = b.PKIFailureInfo.valueList;
            if (typeof c[d.name] == "undefined") {
              throw "name undefined: " + d.name
            }
            this.value = c[d.name]
          } else {
            if (typeof d["int"] == "number") {
              this.value = d["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(a) {
        this.getTSTHex = function(c, b) {
          throw "not implemented yet"
        }
      };
      KJUR.asn1.tsp.SimpleTSAAdapter = function(a) {
        KJUR.asn1.tsp.SimpleTSAAdapter.superclass.constructor.call(this);
        this.params = null;
        this.serial = 0;
        this.getTSTHex = function(c, b) {
          var e = KJUR.crypto.Util.hashHex(c, b);
          this.params.tstInfo.messageImprint = {
            hashAlg: b,
            hashValue: e
          };
          this.params.tstInfo.serialNumber = {
            "int": this.serial++
          };
          var d = Math.floor(Math.random() * 1000000000);
          this.params.tstInfo.nonce = {
            "int": d
          };
          var f = KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);
          return f.getContentInfoEncodedHex()
        };
        if (typeof a != "undefined") {
          this.params = a
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
      KJUR.asn1.tsp.FixedTSAAdapter = function(a) {
        KJUR.asn1.tsp.FixedTSAAdapter.superclass.constructor.call(this);
        this.params = null;
        this.getTSTHex = function(c, b) {
          var d = KJUR.crypto.Util.hashHex(c, b);
          this.params.tstInfo.messageImprint = {
            hashAlg: b,
            hashValue: d
          };
          var e = KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);
          return e.getContentInfoEncodedHex()
        };
        if (typeof a != "undefined") {
          this.params = a
        }
      };
      YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
      KJUR.asn1.tsp.TSPUtil = new function() {};
      KJUR.asn1.tsp.TSPUtil.newTimeStampToken = function(b) {
        var j = KJUR.asn1.cms;
        var a = KJUR.asn1.tsp;
        var g = new j.SignedData();
        var e = new a.TSTInfo(b.tstInfo);
        var f = e.getEncodedHex();
        g.dEncapContentInfo.setContentValue({
          hex: f
        });
        g.dEncapContentInfo.setContentType("tstinfo");
        if (typeof b.certs == "object") {
          for (var c = 0; c < b.certs.length; c++) {
            g.addCertificatesByPEM(b.certs[c])
          }
        }
        var d = g.signerInfoList[0];
        d.setSignerIdentifier(b.signerCert);
        d.setForContentAndHash({
          sdObj: g,
          eciObj: g.dEncapContentInfo,
          hashAlg: b.hashAlg
        });
        var h = new j.SigningCertificate({
          array: [b.signerCert]
        });
        d.dSignedAttrs.add(h);
        d.sign(b.signerPrvKey, b.sigAlg);
        return g
      };
      KJUR.asn1.tsp.TSPUtil.parseTimeStampReq = function(d) {
        var f = {};
        f.certreq = false;
        var h = ASN1HEX.getPosArrayOfChildren_AtObj(d, 0);
        if (h.length < 2) {
          throw "TimeStampReq must have at least 2 items"
        }
        var c = ASN1HEX.getHexOfTLV_AtObj(d, h[1]);
        f.mi = KJUR.asn1.tsp.TSPUtil.parseMessageImprint(c);
        for (var e = 2; e < h.length; e++) {
          var b = h[e];
          var a = d.substr(b, 2);
          if (a == "06") {
            var g = ASN1HEX.getHexOfV_AtObj(d, b);
            f.policy = ASN1HEX.hextooidstr(g)
          }
          if (a == "02") {
            f.nonce = ASN1HEX.getHexOfV_AtObj(d, b)
          }
          if (a == "01") {
            f.certreq = true
          }
        }
        return f
      };
      KJUR.asn1.tsp.TSPUtil.parseMessageImprint = function(c) {
        var h = {};
        if (c.substr(0, 2) != "30") {
          throw "head of messageImprint hex shall be '30'"
        }
        var a = ASN1HEX.getPosArrayOfChildren_AtObj(c, 0);
        var i = ASN1HEX.getDecendantIndexByNthList(c, 0, [0, 0]);
        var d = ASN1HEX.getHexOfV_AtObj(c, i);
        var e = ASN1HEX.hextooidstr(d);
        var g = KJUR.asn1.x509.OID.oid2name(e);
        if (g == "") {
          throw "hashAlg name undefined: " + e
        }
        var b = g;
        var f = ASN1HEX.getDecendantIndexByNthList(c, 0, [1]);
        h.hashAlg = b;
        h.hashValue = ASN1HEX.getHexOfV_AtObj(c, f);
        return h
      };
      /*! asn1cades-1.0.0.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      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(e) {
        KJUR.asn1.cades.SignaturePolicyIdentifier.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.16.2.15";
        var b = KJUR.asn1;
        var d = KJUR.asn1.cades;
        if (typeof e != "undefined") {
          if (typeof e.oid == "string" && typeof e.hash == "object") {
            var f = new b.DERObjectIdentifier({
              oid: e.oid
            });
            var a = new d.OtherHashAlgAndValue(e.hash);
            var c = new b.DERSequence({
              array: [f, a]
            });
            this.valueList = [c]
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cades.OtherHashAlgAndValue = function(b) {
        KJUR.asn1.cades.OtherHashAlgAndValue.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var c = KJUR.asn1.x509;
        this.dAlg = null;
        this.dHash = null;
        this.getEncodedHex = function() {
          var d = new a.DERSequence({
            array: [this.dAlg, this.dHash]
          });
          this.hTLV = d.getEncodedHex();
          return this.hTLV
        };
        if (typeof b != "undefined") {
          if (typeof b.alg == "string" && typeof b.hash == "string") {
            this.dAlg = new c.AlgorithmIdentifier({
              name: b.alg
            });
            this.dHash = new a.DEROctetString({
              hex: b.hash
            })
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue, KJUR.asn1.ASN1Object);
      KJUR.asn1.cades.SignatureTimeStamp = function(c) {
        KJUR.asn1.cades.SignatureTimeStamp.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.16.2.14";
        this.tstHex = null;
        var a = KJUR.asn1;
        if (typeof c != "undefined") {
          if (typeof c.res != "undefined") {
            if (typeof c.res == "string" && c.res.match(/^[0-9A-Fa-f]+$/)) {} else {
              if (c.res instanceof KJUR.asn1.ASN1Object) {} else {
                throw "res param shall be ASN1Object or hex string"
              }
            }
          }
          if (typeof c.tst != "undefined") {
            if (typeof c.tst == "string" && c.tst.match(/^[0-9A-Fa-f]+$/)) {
              var b = new a.ASN1Object();
              this.tstHex = c.tst;
              b.hTLV = this.tstHex;
              b.getEncodedHex();
              this.valueList = [b]
            } else {
              if (c.tst instanceof KJUR.asn1.ASN1Object) {} 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(c) {
        KJUR.asn1.cades.CompleteCertificateRefs.superclass.constructor.call(this);
        this.attrTypeOid = "1.2.840.113549.1.9.16.2.21";
        var a = KJUR.asn1;
        var b = KJUR.asn1.cades;
        this.setByArray = function(d) {
          this.valueList = [];
          for (var e = 0; e < d.length; e++) {
            var f = new b.OtherCertID(d[e]);
            this.valueList.push(f)
          }
        };
        if (typeof c != "undefined") {
          if (typeof c == "object" && typeof c.length == "number") {
            this.setByArray(c)
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs, KJUR.asn1.cms.Attribute);
      KJUR.asn1.cades.OtherCertID = function(d) {
        KJUR.asn1.cades.OtherCertID.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var c = KJUR.asn1.cms;
        var b = KJUR.asn1.cades;
        this.hasIssuerSerial = true;
        this.dOtherCertHash = null;
        this.dIssuerSerial = null;
        this.setByCertPEM = function(e) {
          this.dOtherCertHash = new b.OtherHash(e);
          if (this.hasIssuerSerial) {
            this.dIssuerSerial = new c.IssuerAndSerialNumber(e)
          }
        };
        this.getEncodedHex = function() {
          if (this.hTLV != null) {
            return this.hTLV
          }
          if (this.dOtherCertHash == null) {
            throw "otherCertHash not set"
          }
          var e = [this.dOtherCertHash];
          if (this.dIssuerSerial != null) {
            e.push(this.dIssuerSerial)
          }
          var f = new a.DERSequence({
            array: e
          });
          this.hTLV = f.getEncodedHex();
          return this.hTLV
        };
        if (typeof d != "undefined") {
          if (typeof d == "string" && d.indexOf("-----BEGIN ") != -1) {
            this.setByCertPEM(d)
          }
          if (typeof d == "object") {
            if (d.hasis === false) {
              this.hasIssuerSerial = false
            }
            if (typeof d.cert == "string") {
              this.setByCertPEM(d.cert)
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID, KJUR.asn1.ASN1Object);
      KJUR.asn1.cades.OtherHash = function(c) {
        KJUR.asn1.cades.OtherHash.superclass.constructor.call(this);
        var a = KJUR.asn1;
        var b = KJUR.asn1.cades;
        this.alg = "sha256";
        this.dOtherHash = null;
        this.setByCertPEM = function(d) {
          if (d.indexOf("-----BEGIN ") == -1) {
            throw "certPEM not to seem PEM format"
          }
          var e = X509.pemToHex(d);
          var f = KJUR.crypto.Util.hashHex(e, this.alg);
          this.dOtherHash = new b.OtherHashAlgAndValue({
            alg: this.alg,
            hash: f
          })
        };
        this.getEncodedHex = function() {
          if (this.dOtherHash == null) {
            throw "OtherHash not set"
          }
          return this.dOtherHash.getEncodedHex()
        };
        if (typeof c != "undefined") {
          if (typeof c == "string") {
            if (c.indexOf("-----BEGIN ") != -1) {
              this.setByCertPEM(c)
            } else {
              if (c.match(/^[0-9A-Fa-f]+$/)) {
                this.dOtherHash = new a.DEROctetString({
                  hex: c
                })
              } else {
                throw "unsupported string value for params"
              }
            }
          } else {
            if (typeof c == "object") {
              if (typeof c.cert == "string") {
                if (typeof c.alg == "string") {
                  this.alg = c.alg
                }
                this.setByCertPEM(c.cert)
              } else {
                this.dOtherHash = new b.OtherHashAlgAndValue(c)
              }
            }
          }
        }
      };
      YAHOO.lang.extend(KJUR.asn1.cades.OtherHash, KJUR.asn1.ASN1Object);
      KJUR.asn1.cades.CAdESUtil = new function() {};
      KJUR.asn1.cades.CAdESUtil.addSigTS = function(c, b, a) {};
      KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned = function(d) {
        var q = KJUR.asn1;
        var p = KJUR.asn1.cms;
        var c = KJUR.asn1.cades.CAdESUtil;
        var a = {};
        if (ASN1HEX.getDecendantHexTLVByNthList(d, 0, [0]) != "06092a864886f70d010702") {
          throw "hex is not CMS SignedData"
        }
        var s = ASN1HEX.getDecendantIndexByNthList(d, 0, [1, 0]);
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(d, s);
        if (b.length < 4) {
          throw "num of SignedData elem shall be 4 at least"
        }
        var f = b.shift();
        a.version = ASN1HEX.getHexOfTLV_AtObj(d, f);
        var l = b.shift();
        a.algs = ASN1HEX.getHexOfTLV_AtObj(d, l);
        var m = b.shift();
        a.encapcontent = ASN1HEX.getHexOfTLV_AtObj(d, m);
        a.certs = null;
        a.revs = null;
        a.si = [];
        var n = b.shift();
        if (d.substr(n, 2) == "a0") {
          a.certs = ASN1HEX.getHexOfTLV_AtObj(d, n);
          n = b.shift()
        }
        if (d.substr(n, 2) == "a1") {
          a.revs = ASN1HEX.getHexOfTLV_AtObj(d, n);
          n = b.shift()
        }
        var k = n;
        if (d.substr(k, 2) != "31") {
          throw "Can't find signerInfos"
        }
        var j = ASN1HEX.getPosArrayOfChildren_AtObj(d, k);
        for (var h = 0; h < j.length; h++) {
          var o = j[h];
          var e = c.parseSignerInfoForAddingUnsigned(d, o, h);
          a.si[h] = e
        }
        var g = null;
        a.obj = new p.SignedData();
        g = new q.ASN1Object();
        g.hTLV = a.version;
        a.obj.dCMSVersion = g;
        g = new q.ASN1Object();
        g.hTLV = a.algs;
        a.obj.dDigestAlgs = g;
        g = new q.ASN1Object();
        g.hTLV = a.encapcontent;
        a.obj.dEncapContentInfo = g;
        g = new q.ASN1Object();
        g.hTLV = a.certs;
        a.obj.dCerts = g;
        a.obj.signerInfoList = [];
        for (var h = 0; h < a.si.length; h++) {
          a.obj.signerInfoList.push(a.si[h].obj)
        }
        return a
      };
      KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned = function(d, k, a) {
        var m = KJUR.asn1;
        var l = KJUR.asn1.cms;
        var b = {};
        var e = ASN1HEX.getPosArrayOfChildren_AtObj(d, k);
        if (e.length != 6) {
          throw "not supported items for SignerInfo (!=6)"
        }
        var f = e.shift();
        b.version = ASN1HEX.getHexOfTLV_AtObj(d, f);
        var n = e.shift();
        b.si = ASN1HEX.getHexOfTLV_AtObj(d, n);
        var h = e.shift();
        b.digalg = ASN1HEX.getHexOfTLV_AtObj(d, h);
        var c = e.shift();
        b.sattrs = ASN1HEX.getHexOfTLV_AtObj(d, c);
        var i = e.shift();
        b.sigalg = ASN1HEX.getHexOfTLV_AtObj(d, i);
        var j = e.shift();
        b.sig = ASN1HEX.getHexOfTLV_AtObj(d, j);
        b.sigval = ASN1HEX.getHexOfV_AtObj(d, j);
        var g = null;
        b.obj = new l.SignerInfo();
        g = new m.ASN1Object();
        g.hTLV = b.version;
        b.obj.dCMSVersion = g;
        g = new m.ASN1Object();
        g.hTLV = b.si;
        b.obj.dSignerIdentifier = g;
        g = new m.ASN1Object();
        g.hTLV = b.digalg;
        b.obj.dDigestAlgorithm = g;
        g = new m.ASN1Object();
        g.hTLV = b.sattrs;
        b.obj.dSignedAttrs = g;
        g = new m.ASN1Object();
        g.hTLV = b.sigalg;
        b.obj.dSigAlg = g;
        g = new m.ASN1Object();
        g.hTLV = b.sig;
        b.obj.dSig = g;
        b.obj.dUnsignedAttrs = new l.AttributeList();
        return b
      };
      /*! base64x-1.1.3 (c) 2012-2014 Kenji Urushima | kjur.github.com/jsjws/license
       */
      function Base64x() {}

      function stoBA(d) {
        var b = new Array();
        for (var c = 0; c < d.length; c++) {
          b[c] = d.charCodeAt(c)
        }
        return b
      }

      function BAtos(b) {
        var d = "";
        for (var c = 0; c < b.length; c++) {
          d = d + String.fromCharCode(b[c])
        }
        return d
      }

      function BAtohex(b) {
        var e = "";
        for (var d = 0; d < b.length; d++) {
          var c = b[d].toString(16);
          if (c.length == 1) {
            c = "0" + c
          }
          e = e + c
        }
        return e
      }

      function stohex(a) {
        return BAtohex(stoBA(a))
      }

      function stob64(a) {
        return hex2b64(stohex(a))
      }

      function stob64u(a) {
        return b64tob64u(hex2b64(stohex(a)))
      }

      function b64utos(a) {
        return BAtos(b64toBA(b64utob64(a)))
      }

      function b64tob64u(a) {
        a = a.replace(/\=/g, "");
        a = a.replace(/\+/g, "-");
        a = a.replace(/\//g, "_");
        return a
      }

      function b64utob64(a) {
        if (a.length % 4 == 2) {
          a = a + "=="
        } else {
          if (a.length % 4 == 3) {
            a = a + "="
          }
        }
        a = a.replace(/-/g, "+");
        a = a.replace(/_/g, "/");
        return a
      }

      function hextob64u(a) {
        return b64tob64u(hex2b64(a))
      }

      function b64utohex(a) {
        return b64tohex(b64utob64(a))
      }
      var utf8tob64u, b64utoutf8;
      if (typeof Buffer === "function") {
        utf8tob64u = function(a) {
          return b64tob64u(new Buffer(a, "utf8").toString("base64"))
        };
        b64utoutf8 = function(a) {
          return new Buffer(b64utob64(a), "base64").toString("utf8")
        }
      } else {
        utf8tob64u = function(a) {
          return hextob64u(uricmptohex(encodeURIComponentAll(a)))
        };
        b64utoutf8 = function(a) {
          return decodeURIComponent(hextouricmp(b64utohex(a)))
        }
      }

      function utf8tob64(a) {
        return hex2b64(uricmptohex(encodeURIComponentAll(a)))
      }

      function b64toutf8(a) {
        return decodeURIComponent(hextouricmp(b64tohex(a)))
      }

      function utf8tohex(a) {
        return uricmptohex(encodeURIComponentAll(a))
      }

      function hextoutf8(a) {
        return decodeURIComponent(hextouricmp(a))
      }

      function hextorstr(c) {
        var b = "";
        for (var a = 0; a < c.length - 1; a += 2) {
          b += String.fromCharCode(parseInt(c.substr(a, 2), 16))
        }
        return b
      }

      function rstrtohex(c) {
        var a = "";
        for (var b = 0; b < c.length; b++) {
          a += ("0" + c.charCodeAt(b).toString(16)).slice(-2)
        }
        return a
      }

      function hextob64(a) {
        return hex2b64(a)
      }

      function hextob64nl(b) {
        var a = hextob64(b);
        var c = a.replace(/(.{64})/g, "$1\r\n");
        c = c.replace(/\r\n$/, "");
        return c
      }

      function b64nltohex(b) {
        var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");
        var c = b64tohex(a);
        return c
      }

      function uricmptohex(a) {
        return a.replace(/%/g, "")
      }

      function hextouricmp(a) {
        return a.replace(/(..)/g, "%$1")
      }

      function encodeURIComponentAll(a) {
        var d = encodeURIComponent(a);
        var b = "";
        for (var c = 0; c < d.length; c++) {
          if (d[c] == "%") {
            b = b + d.substr(c, 3);
            c = c + 2
          } else {
            b = b + "%" + stohex(d[c])
          }
        }
        return b
      }

      function newline_toUnix(a) {
        a = a.replace(/\r\n/mg, "\n");
        return a
      }

      function newline_toDos(a) {
        a = a.replace(/\r\n/mg, "\n");
        a = a.replace(/\n/mg, "\r\n");
        return a
      };
      /*! crypto-1.1.5.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      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(a, b) {
          if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
            throw "alg not supported in Util.DIGESTINFOHEAD: " + b
          }
          return this.DIGESTINFOHEAD[b] + a
        };
        this.getPaddedDigestInfoHex = function(h, a, j) {
          var c = this.getDigestInfoHex(h, a);
          var d = j / 4;
          if (c.length + 22 > d) {
            throw "key is too short for SigAlg: keylen=" + j + "," + a
          }
          var b = "0001";
          var k = "00" + c;
          var g = "";
          var l = d - b.length - k.length;
          for (var f = 0; f < l; f += 2) {
            g += "ff"
          }
          var e = b + g + k;
          return e
        };
        this.hashString = function(a, c) {
          var b = new KJUR.crypto.MessageDigest({
            alg: c
          });
          return b.digestString(a)
        };
        this.hashHex = function(b, c) {
          var a = new KJUR.crypto.MessageDigest({
            alg: c
          });
          return a.digestHex(b)
        };
        this.sha1 = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "sha1",
            prov: "cryptojs"
          });
          return b.digestString(a)
        };
        this.sha256 = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "sha256",
            prov: "cryptojs"
          });
          return b.digestString(a)
        };
        this.sha256Hex = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "sha256",
            prov: "cryptojs"
          });
          return b.digestHex(a)
        };
        this.sha512 = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "sha512",
            prov: "cryptojs"
          });
          return b.digestString(a)
        };
        this.sha512Hex = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "sha512",
            prov: "cryptojs"
          });
          return b.digestHex(a)
        };
        this.md5 = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "md5",
            prov: "cryptojs"
          });
          return b.digestString(a)
        };
        this.ripemd160 = function(a) {
          var b = new KJUR.crypto.MessageDigest({
            alg: "ripemd160",
            prov: "cryptojs"
          });
          return b.digestString(a)
        };
        this.getCryptoJSMDByName = function(a) {}
      };
      KJUR.crypto.MessageDigest = function(params) {
        var md = null;
        var algName = null;
        var provName = null;
        this.setAlgAndProvider = function(alg, prov) {
          if (alg != null && prov === undefined) {
            prov = KJUR.crypto.Util.DEFAULTPROVIDER[alg]
          }
          if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(alg) != -1 && prov == "cryptojs") {
            try {
              this.md = eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[alg]).create()
            } catch (ex) {
              throw "setAlgAndProvider hash alg set fail alg=" + alg + "/" + ex
            }
            this.updateString = function(str) {
              this.md.update(str)
            };
            this.updateHex = function(hex) {
              var wHex = CryptoJS.enc.Hex.parse(hex);
              this.md.update(wHex)
            };
            this.digest = function() {
              var hash = this.md.finalize();
              return hash.toString(CryptoJS.enc.Hex)
            };
            this.digestString = function(str) {
              this.updateString(str);
              return this.digest()
            };
            this.digestHex = function(hex) {
              this.updateHex(hex);
              return this.digest()
            }
          }
          if (":sha256:".indexOf(alg) != -1 && prov == "sjcl") {
            try {
              this.md = new sjcl.hash.sha256()
            } catch (ex) {
              throw "setAlgAndProvider hash alg set fail alg=" + alg + "/" + ex
            }
            this.updateString = function(str) {
              this.md.update(str)
            };
            this.updateHex = function(hex) {
              var baHex = sjcl.codec.hex.toBits(hex);
              this.md.update(baHex)
            };
            this.digest = function() {
              var hash = this.md.finalize();
              return sjcl.codec.hex.fromBits(hash)
            };
            this.digestString = function(str) {
              this.updateString(str);
              return this.digest()
            };
            this.digestHex = function(hex) {
              this.updateHex(hex);
              return this.digest()
            }
          }
        };
        this.updateString = function(str) {
          throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
        };
        this.updateHex = function(hex) {
          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(str) {
          throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
        };
        this.digestHex = function(hex) {
          throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName
        };
        if (params !== undefined) {
          if (params.alg !== undefined) {
            this.algName = params.alg;
            if (params.prov === undefined) {
              this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            }
            this.setAlgAndProvider(this.algName, this.provName)
          }
        }
      };
      KJUR.crypto.Mac = function(params) {
        var mac = null;
        var pass = null;
        var algName = null;
        var provName = null;
        var algProv = null;
        this.setAlgAndProvider = function(alg, prov) {
          if (alg == null) {
            alg = "hmacsha1"
          }
          alg = alg.toLowerCase();
          if (alg.substr(0, 4) != "hmac") {
            throw "setAlgAndProvider unsupported HMAC alg: " + alg
          }
          if (prov === undefined) {
            prov = KJUR.crypto.Util.DEFAULTPROVIDER[alg]
          }
          this.algProv = alg + "/" + prov;
          var hashAlg = alg.substr(4);
          if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(hashAlg) != -1 && prov == "cryptojs") {
            try {
              var mdObj = eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[hashAlg]);
              this.mac = CryptoJS.algo.HMAC.create(mdObj, this.pass)
            } catch (ex) {
              throw "setAlgAndProvider hash alg set fail hashAlg=" + hashAlg + "/" + ex
            }
            this.updateString = function(str) {
              this.mac.update(str)
            };
            this.updateHex = function(hex) {
              var wHex = CryptoJS.enc.Hex.parse(hex);
              this.mac.update(wHex)
            };
            this.doFinal = function() {
              var hash = this.mac.finalize();
              return hash.toString(CryptoJS.enc.Hex)
            };
            this.doFinalString = function(str) {
              this.updateString(str);
              return this.doFinal()
            };
            this.doFinalHex = function(hex) {
              this.updateHex(hex);
              return this.doFinal()
            }
          }
        };
        this.updateString = function(str) {
          throw "updateString(str) not supported for this alg/prov: " + this.algProv
        };
        this.updateHex = function(hex) {
          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(str) {
          throw "digestString(str) not supported for this alg/prov: " + this.algProv
        };
        this.doFinalHex = function(hex) {
          throw "digestHex(hex) not supported for this alg/prov: " + this.algProv
        };
        if (params !== undefined) {
          if (params.pass !== undefined) {
            this.pass = params.pass
          }
          if (params.alg !== undefined) {
            this.algName = params.alg;
            if (params.prov === undefined) {
              this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            }
            this.setAlgAndProvider(this.algName, this.provName)
          }
        }
      };
      KJUR.crypto.Signature = function(o) {
        var q = null;
        var n = null;
        var r = null;
        var c = null;
        var l = null;
        var d = null;
        var k = null;
        var h = null;
        var p = null;
        var e = null;
        var b = -1;
        var g = null;
        var j = null;
        var a = null;
        var i = null;
        var f = null;
        this._setAlgNames = function() {
          if (this.algName.match(/^(.+)with(.+)$/)) {
            this.mdAlgName = RegExp.$1.toLowerCase();
            this.pubkeyAlgName = RegExp.$2.toLowerCase()
          }
        };
        this._zeroPaddingOfSignature = function(x, w) {
          var v = "";
          var t = w / 4 - x.length;
          for (var u = 0; u < t; u++) {
            v = v + "0"
          }
          return v + x
        };
        this.setAlgAndProvider = function(u, t) {
          this._setAlgNames();
          if (t != "cryptojs/jsrsa") {
            throw "provider not supported: " + t
          }
          if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
            try {
              this.md = new KJUR.crypto.MessageDigest({
                alg: this.mdAlgName
              })
            } catch (s) {
              throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s
            }
            this.init = function(w, x) {
              var y = null;
              try {
                if (x === undefined) {
                  y = KEYUTIL.getKey(w)
                } else {
                  y = KEYUTIL.getKey(w, x)
                }
              } catch (v) {
                throw "init failed:" + v
              }
              if (y.isPrivate === true) {
                this.prvKey = y;
                this.state = "SIGN"
              } else {
                if (y.isPublic === true) {
                  this.pubKey = y;
                  this.state = "VERIFY"
                } else {
                  throw "init failed.:" + y
                }
              }
            };
            this.initSign = function(v) {
              if (typeof v.ecprvhex == "string" && typeof v.eccurvename == "string") {
                this.ecprvhex = v.ecprvhex;
                this.eccurvename = v.eccurvename
              } else {
                this.prvKey = v
              }
              this.state = "SIGN"
            };
            this.initVerifyByPublicKey = function(v) {
              if (typeof v.ecpubhex == "string" && typeof v.eccurvename == "string") {
                this.ecpubhex = v.ecpubhex;
                this.eccurvename = v.eccurvename
              } else {
                if (v instanceof KJUR.crypto.ECDSA) {
                  this.pubKey = v
                } else {
                  if (v instanceof RSAKey) {
                    this.pubKey = v
                  }
                }
              }
              this.state = "VERIFY"
            };
            this.initVerifyByCertificatePEM = function(v) {
              var w = new X509();
              w.readCertPEM(v);
              this.pubKey = w.subjectPublicKeyRSA;
              this.state = "VERIFY"
            };
            this.updateString = function(v) {
              this.md.updateString(v)
            };
            this.updateHex = function(v) {
              this.md.updateHex(v)
            };
            this.sign = function() {
              this.sHashHex = this.md.digest();
              if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
                var v = new KJUR.crypto.ECDSA({
                  curve: this.eccurvename
                });
                this.hSign = v.signHex(this.sHashHex, this.ecprvhex)
              } else {
                if (this.pubkeyAlgName == "rsaandmgf1") {
                  this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen)
                } else {
                  if (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 public key alg: " + this.pubkeyAlgName
                      }
                    }
                  }
                }
              }
              return this.hSign
            };
            this.signString = function(v) {
              this.updateString(v);
              this.sign()
            };
            this.signHex = function(v) {
              this.updateHex(v);
              this.sign()
            };
            this.verify = function(v) {
              this.sHashHex = this.md.digest();
              if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
                var w = new KJUR.crypto.ECDSA({
                  curve: this.eccurvename
                });
                return w.verifyHex(this.sHashHex, v, this.ecpubhex)
              } else {
                if (this.pubkeyAlgName == "rsaandmgf1") {
                  return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen)
                } else {
                  if (this.pubkeyAlgName == "rsa") {
                    return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                  } else {
                    if (this.pubKey instanceof KJUR.crypto.ECDSA) {
                      return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                    } else {
                      if (this.pubKey instanceof KJUR.crypto.DSA) {
                        return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                      } else {
                        throw "Signature: unsupported public key alg: " + this.pubkeyAlgName
                      }
                    }
                  }
                }
              }
            }
          }
        };
        this.init = function(s, t) {
          throw "init(key, pass) not supported for this alg:prov=" + this.algProvName
        };
        this.initVerifyByPublicKey = function(s) {
          throw "initVerifyByPublicKey(rsaPubKeyy) not supported for this alg:prov=" + this.algProvName
        };
        this.initVerifyByCertificatePEM = function(s) {
          throw "initVerifyByCertificatePEM(certPEM) not supported for this alg:prov=" + this.algProvName
        };
        this.initSign = function(s) {
          throw "initSign(prvKey) not supported for this alg:prov=" + this.algProvName
        };
        this.updateString = function(s) {
          throw "updateString(str) not supported for this alg:prov=" + this.algProvName
        };
        this.updateHex = function(s) {
          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(s) {
          throw "digestString(str) not supported for this alg:prov=" + this.algProvName
        };
        this.signHex = function(s) {
          throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName
        };
        this.verify = function(s) {
          throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName
        };
        this.initParams = o;
        if (o !== undefined) {
          if (o.alg !== undefined) {
            this.algName = o.alg;
            if (o.prov === undefined) {
              this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            } else {
              this.provName = o.prov
            }
            this.algProvName = this.algName + ":" + this.provName;
            this.setAlgAndProvider(this.algName, this.provName);
            this._setAlgNames()
          }
          if (o.psssaltlen !== undefined) {
            this.pssSaltLen = o.psssaltlen
          }
          if (o.prvkeypem !== undefined) {
            if (o.prvkeypas !== undefined) {
              throw "both prvkeypem and prvkeypas parameters not supported"
            } else {
              try {
                var q = new RSAKey();
                q.readPrivateKeyFromPEMString(o.prvkeypem);
                this.initSign(q)
              } catch (m) {
                throw "fatal error to load pem private key: " + m
              }
            }
          }
        }
      };
      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"
        }
      };
      /*! ecdsa-modified-1.0.4.js (c) Stephan Thomas, Kenji Urushima | github.com/bitcoinjs/bitcoinjs-lib/blob/master/LICENSE
       */
      if (typeof KJUR == "undefined" || !KJUR) {
        KJUR = {}
      }
      if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
        KJUR.crypto = {}
      }
      KJUR.crypto.ECDSA = function(h) {
        var e = "secp256r1";
        var g = null;
        var b = null;
        var f = null;
        var a = new SecureRandom();
        var d = null;
        this.type = "EC";

        function c(s, o, r, n) {
          var j = Math.max(o.bitLength(), n.bitLength());
          var t = s.add2D(r);
          var q = s.curve.getInfinity();
          for (var p = j - 1; p >= 0; --p) {
            q = q.twice2D();
            q.z = BigInteger.ONE;
            if (o.testBit(p)) {
              if (n.testBit(p)) {
                q = q.add2D(t)
              } else {
                q = q.add2D(s)
              }
            } else {
              if (n.testBit(p)) {
                q = q.add2D(r)
              }
            }
          }
          return q
        }
        this.getBigRandom = function(i) {
          return new BigInteger(i.bitLength(), a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)
        };
        this.setNamedCurve = function(i) {
          this.ecparams = KJUR.crypto.ECParameterDB.getByName(i);
          this.prvKeyHex = null;
          this.pubKeyHex = null;
          this.curveName = i
        };
        this.setPrivateKeyHex = function(i) {
          this.isPrivate = true;
          this.prvKeyHex = i
        };
        this.setPublicKeyHex = function(i) {
          this.isPublic = true;
          this.pubKeyHex = i
        };
        this.generateKeyPairHex = function() {
          var k = this.ecparams.n;
          var n = this.getBigRandom(k);
          var l = this.ecparams.G.multiply(n);
          var q = l.getX().toBigInteger();
          var o = l.getY().toBigInteger();
          var i = this.ecparams.keylen / 4;
          var m = ("0000000000" + n.toString(16)).slice(-i);
          var r = ("0000000000" + q.toString(16)).slice(-i);
          var p = ("0000000000" + o.toString(16)).slice(-i);
          var j = "04" + r + p;
          this.setPrivateKeyHex(m);
          this.setPublicKeyHex(j);
          return {
            ecprvhex: m,
            ecpubhex: j
          }
        };
        this.signWithMessageHash = function(i) {
          return this.signHex(i, this.prvKeyHex)
        };
        this.signHex = function(o, j) {
          var t = new BigInteger(j, 16);
          var l = this.ecparams.n;
          var q = new BigInteger(o, 16);
          do {
            var m = this.getBigRandom(l);
            var u = this.ecparams.G;
            var p = u.multiply(m);
            var i = p.getX().toBigInteger().mod(l)
          } while (i.compareTo(BigInteger.ZERO) <= 0);
          var v = m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);
          return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i, v)
        };
        this.sign = function(m, u) {
          var q = u;
          var j = this.ecparams.n;
          var p = BigInteger.fromByteArrayUnsigned(m);
          do {
            var l = this.getBigRandom(j);
            var t = this.ecparams.G;
            var o = t.multiply(l);
            var i = o.getX().toBigInteger().mod(j)
          } while (i.compareTo(BigInteger.ZERO) <= 0);
          var v = l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);
          return this.serializeSig(i, v)
        };
        this.verifyWithMessageHash = function(j, i) {
          return this.verifyHex(j, i, this.pubKeyHex)
        };
        this.verifyHex = function(m, i, p) {
          var l, j;
          var o = KJUR.crypto.ECDSA.parseSigHex(i);
          l = o.r;
          j = o.s;
          var k;
          k = ECPointFp.decodeFromHex(this.ecparams.curve, p);
          var n = new BigInteger(m, 16);
          return this.verifyRaw(n, l, j, k)
        };
        this.verify = function(o, p, j) {
          var l, i;
          if (Bitcoin.Util.isArray(p)) {
            var n = this.parseSig(p);
            l = n.r;
            i = n.s
          } else {
            if ("object" === typeof p && p.r && p.s) {
              l = p.r;
              i = p.s
            } else {
              throw "Invalid value for signature"
            }
          }
          var k;
          if (j instanceof ECPointFp) {
            k = j
          } else {
            if (Bitcoin.Util.isArray(j)) {
              k = ECPointFp.decodeFrom(this.ecparams.curve, j)
            } else {
              throw "Invalid format for pubkey value, must be byte array or ECPointFp"
            }
          }
          var m = BigInteger.fromByteArrayUnsigned(o);
          return this.verifyRaw(m, l, i, k)
        };
        this.verifyRaw = function(o, i, w, m) {
          var l = this.ecparams.n;
          var u = this.ecparams.G;
          if (i.compareTo(BigInteger.ONE) < 0 || i.compareTo(l) >= 0) {
            return false
          }
          if (w.compareTo(BigInteger.ONE) < 0 || w.compareTo(l) >= 0) {
            return false
          }
          var p = w.modInverse(l);
          var k = o.multiply(p).mod(l);
          var j = i.multiply(p).mod(l);
          var q = u.multiply(k).add(m.multiply(j));
          var t = q.getX().toBigInteger().mod(l);
          return t.equals(i)
        };
        this.serializeSig = function(k, j) {
          var l = k.toByteArraySigned();
          var i = j.toByteArraySigned();
          var m = [];
          m.push(2);
          m.push(l.length);
          m = m.concat(l);
          m.push(2);
          m.push(i.length);
          m = m.concat(i);
          m.unshift(m.length);
          m.unshift(48);
          return m
        };
        this.parseSig = function(n) {
          var m;
          if (n[0] != 48) {
            throw new Error("Signature not a valid DERSequence")
          }
          m = 2;
          if (n[m] != 2) {
            throw new Error("First element in signature must be a DERInteger")
          }
          var l = n.slice(m + 2, m + 2 + n[m + 1]);
          m += 2 + n[m + 1];
          if (n[m] != 2) {
            throw new Error("Second element in signature must be a DERInteger")
          }
          var i = n.slice(m + 2, m + 2 + n[m + 1]);
          m += 2 + n[m + 1];
          var k = BigInteger.fromByteArrayUnsigned(l);
          var j = BigInteger.fromByteArrayUnsigned(i);
          return {
            r: k,
            s: j
          }
        };
        this.parseSigCompact = function(m) {
          if (m.length !== 65) {
            throw "Signature has the wrong length"
          }
          var j = m[0] - 27;
          if (j < 0 || j > 7) {
            throw "Invalid signature type"
          }
          var o = this.ecparams.n;
          var l = BigInteger.fromByteArrayUnsigned(m.slice(1, 33)).mod(o);
          var k = BigInteger.fromByteArrayUnsigned(m.slice(33, 65)).mod(o);
          return {
            r: l,
            s: k,
            i: j
          }
        };
        if (h !== undefined) {
          if (h.curve !== undefined) {
            this.curveName = h.curve
          }
        }
        if (this.curveName === undefined) {
          this.curveName = e
        }
        this.setNamedCurve(this.curveName);
        if (h !== undefined) {
          if (h.prv !== undefined) {
            this.setPrivateKeyHex(h.prv)
          }
          if (h.pub !== undefined) {
            this.setPublicKeyHex(h.pub)
          }
        }
      };
      KJUR.crypto.ECDSA.parseSigHex = function(a) {
        var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
        var d = new BigInteger(b.r, 16);
        var c = new BigInteger(b.s, 16);
        return {
          r: d,
          s: c
        }
      };
      KJUR.crypto.ECDSA.parseSigHexInHexRS = function(c) {
        if (c.substr(0, 2) != "30") {
          throw "signature is not a ASN.1 sequence"
        }
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(c, 0);
        if (b.length != 2) {
          throw "number of signature ASN.1 sequence elements seem wrong"
        }
        var g = b[0];
        var f = b[1];
        if (c.substr(g, 2) != "02") {
          throw "1st item of sequene of signature is not ASN.1 integer"
        }
        if (c.substr(f, 2) != "02") {
          throw "2nd item of sequene of signature is not ASN.1 integer"
        }
        var e = ASN1HEX.getHexOfV_AtObj(c, g);
        var d = ASN1HEX.getHexOfV_AtObj(c, f);
        return {
          r: e,
          s: d
        }
      };
      KJUR.crypto.ECDSA.asn1SigToConcatSig = function(c) {
        var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);
        var b = d.r;
        var a = d.s;
        if (b.substr(0, 2) == "00" && (((b.length / 2) * 8) % (16 * 8)) == 8) {
          b = b.substr(2)
        }
        if (a.substr(0, 2) == "00" && (((a.length / 2) * 8) % (16 * 8)) == 8) {
          a = a.substr(2)
        }
        if ((((b.length / 2) * 8) % (16 * 8)) != 0) {
          throw "unknown ECDSA sig r length error"
        }
        if ((((a.length / 2) * 8) % (16 * 8)) != 0) {
          throw "unknown ECDSA sig s length error"
        }
        return b + a
      };
      KJUR.crypto.ECDSA.concatSigToASN1Sig = function(a) {
        if ((((a.length / 2) * 8) % (16 * 8)) != 0) {
          throw "unknown ECDSA concatinated r-s sig  length error"
        }
        var c = a.substr(0, a.length / 2);
        var b = a.substr(a.length / 2);
        return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b)
      };
      KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function(b, a) {
        var d = new BigInteger(b, 16);
        var c = new BigInteger(a, 16);
        return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c)
      };
      KJUR.crypto.ECDSA.biRSSigToASN1Sig = function(e, c) {
        var b = new KJUR.asn1.DERInteger({
          bigint: e
        });
        var a = new KJUR.asn1.DERInteger({
          bigint: c
        });
        var d = new KJUR.asn1.DERSequence({
          array: [b, a]
        });
        return d.getEncodedHex()
      };
      /*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      if (typeof KJUR == "undefined" || !KJUR) {
        KJUR = {}
      }
      if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
        KJUR.crypto = {}
      }
      KJUR.crypto.ECParameterDB = new function() {
        var b = {};
        var c = {};

        function a(d) {
          return new BigInteger(d, 16)
        }
        this.getByName = function(e) {
          var d = e;
          if (typeof c[d] != "undefined") {
            d = c[e]
          }
          if (typeof b[d] != "undefined") {
            return b[d]
          }
          throw "unregistered EC curve name: " + d
        };
        this.regist = function(A, l, o, g, m, e, j, f, k, u, d, x) {
          b[A] = {};
          var s = a(o);
          var z = a(g);
          var y = a(m);
          var t = a(e);
          var w = a(j);
          var r = new ECCurveFp(s, z, y);
          var q = r.decodePointHex("04" + f + k);
          b[A]["name"] = A;
          b[A]["keylen"] = l;
          b[A]["curve"] = r;
          b[A]["G"] = q;
          b[A]["n"] = t;
          b[A]["h"] = w;
          b[A]["oid"] = d;
          b[A]["info"] = x;
          for (var v = 0; v < u.length; v++) {
            c[u[v]] = A
          }
        }
      };
      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"]);
      /*! dsa-modified-1.0.1.js (c) Recurity Labs GmbH, Kenji Urushimma | github.com/openpgpjs/openpgpjs/blob/master/LICENSE
       */
      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.setPrivate = function(z, w, v, A, u) {
          this.isPrivate = true;
          this.p = z;
          this.q = w;
          this.g = v;
          this.y = A;
          this.x = u
        };
        this.setPublic = function(w, v, u, z) {
          this.isPublic = true;
          this.p = w;
          this.q = v;
          this.g = u;
          this.y = z;
          this.x = null
        };
        this.signWithMessageHash = function(z) {
          var v = this.p;
          var u = this.q;
          var C = this.g;
          var D = this.y;
          var E = this.x;
          var A = z.substr(0, u.bitLength() / 4);
          var B = new BigInteger(z, 16);
          var w = n(BigInteger.ONE.add(BigInteger.ONE), u.subtract(BigInteger.ONE));
          var G = (C.modPow(w, v)).mod(u);
          var F = (w.modInverse(u).multiply(B.add(E.multiply(G)))).mod(u);
          var H = KJUR.asn1.ASN1Util.jsonToASN1HEX({
            seq: [{
              "int": {
                bigint: G
              }
            }, {
              "int": {
                bigint: F
              }
            }]
          });
          return H
        };
        this.verifyWithMessageHash = function(C, B) {
          var z = this.p;
          var u = this.q;
          var G = this.g;
          var H = this.y;
          var E = this.parseASN1Signature(B);
          var K = E[0];
          var J = E[1];
          var C = C.substr(0, u.bitLength() / 4);
          var D = new BigInteger(C, 16);
          if (BigInteger.ZERO.compareTo(K) > 0 || K.compareTo(u) > 0 || BigInteger.ZERO.compareTo(J) > 0 || J.compareTo(u) > 0) {
            throw "invalid DSA signature"
          }
          var I = J.modInverse(u);
          var A = D.multiply(I).mod(u);
          var v = K.multiply(I).mod(u);
          var F = G.modPow(A, z).multiply(H.modPow(v, z)).mod(z).mod(u);
          return F.compareTo(K) == 0
        };
        this.parseASN1Signature = function(u) {
          try {
            var y = new BigInteger(ASN1HEX.getVbyList(u, 0, [0], "02"), 16);
            var v = new BigInteger(ASN1HEX.getVbyList(u, 0, [1], "02"), 16);
            return [y, v]
          } catch (w) {
            throw "malformed DSA signature"
          }
        };

        function d(E, w, B, v, u, C) {
          var z = KJUR.crypto.Util.hashString(w, E.toLowerCase());
          var z = z.substr(0, u.bitLength() / 4);
          var A = new BigInteger(z, 16);
          var y = n(BigInteger.ONE.add(BigInteger.ONE), u.subtract(BigInteger.ONE));
          var F = (B.modPow(y, v)).mod(u);
          var D = (y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);
          var G = new Array();
          G[0] = F;
          G[1] = D;
          return G
        }

        function r(v) {
          var u = openpgp.config.config.prefer_hash_algorithm;
          switch (Math.round(v.bitLength() / 8)) {
            case 20:
              if (u != 2 && u > 11 && u != 10 && u < 8) {
                return 2
              }
              return u;
            case 28:
              if (u > 11 && u < 8) {
                return 11
              }
              return u;
            case 32:
              if (u > 10 && u < 8) {
                return 8
              }
              return u;
            default:
              util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");
              return null
          }
        }
        this.select_hash_algorithm = r;

        function m(I, K, J, B, z, u, F, G) {
          var C = KJUR.crypto.Util.hashString(B, I.toLowerCase());
          var C = C.substr(0, u.bitLength() / 4);
          var D = new BigInteger(C, 16);
          if (BigInteger.ZERO.compareTo(K) > 0 || K.compareTo(u) > 0 || BigInteger.ZERO.compareTo(J) > 0 || J.compareTo(u) > 0) {
            util.print_error("invalid DSA Signature");
            return null
          }
          var H = J.modInverse(u);
          var A = D.multiply(H).mod(u);
          var v = K.multiply(H).mod(u);
          var E = F.modPow(A, z).multiply(G.modPow(v, z)).mod(z).mod(u);
          return E.compareTo(K) == 0
        }

        function a(z) {
          var A = new BigInteger(z, primeCenterie);
          var y = j(q, 512);
          var u = t(p, q, z);
          var v;
          do {
            v = new BigInteger(q.bitCount(), rand)
          } while (x.compareTo(BigInteger.ZERO) != 1 && x.compareTo(q) != -1);
          var w = g.modPow(x, p);
          return {
            x: v,
            q: A,
            p: y,
            g: u,
            y: w
          }
        }

        function j(y, z, w) {
          if (z % 64 != 0) {
            return false
          }
          var u;
          var v;
          do {
            u = w(bitcount, true);
            v = u.subtract(BigInteger.ONE);
            u = u.subtract(v.remainder(y))
          } while (!u.isProbablePrime(primeCenterie) || u.bitLength() != l);
          return u
        }

        function t(B, z, A, w) {
          var u = B.subtract(BigInteger.ONE);
          var y = u.divide(z);
          var v;
          do {
            v = w(A)
          } while (v.compareTo(u) != -1 && v.compareTo(BigInteger.ONE) != 1);
          return v.modPow(y, B)
        }

        function o(w, y, u) {
          var v;
          do {
            v = u(y, false)
          } while (v.compareTo(w) != -1 && v.compareTo(BigInteger.ZERO) != 1);
          return v
        }

        function i(v, w) {
          k = o(v);
          var u = g.modPow(k, w).mod(v);
          return u
        }

        function h(B, w, y, v, z, u) {
          var A = B(v);
          s = (w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);
          return s
        }
        this.sign = d;
        this.verify = m;

        function n(w, u) {
          if (u.compareTo(w) <= 0) {
            return
          }
          var v = u.subtract(w);
          var y = e(v.bitLength());
          while (y > v) {
            y = e(v.bitLength())
          }
          return w.add(y)
        }

        function e(w) {
          if (w < 0) {
            return null
          }
          var u = Math.floor((w + 7) / 8);
          var v = c(u);
          if (w % 8 > 0) {
            v = String.fromCharCode((Math.pow(2, w % 8) - 1) & v.charCodeAt(0)) + v.substring(1)
          }
          return new BigInteger(f(v), 16)
        }

        function c(w) {
          var u = "";
          for (var v = 0; v < w; v++) {
            u += String.fromCharCode(b())
          }
          return u
        }

        function b() {
          var u = new Uint32Array(1);
          window.crypto.getRandomValues(u);
          return u[0] & 255
        }

        function f(y) {
          if (y == null) {
            return ""
          }
          var v = [];
          var w = y.length;
          var z = 0;
          var u;
          while (z < w) {
            u = y[z++].charCodeAt().toString(16);
            while (u.length < 2) {
              u = "0" + u
            }
            v.push("" + u)
          }
          return v.join("")
        }
        this.getRandomBigIntegerInRange = n;
        this.getRandomBigInteger = e;
        this.getRandomBytes = c
      };
      /*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      var PKCS5PKEY = function() {
        var c = function(n, p, o) {
          return i(CryptoJS.AES, n, p, o)
        };
        var d = function(n, p, o) {
          return i(CryptoJS.TripleDES, n, p, o)
        };
        var i = function(q, v, s, o) {
          var p = CryptoJS.enc.Hex.parse(v);
          var u = CryptoJS.enc.Hex.parse(s);
          var n = CryptoJS.enc.Hex.parse(o);
          var r = {};
          r.key = u;
          r.iv = n;
          r.ciphertext = p;
          var t = q.decrypt(r, u, {
            iv: n
          });
          return CryptoJS.enc.Hex.stringify(t)
        };
        var j = function(n, p, o) {
          return e(CryptoJS.AES, n, p, o)
        };
        var m = function(n, p, o) {
          return e(CryptoJS.TripleDES, n, p, o)
        };
        var e = function(s, x, v, p) {
          var r = CryptoJS.enc.Hex.parse(x);
          var w = CryptoJS.enc.Hex.parse(v);
          var o = CryptoJS.enc.Hex.parse(p);
          var n = {};
          var u = s.encrypt(r, w, {
            iv: o
          });
          var q = CryptoJS.enc.Hex.parse(u.toString());
          var t = CryptoJS.enc.Base64.stringify(q);
          return t
        };
        var g = {
          "AES-256-CBC": {
            proc: c,
            eproc: j,
            keylen: 32,
            ivlen: 16
          },
          "AES-192-CBC": {
            proc: c,
            eproc: j,
            keylen: 24,
            ivlen: 16
          },
          "AES-128-CBC": {
            proc: c,
            eproc: j,
            keylen: 16,
            ivlen: 16
          },
          "DES-EDE3-CBC": {
            proc: d,
            eproc: m,
            keylen: 24,
            ivlen: 8
          }
        };
        var b = function(n) {
          return g[n]["proc"]
        };
        var k = function(n) {
          var p = CryptoJS.lib.WordArray.random(n);
          var o = CryptoJS.enc.Hex.stringify(p);
          return o
        };
        var l = function(q) {
          var r = {};
          if (q.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"))) {
            r.cipher = RegExp.$1;
            r.ivsalt = RegExp.$2
          }
          if (q.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))) {
            r.type = RegExp.$1
          }
          var p = -1;
          var t = 0;
          if (q.indexOf("\r\n\r\n") != -1) {
            p = q.indexOf("\r\n\r\n");
            t = 2
          }
          if (q.indexOf("\n\n") != -1) {
            p = q.indexOf("\n\n");
            t = 1
          }
          var o = q.indexOf("-----END");
          if (p != -1 && o != -1) {
            var n = q.substring(p + t * 2, o - t);
            n = n.replace(/\s+/g, "");
            r.data = n
          }
          return r
        };
        var h = function(o, w, n) {
          var t = n.substring(0, 16);
          var r = CryptoJS.enc.Hex.parse(t);
          var p = CryptoJS.enc.Utf8.parse(w);
          var s = g[o]["keylen"] + g[o]["ivlen"];
          var v = "";
          var u = null;
          for (;;) {
            var q = CryptoJS.algo.MD5.create();
            if (u != null) {
              q.update(u)
            }
            q.update(p);
            q.update(r);
            u = q.finalize();
            v = v + CryptoJS.enc.Hex.stringify(u);
            if (v.length >= s * 2) {
              break
            }
          }
          var x = {};
          x.keyhex = v.substr(0, g[o]["keylen"] * 2);
          x.ivhex = v.substr(g[o]["keylen"] * 2, g[o]["ivlen"] * 2);
          return x
        };
        var a = function(n, t, p, u) {
          var q = CryptoJS.enc.Base64.parse(n);
          var o = CryptoJS.enc.Hex.stringify(q);
          var s = g[t]["proc"];
          var r = s(o, p, u);
          return r
        };
        var f = function(n, q, o, s) {
          var p = g[q]["eproc"];
          var r = p(n, o, s);
          return r
        };
        return {
          version: "1.0.5",
          getHexFromPEM: function(o, r) {
            var p = o;
            if (p.indexOf("BEGIN " + r) == -1) {
              throw "can't find PEM header: " + r
            }
            p = p.replace("-----BEGIN " + r + "-----", "");
            p = p.replace("-----END " + r + "-----", "");
            var q = p.replace(/\s+/g, "");
            var n = b64tohex(q);
            return n
          },
          getDecryptedKeyHexByKeyIV: function(o, r, q, p) {
            var n = b(r);
            return n(o, q, p)
          },
          parsePKCS5PEM: function(n) {
            return l(n)
          },
          getKeyAndUnusedIvByPasscodeAndIvsalt: function(o, n, p) {
            return h(o, n, p)
          },
          decryptKeyB64: function(n, p, o, q) {
            return a(n, p, o, q)
          },
          getDecryptedKeyHex: function(w, v) {
            var o = l(w);
            var r = o.type;
            var p = o.cipher;
            var n = o.ivsalt;
            var q = o.data;
            var u = h(p, v, n);
            var t = u.keyhex;
            var s = a(q, p, t, n);
            return s
          },
          getRSAKeyFromEncryptedPKCS5PEM: function(p, o) {
            var q = this.getDecryptedKeyHex(p, o);
            var n = new RSAKey();
            n.readPrivateKeyFromASN1HexString(q);
            return n
          },
          getEryptedPKCS5PEMFromPrvKeyHex: function(q, x, r, p) {
            var n = "";
            if (typeof r == "undefined" || r == null) {
              r = "AES-256-CBC"
            }
            if (typeof g[r] == "undefined") {
              throw "PKCS5PKEY unsupported algorithm: " + r
            }
            if (typeof p == "undefined" || p == null) {
              var t = g[r]["ivlen"];
              var s = k(t);
              p = s.toUpperCase()
            }
            var w = h(r, x, p);
            var v = w.keyhex;
            var u = f(q, r, v, p);
            var o = u.replace(/(.{64})/g, "$1\r\n");
            var n = "-----BEGIN RSA PRIVATE KEY-----\r\n";
            n += "Proc-Type: 4,ENCRYPTED\r\n";
            n += "DEK-Info: " + r + "," + p + "\r\n";
            n += "\r\n";
            n += o;
            n += "\r\n-----END RSA PRIVATE KEY-----\r\n";
            return n
          },
          getEryptedPKCS5PEMFromRSAKey: function(C, D, o, s) {
            var A = new KJUR.asn1.DERInteger({
              "int": 0
            });
            var v = new KJUR.asn1.DERInteger({
              bigint: C.n
            });
            var z = new KJUR.asn1.DERInteger({
              "int": C.e
            });
            var B = new KJUR.asn1.DERInteger({
              bigint: C.d
            });
            var t = new KJUR.asn1.DERInteger({
              bigint: C.p
            });
            var r = new KJUR.asn1.DERInteger({
              bigint: C.q
            });
            var y = new KJUR.asn1.DERInteger({
              bigint: C.dmp1
            });
            var u = new KJUR.asn1.DERInteger({
              bigint: C.dmq1
            });
            var x = new KJUR.asn1.DERInteger({
              bigint: C.coeff
            });
            var E = new KJUR.asn1.DERSequence({
              array: [A, v, z, B, t, r, y, u, x]
            });
            var w = E.getEncodedHex();
            return this.getEryptedPKCS5PEMFromPrvKeyHex(w, D, o, s)
          },
          newEncryptedPKCS5PEM: function(n, o, r, s) {
            if (typeof o == "undefined" || o == null) {
              o = 1024
            }
            if (typeof r == "undefined" || r == null) {
              r = "10001"
            }
            var p = new RSAKey();
            p.generate(o, r);
            var q = null;
            if (typeof s == "undefined" || s == null) {
              q = this.getEncryptedPKCS5PEMFromRSAKey(pkey, n)
            } else {
              q = this.getEncryptedPKCS5PEMFromRSAKey(pkey, n, s)
            }
            return q
          },
          getRSAKeyFromPlainPKCS8PEM: function(p) {
            if (p.match(/ENCRYPTED/)) {
              throw "pem shall be not ENCRYPTED"
            }
            var o = this.getHexFromPEM(p, "PRIVATE KEY");
            var n = this.getRSAKeyFromPlainPKCS8Hex(o);
            return n
          },
          getRSAKeyFromPlainPKCS8Hex: function(q) {
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(q, 0);
            if (p.length != 3) {
              throw "outer DERSequence shall have 3 elements: " + p.length
            }
            var o = ASN1HEX.getHexOfTLV_AtObj(q, p[1]);
            if (o != "300d06092a864886f70d0101010500") {
              throw "PKCS8 AlgorithmIdentifier is not rsaEnc: " + o
            }
            var o = ASN1HEX.getHexOfTLV_AtObj(q, p[1]);
            var r = ASN1HEX.getHexOfTLV_AtObj(q, p[2]);
            var s = ASN1HEX.getHexOfV_AtObj(r, 0);
            var n = new RSAKey();
            n.readPrivateKeyFromASN1HexString(s);
            return n
          },
          parseHexOfEncryptedPKCS8: function(u) {
            var q = {};
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(u, 0);
            if (p.length != 2) {
              throw "malformed format: SEQUENCE(0).items != 2: " + p.length
            }
            q.ciphertext = ASN1HEX.getHexOfV_AtObj(u, p[1]);
            var w = ASN1HEX.getPosArrayOfChildren_AtObj(u, p[0]);
            if (w.length != 2) {
              throw "malformed format: SEQUENCE(0.0).items != 2: " + w.length
            }
            if (ASN1HEX.getHexOfV_AtObj(u, w[0]) != "2a864886f70d01050d") {
              throw "this only supports pkcs5PBES2"
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(u, w[1]);
            if (w.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1).items != 2: " + n.length
            }
            var o = ASN1HEX.getPosArrayOfChildren_AtObj(u, n[1]);
            if (o.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + o.length
            }
            if (ASN1HEX.getHexOfV_AtObj(u, o[0]) != "2a864886f70d0307") {
              throw "this only supports TripleDES"
            }
            q.encryptionSchemeAlg = "TripleDES";
            q.encryptionSchemeIV = ASN1HEX.getHexOfV_AtObj(u, o[1]);
            var r = ASN1HEX.getPosArrayOfChildren_AtObj(u, n[0]);
            if (r.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + r.length
            }
            if (ASN1HEX.getHexOfV_AtObj(u, r[0]) != "2a864886f70d01050c") {
              throw "this only supports pkcs5PBKDF2"
            }
            var v = ASN1HEX.getPosArrayOfChildren_AtObj(u, r[1]);
            if (v.length < 2) {
              throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + v.length
            }
            q.pbkdf2Salt = ASN1HEX.getHexOfV_AtObj(u, v[0]);
            var s = ASN1HEX.getHexOfV_AtObj(u, v[1]);
            try {
              q.pbkdf2Iter = parseInt(s, 16)
            } catch (t) {
              throw "malformed format pbkdf2Iter: " + s
            }
            return q
          },
          getPBKDF2KeyHexFromParam: function(s, n) {
            var r = CryptoJS.enc.Hex.parse(s.pbkdf2Salt);
            var o = s.pbkdf2Iter;
            var q = CryptoJS.PBKDF2(n, r, {
              keySize: 192 / 32,
              iterations: o
            });
            var p = CryptoJS.enc.Hex.stringify(q);
            return p
          },
          getPlainPKCS8HexFromEncryptedPKCS8PEM: function(v, w) {
            var p = this.getHexFromPEM(v, "ENCRYPTED PRIVATE KEY");
            var n = this.parseHexOfEncryptedPKCS8(p);
            var s = PKCS5PKEY.getPBKDF2KeyHexFromParam(n, w);
            var t = {};
            t.ciphertext = CryptoJS.enc.Hex.parse(n.ciphertext);
            var r = CryptoJS.enc.Hex.parse(s);
            var q = CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);
            var u = CryptoJS.TripleDES.decrypt(t, r, {
              iv: q
            });
            var o = CryptoJS.enc.Hex.stringify(u);
            return o
          },
          getRSAKeyFromEncryptedPKCS8PEM: function(q, p) {
            var o = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q, p);
            var n = this.getRSAKeyFromPlainPKCS8Hex(o);
            return n
          },
          getKeyFromEncryptedPKCS8PEM: function(q, o) {
            var n = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q, o);
            var p = this.getKeyFromPlainPrivatePKCS8Hex(n);
            return p
          },
          parsePlainPrivatePKCS8Hex: function(q) {
            var o = {};
            o.algparam = null;
            if (q.substr(0, 2) != "30") {
              throw "malformed plain PKCS8 private key(code:001)"
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(q, 0);
            if (p.length != 3) {
              throw "malformed plain PKCS8 private key(code:002)"
            }
            if (q.substr(p[1], 2) != "30") {
              throw "malformed PKCS8 private key(code:003)"
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(q, p[1]);
            if (n.length != 2) {
              throw "malformed PKCS8 private key(code:004)"
            }
            if (q.substr(n[0], 2) != "06") {
              throw "malformed PKCS8 private key(code:005)"
            }
            o.algoid = ASN1HEX.getHexOfV_AtObj(q, n[0]);
            if (q.substr(n[1], 2) == "06") {
              o.algparam = ASN1HEX.getHexOfV_AtObj(q, n[1])
            }
            if (q.substr(p[2], 2) != "04") {
              throw "malformed PKCS8 private key(code:006)"
            }
            o.keyidx = ASN1HEX.getStartPosOfV_AtObj(q, p[2]);
            return o
          },
          getKeyFromPlainPrivatePKCS8PEM: function(o) {
            var n = this.getHexFromPEM(o, "PRIVATE KEY");
            var p = this.getKeyFromPlainPrivatePKCS8Hex(n);
            return p
          },
          getKeyFromPlainPrivatePKCS8Hex: function(n) {
            var p = this.parsePlainPrivatePKCS8Hex(n);
            if (p.algoid == "2a864886f70d010101") {
              this.parsePrivateRawRSAKeyHexAtObj(n, p);
              var o = p.key;
              var q = new RSAKey();
              q.setPrivateEx(o.n, o.e, o.d, o.p, o.q, o.dp, o.dq, o.co);
              return q
            } else {
              if (p.algoid == "2a8648ce3d0201") {
                this.parsePrivateRawECKeyHexAtObj(n, p);
                if (KJUR.crypto.OID.oidhex2name[p.algparam] === undefined) {
                  throw "KJUR.crypto.OID.oidhex2name undefined: " + p.algparam
                }
                var r = KJUR.crypto.OID.oidhex2name[p.algparam];
                var q = new KJUR.crypto.ECDSA({
                  curve: r,
                  prv: p.key
                });
                return q
              } else {
                throw "unsupported private key algorithm"
              }
            }
          },
          getRSAKeyFromPublicPKCS8PEM: function(o) {
            var p = this.getHexFromPEM(o, "PUBLIC KEY");
            var n = this.getRSAKeyFromPublicPKCS8Hex(p);
            return n
          },
          getKeyFromPublicPKCS8PEM: function(o) {
            var p = this.getHexFromPEM(o, "PUBLIC KEY");
            var n = this.getKeyFromPublicPKCS8Hex(p);
            return n
          },
          getKeyFromPublicPKCS8Hex: function(o) {
            var n = this.parsePublicPKCS8Hex(o);
            if (n.algoid == "2a864886f70d010101") {
              var r = this.parsePublicRawRSAKeyHex(n.key);
              var p = new RSAKey();
              p.setPublic(r.n, r.e);
              return p
            } else {
              if (n.algoid == "2a8648ce3d0201") {
                if (KJUR.crypto.OID.oidhex2name[n.algparam] === undefined) {
                  throw "KJUR.crypto.OID.oidhex2name undefined: " + n.algparam
                }
                var q = KJUR.crypto.OID.oidhex2name[n.algparam];
                var p = new KJUR.crypto.ECDSA({
                  curve: q,
                  pub: n.key
                });
                return p
              } else {
                throw "unsupported public key algorithm"
              }
            }
          },
          parsePublicRawRSAKeyHex: function(p) {
            var n = {};
            if (p.substr(0, 2) != "30") {
              throw "malformed RSA key(code:001)"
            }
            var o = ASN1HEX.getPosArrayOfChildren_AtObj(p, 0);
            if (o.length != 2) {
              throw "malformed RSA key(code:002)"
            }
            if (p.substr(o[0], 2) != "02") {
              throw "malformed RSA key(code:003)"
            }
            n.n = ASN1HEX.getHexOfV_AtObj(p, o[0]);
            if (p.substr(o[1], 2) != "02") {
              throw "malformed RSA key(code:004)"
            }
            n.e = ASN1HEX.getHexOfV_AtObj(p, o[1]);
            return n
          },
          parsePrivateRawRSAKeyHexAtObj: function(o, q) {
            var p = q.keyidx;
            if (o.substr(p, 2) != "30") {
              throw "malformed RSA private key(code:001)"
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(o, p);
            if (n.length != 9) {
              throw "malformed RSA private key(code:002)"
            }
            q.key = {};
            q.key.n = ASN1HEX.getHexOfV_AtObj(o, n[1]);
            q.key.e = ASN1HEX.getHexOfV_AtObj(o, n[2]);
            q.key.d = ASN1HEX.getHexOfV_AtObj(o, n[3]);
            q.key.p = ASN1HEX.getHexOfV_AtObj(o, n[4]);
            q.key.q = ASN1HEX.getHexOfV_AtObj(o, n[5]);
            q.key.dp = ASN1HEX.getHexOfV_AtObj(o, n[6]);
            q.key.dq = ASN1HEX.getHexOfV_AtObj(o, n[7]);
            q.key.co = ASN1HEX.getHexOfV_AtObj(o, n[8])
          },
          parsePrivateRawECKeyHexAtObj: function(o, q) {
            var p = q.keyidx;
            if (o.substr(p, 2) != "30") {
              throw "malformed ECC private key(code:001)"
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(o, p);
            if (n.length != 3) {
              throw "malformed ECC private key(code:002)"
            }
            if (o.substr(n[1], 2) != "04") {
              throw "malformed ECC private key(code:003)"
            }
            q.key = ASN1HEX.getHexOfV_AtObj(o, n[1])
          },
          parsePublicPKCS8Hex: function(q) {
            var o = {};
            o.algparam = null;
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(q, 0);
            if (p.length != 2) {
              throw "outer DERSequence shall have 2 elements: " + p.length
            }
            var r = p[0];
            if (q.substr(r, 2) != "30") {
              throw "malformed PKCS8 public key(code:001)"
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(q, r);
            if (n.length != 2) {
              throw "malformed PKCS8 public key(code:002)"
            }
            if (q.substr(n[0], 2) != "06") {
              throw "malformed PKCS8 public key(code:003)"
            }
            o.algoid = ASN1HEX.getHexOfV_AtObj(q, n[0]);
            if (q.substr(n[1], 2) == "06") {
              o.algparam = ASN1HEX.getHexOfV_AtObj(q, n[1])
            }
            if (q.substr(p[1], 2) != "03") {
              throw "malformed PKCS8 public key(code:004)"
            }
            o.key = ASN1HEX.getHexOfV_AtObj(q, p[1]).substr(2);
            return o
          },
          getRSAKeyFromPublicPKCS8Hex: function(r) {
            var q = ASN1HEX.getPosArrayOfChildren_AtObj(r, 0);
            if (q.length != 2) {
              throw "outer DERSequence shall have 2 elements: " + q.length
            }
            var p = ASN1HEX.getHexOfTLV_AtObj(r, q[0]);
            if (p != "300d06092a864886f70d0101010500") {
              throw "PKCS8 AlgorithmId is not rsaEncryption"
            }
            if (r.substr(q[1], 2) != "03") {
              throw "PKCS8 Public Key is not BITSTRING encapslated."
            }
            var t = ASN1HEX.getStartPosOfV_AtObj(r, q[1]) + 2;
            if (r.substr(t, 2) != "30") {
              throw "PKCS8 Public Key is not SEQUENCE."
            }
            var n = ASN1HEX.getPosArrayOfChildren_AtObj(r, t);
            if (n.length != 2) {
              throw "inner DERSequence shall have 2 elements: " + n.length
            }
            if (r.substr(n[0], 2) != "02") {
              throw "N is not ASN.1 INTEGER"
            }
            if (r.substr(n[1], 2) != "02") {
              throw "E is not ASN.1 INTEGER"
            }
            var u = ASN1HEX.getHexOfV_AtObj(r, n[0]);
            var s = ASN1HEX.getHexOfV_AtObj(r, n[1]);
            var o = new RSAKey();
            o.setPublic(u, s);
            return o
          }
        }
      }();
      /*! keyutil-1.0.7.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      var KEYUTIL = function() {
        var d = function(p, r, q) {
          return k(CryptoJS.AES, p, r, q)
        };
        var e = function(p, r, q) {
          return k(CryptoJS.TripleDES, p, r, q)
        };
        var a = function(p, r, q) {
          return k(CryptoJS.DES, p, r, q)
        };
        var k = function(s, x, u, q) {
          var r = CryptoJS.enc.Hex.parse(x);
          var w = CryptoJS.enc.Hex.parse(u);
          var p = CryptoJS.enc.Hex.parse(q);
          var t = {};
          t.key = w;
          t.iv = p;
          t.ciphertext = r;
          var v = s.decrypt(t, w, {
            iv: p
          });
          return CryptoJS.enc.Hex.stringify(v)
        };
        var l = function(p, r, q) {
          return g(CryptoJS.AES, p, r, q)
        };
        var o = function(p, r, q) {
          return g(CryptoJS.TripleDES, p, r, q)
        };
        var f = function(p, r, q) {
          return g(CryptoJS.DES, p, r, q)
        };
        var g = function(t, y, v, q) {
          var s = CryptoJS.enc.Hex.parse(y);
          var x = CryptoJS.enc.Hex.parse(v);
          var p = CryptoJS.enc.Hex.parse(q);
          var w = t.encrypt(s, x, {
            iv: p
          });
          var r = CryptoJS.enc.Hex.parse(w.toString());
          var u = CryptoJS.enc.Base64.stringify(r);
          return u
        };
        var i = {
          "AES-256-CBC": {
            proc: d,
            eproc: l,
            keylen: 32,
            ivlen: 16
          },
          "AES-192-CBC": {
            proc: d,
            eproc: l,
            keylen: 24,
            ivlen: 16
          },
          "AES-128-CBC": {
            proc: d,
            eproc: l,
            keylen: 16,
            ivlen: 16
          },
          "DES-EDE3-CBC": {
            proc: e,
            eproc: o,
            keylen: 24,
            ivlen: 8
          },
          "DES-CBC": {
            proc: a,
            eproc: f,
            keylen: 8,
            ivlen: 8
          }
        };
        var c = function(p) {
          return i[p]["proc"]
        };
        var m = function(p) {
          var r = CryptoJS.lib.WordArray.random(p);
          var q = CryptoJS.enc.Hex.stringify(r);
          return q
        };
        var n = function(t) {
          var u = {};
          if (t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"))) {
            u.cipher = RegExp.$1;
            u.ivsalt = RegExp.$2
          }
          if (t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))) {
            u.type = RegExp.$1
          }
          var r = -1;
          var v = 0;
          if (t.indexOf("\r\n\r\n") != -1) {
            r = t.indexOf("\r\n\r\n");
            v = 2
          }
          if (t.indexOf("\n\n") != -1) {
            r = t.indexOf("\n\n");
            v = 1
          }
          var q = t.indexOf("-----END");
          if (r != -1 && q != -1) {
            var p = t.substring(r + v * 2, q - v);
            p = p.replace(/\s+/g, "");
            u.data = p
          }
          return u
        };
        var j = function(q, y, p) {
          var v = p.substring(0, 16);
          var t = CryptoJS.enc.Hex.parse(v);
          var r = CryptoJS.enc.Utf8.parse(y);
          var u = i[q]["keylen"] + i[q]["ivlen"];
          var x = "";
          var w = null;
          for (;;) {
            var s = CryptoJS.algo.MD5.create();
            if (w != null) {
              s.update(w)
            }
            s.update(r);
            s.update(t);
            w = s.finalize();
            x = x + CryptoJS.enc.Hex.stringify(w);
            if (x.length >= u * 2) {
              break
            }
          }
          var z = {};
          z.keyhex = x.substr(0, i[q]["keylen"] * 2);
          z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);
          return z
        };
        var b = function(p, v, r, w) {
          var s = CryptoJS.enc.Base64.parse(p);
          var q = CryptoJS.enc.Hex.stringify(s);
          var u = i[v]["proc"];
          var t = u(q, r, w);
          return t
        };
        var h = function(p, s, q, u) {
          var r = i[s]["eproc"];
          var t = r(p, q, u);
          return t
        };
        return {
          version: "1.0.0",
          getHexFromPEM: function(q, u) {
            var r = q;
            if (r.indexOf("-----BEGIN ") == -1) {
              throw "can't find PEM header: " + u
            }
            if (typeof u == "string" && u != "") {
              r = r.replace("-----BEGIN " + u + "-----", "");
              r = r.replace("-----END " + u + "-----", "")
            } else {
              r = r.replace(/-----BEGIN [^-]+-----/, "");
              r = r.replace(/-----END [^-]+-----/, "")
            }
            var t = r.replace(/\s+/g, "");
            var p = b64tohex(t);
            return p
          },
          getDecryptedKeyHexByKeyIV: function(q, t, s, r) {
            var p = c(t);
            return p(q, s, r)
          },
          parsePKCS5PEM: function(p) {
            return n(p)
          },
          getKeyAndUnusedIvByPasscodeAndIvsalt: function(q, p, r) {
            return j(q, p, r)
          },
          decryptKeyB64: function(p, r, q, s) {
            return b(p, r, q, s)
          },
          getDecryptedKeyHex: function(y, x) {
            var q = n(y);
            var t = q.type;
            var r = q.cipher;
            var p = q.ivsalt;
            var s = q.data;
            var w = j(r, x, p);
            var v = w.keyhex;
            var u = b(s, r, v, p);
            return u
          },
          getRSAKeyFromEncryptedPKCS5PEM: function(r, q) {
            var s = this.getDecryptedKeyHex(r, q);
            var p = new RSAKey();
            p.readPrivateKeyFromASN1HexString(s);
            return p
          },
          getEncryptedPKCS5PEMFromPrvKeyHex: function(x, s, A, t, r) {
            var p = "";
            if (typeof t == "undefined" || t == null) {
              t = "AES-256-CBC"
            }
            if (typeof i[t] == "undefined") {
              throw "KEYUTIL unsupported algorithm: " + t
            }
            if (typeof r == "undefined" || r == null) {
              var v = i[t]["ivlen"];
              var u = m(v);
              r = u.toUpperCase()
            }
            var z = j(t, A, r);
            var y = z.keyhex;
            var w = h(s, t, y, r);
            var q = w.replace(/(.{64})/g, "$1\r\n");
            var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";
            p += "Proc-Type: 4,ENCRYPTED\r\n";
            p += "DEK-Info: " + t + "," + r + "\r\n";
            p += "\r\n";
            p += q;
            p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";
            return p
          },
          getEncryptedPKCS5PEMFromRSAKey: function(D, E, r, t) {
            var B = new KJUR.asn1.DERInteger({
              "int": 0
            });
            var w = new KJUR.asn1.DERInteger({
              bigint: D.n
            });
            var A = new KJUR.asn1.DERInteger({
              "int": D.e
            });
            var C = new KJUR.asn1.DERInteger({
              bigint: D.d
            });
            var u = new KJUR.asn1.DERInteger({
              bigint: D.p
            });
            var s = new KJUR.asn1.DERInteger({
              bigint: D.q
            });
            var z = new KJUR.asn1.DERInteger({
              bigint: D.dmp1
            });
            var v = new KJUR.asn1.DERInteger({
              bigint: D.dmq1
            });
            var y = new KJUR.asn1.DERInteger({
              bigint: D.coeff
            });
            var F = new KJUR.asn1.DERSequence({
              array: [B, w, A, C, u, s, z, v, y]
            });
            var x = F.getEncodedHex();
            return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", x, E, r, t)
          },
          newEncryptedPKCS5PEM: function(p, q, t, u) {
            if (typeof q == "undefined" || q == null) {
              q = 1024
            }
            if (typeof t == "undefined" || t == null) {
              t = "10001"
            }
            var r = new RSAKey();
            r.generate(q, t);
            var s = null;
            if (typeof u == "undefined" || u == null) {
              s = this.getEncryptedPKCS5PEMFromRSAKey(r, p)
            } else {
              s = this.getEncryptedPKCS5PEMFromRSAKey(r, p, u)
            }
            return s
          },
          getRSAKeyFromPlainPKCS8PEM: function(r) {
            if (r.match(/ENCRYPTED/)) {
              throw "pem shall be not ENCRYPTED"
            }
            var q = this.getHexFromPEM(r, "PRIVATE KEY");
            var p = this.getRSAKeyFromPlainPKCS8Hex(q);
            return p
          },
          getRSAKeyFromPlainPKCS8Hex: function(s) {
            var r = ASN1HEX.getPosArrayOfChildren_AtObj(s, 0);
            if (r.length != 3) {
              throw "outer DERSequence shall have 3 elements: " + r.length
            }
            var q = ASN1HEX.getHexOfTLV_AtObj(s, r[1]);
            if (q != "300d06092a864886f70d0101010500") {
              throw "PKCS8 AlgorithmIdentifier is not rsaEnc: " + q
            }
            var q = ASN1HEX.getHexOfTLV_AtObj(s, r[1]);
            var t = ASN1HEX.getHexOfTLV_AtObj(s, r[2]);
            var u = ASN1HEX.getHexOfV_AtObj(t, 0);
            var p = new RSAKey();
            p.readPrivateKeyFromASN1HexString(u);
            return p
          },
          parseHexOfEncryptedPKCS8: function(w) {
            var s = {};
            var r = ASN1HEX.getPosArrayOfChildren_AtObj(w, 0);
            if (r.length != 2) {
              throw "malformed format: SEQUENCE(0).items != 2: " + r.length
            }
            s.ciphertext = ASN1HEX.getHexOfV_AtObj(w, r[1]);
            var y = ASN1HEX.getPosArrayOfChildren_AtObj(w, r[0]);
            if (y.length != 2) {
              throw "malformed format: SEQUENCE(0.0).items != 2: " + y.length
            }
            if (ASN1HEX.getHexOfV_AtObj(w, y[0]) != "2a864886f70d01050d") {
              throw "this only supports pkcs5PBES2"
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(w, y[1]);
            if (y.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length
            }
            var q = ASN1HEX.getPosArrayOfChildren_AtObj(w, p[1]);
            if (q.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length
            }
            if (ASN1HEX.getHexOfV_AtObj(w, q[0]) != "2a864886f70d0307") {
              throw "this only supports TripleDES"
            }
            s.encryptionSchemeAlg = "TripleDES";
            s.encryptionSchemeIV = ASN1HEX.getHexOfV_AtObj(w, q[1]);
            var t = ASN1HEX.getPosArrayOfChildren_AtObj(w, p[0]);
            if (t.length != 2) {
              throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + t.length
            }
            if (ASN1HEX.getHexOfV_AtObj(w, t[0]) != "2a864886f70d01050c") {
              throw "this only supports pkcs5PBKDF2"
            }
            var x = ASN1HEX.getPosArrayOfChildren_AtObj(w, t[1]);
            if (x.length < 2) {
              throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length
            }
            s.pbkdf2Salt = ASN1HEX.getHexOfV_AtObj(w, x[0]);
            var u = ASN1HEX.getHexOfV_AtObj(w, x[1]);
            try {
              s.pbkdf2Iter = parseInt(u, 16)
            } catch (v) {
              throw "malformed format pbkdf2Iter: " + u
            }
            return s
          },
          getPBKDF2KeyHexFromParam: function(u, p) {
            var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);
            var q = u.pbkdf2Iter;
            var s = CryptoJS.PBKDF2(p, t, {
              keySize: 192 / 32,
              iterations: q
            });
            var r = CryptoJS.enc.Hex.stringify(s);
            return r
          },
          getPlainPKCS8HexFromEncryptedPKCS8PEM: function(x, y) {
            var r = this.getHexFromPEM(x, "ENCRYPTED PRIVATE KEY");
            var p = this.parseHexOfEncryptedPKCS8(r);
            var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);
            var v = {};
            v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);
            var t = CryptoJS.enc.Hex.parse(u);
            var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);
            var w = CryptoJS.TripleDES.decrypt(v, t, {
              iv: s
            });
            var q = CryptoJS.enc.Hex.stringify(w);
            return q
          },
          getRSAKeyFromEncryptedPKCS8PEM: function(s, r) {
            var q = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s, r);
            var p = this.getRSAKeyFromPlainPKCS8Hex(q);
            return p
          },
          getKeyFromEncryptedPKCS8PEM: function(s, q) {
            var p = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);
            var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
            return r
          },
          parsePlainPrivatePKCS8Hex: function(s) {
            var q = {};
            q.algparam = null;
            if (s.substr(0, 2) != "30") {
              throw "malformed plain PKCS8 private key(code:001)"
            }
            var r = ASN1HEX.getPosArrayOfChildren_AtObj(s, 0);
            if (r.length != 3) {
              throw "malformed plain PKCS8 private key(code:002)"
            }
            if (s.substr(r[1], 2) != "30") {
              throw "malformed PKCS8 private key(code:003)"
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(s, r[1]);
            if (p.length != 2) {
              throw "malformed PKCS8 private key(code:004)"
            }
            if (s.substr(p[0], 2) != "06") {
              throw "malformed PKCS8 private key(code:005)"
            }
            q.algoid = ASN1HEX.getHexOfV_AtObj(s, p[0]);
            if (s.substr(p[1], 2) == "06") {
              q.algparam = ASN1HEX.getHexOfV_AtObj(s, p[1])
            }
            if (s.substr(r[2], 2) != "04") {
              throw "malformed PKCS8 private key(code:006)"
            }
            q.keyidx = ASN1HEX.getStartPosOfV_AtObj(s, r[2]);
            return q
          },
          getKeyFromPlainPrivatePKCS8PEM: function(q) {
            var p = this.getHexFromPEM(q, "PRIVATE KEY");
            var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
            return r
          },
          getKeyFromPlainPrivatePKCS8Hex: function(p) {
            var w = this.parsePlainPrivatePKCS8Hex(p);
            if (w.algoid == "2a864886f70d010101") {
              this.parsePrivateRawRSAKeyHexAtObj(p, w);
              var u = w.key;
              var z = new RSAKey();
              z.setPrivateEx(u.n, u.e, u.d, u.p, u.q, u.dp, u.dq, u.co);
              return z
            } else {
              if (w.algoid == "2a8648ce3d0201") {
                this.parsePrivateRawECKeyHexAtObj(p, w);
                if (KJUR.crypto.OID.oidhex2name[w.algparam] === undefined) {
                  throw "KJUR.crypto.OID.oidhex2name undefined: " + w.algparam
                }
                var v = KJUR.crypto.OID.oidhex2name[w.algparam];
                var z = new KJUR.crypto.ECDSA({
                  curve: v
                });
                z.setPublicKeyHex(w.pubkey);
                z.setPrivateKeyHex(w.key);
                z.isPublic = false;
                return z
              } else {
                if (w.algoid == "2a8648ce380401") {
                  var t = ASN1HEX.getVbyList(p, 0, [1, 1, 0], "02");
                  var s = ASN1HEX.getVbyList(p, 0, [1, 1, 1], "02");
                  var y = ASN1HEX.getVbyList(p, 0, [1, 1, 2], "02");
                  var B = ASN1HEX.getVbyList(p, 0, [2, 0], "02");
                  var r = new BigInteger(t, 16);
                  var q = new BigInteger(s, 16);
                  var x = new BigInteger(y, 16);
                  var A = new BigInteger(B, 16);
                  var z = new KJUR.crypto.DSA();
                  z.setPrivate(r, q, x, null, A);
                  return z
                } else {
                  throw "unsupported private key algorithm"
                }
              }
            }
          },
          getRSAKeyFromPublicPKCS8PEM: function(q) {
            var r = this.getHexFromPEM(q, "PUBLIC KEY");
            var p = this.getRSAKeyFromPublicPKCS8Hex(r);
            return p
          },
          getKeyFromPublicPKCS8PEM: function(q) {
            var r = this.getHexFromPEM(q, "PUBLIC KEY");
            var p = this.getKeyFromPublicPKCS8Hex(r);
            return p
          },
          getKeyFromPublicPKCS8Hex: function(q) {
            var p = this.parsePublicPKCS8Hex(q);
            if (p.algoid == "2a864886f70d010101") {
              var u = this.parsePublicRawRSAKeyHex(p.key);
              var r = new RSAKey();
              r.setPublic(u.n, u.e);
              return r
            } else {
              if (p.algoid == "2a8648ce3d0201") {
                if (KJUR.crypto.OID.oidhex2name[p.algparam] === undefined) {
                  throw "KJUR.crypto.OID.oidhex2name undefined: " + p.algparam
                }
                var s = KJUR.crypto.OID.oidhex2name[p.algparam];
                var r = new KJUR.crypto.ECDSA({
                  curve: s,
                  pub: p.key
                });
                return r
              } else {
                if (p.algoid == "2a8648ce380401") {
                  var t = p.algparam;
                  var v = ASN1HEX.getHexOfV_AtObj(p.key, 0);
                  var r = new KJUR.crypto.DSA();
                  r.setPublic(new BigInteger(t.p, 16), new BigInteger(t.q, 16), new BigInteger(t.g, 16), new BigInteger(v, 16));
                  return r
                } else {
                  throw "unsupported public key algorithm"
                }
              }
            }
          },
          parsePublicRawRSAKeyHex: function(r) {
            var p = {};
            if (r.substr(0, 2) != "30") {
              throw "malformed RSA key(code:001)"
            }
            var q = ASN1HEX.getPosArrayOfChildren_AtObj(r, 0);
            if (q.length != 2) {
              throw "malformed RSA key(code:002)"
            }
            if (r.substr(q[0], 2) != "02") {
              throw "malformed RSA key(code:003)"
            }
            p.n = ASN1HEX.getHexOfV_AtObj(r, q[0]);
            if (r.substr(q[1], 2) != "02") {
              throw "malformed RSA key(code:004)"
            }
            p.e = ASN1HEX.getHexOfV_AtObj(r, q[1]);
            return p
          },
          parsePrivateRawRSAKeyHexAtObj: function(q, s) {
            var r = s.keyidx;
            if (q.substr(r, 2) != "30") {
              throw "malformed RSA private key(code:001)"
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(q, r);
            if (p.length != 9) {
              throw "malformed RSA private key(code:002)"
            }
            s.key = {};
            s.key.n = ASN1HEX.getHexOfV_AtObj(q, p[1]);
            s.key.e = ASN1HEX.getHexOfV_AtObj(q, p[2]);
            s.key.d = ASN1HEX.getHexOfV_AtObj(q, p[3]);
            s.key.p = ASN1HEX.getHexOfV_AtObj(q, p[4]);
            s.key.q = ASN1HEX.getHexOfV_AtObj(q, p[5]);
            s.key.dp = ASN1HEX.getHexOfV_AtObj(q, p[6]);
            s.key.dq = ASN1HEX.getHexOfV_AtObj(q, p[7]);
            s.key.co = ASN1HEX.getHexOfV_AtObj(q, p[8])
          },
          parsePrivateRawECKeyHexAtObj: function(p, t) {
            var q = t.keyidx;
            var r = ASN1HEX.getVbyList(p, q, [1], "04");
            var s = ASN1HEX.getVbyList(p, q, [2, 0], "03").substr(2);
            t.key = r;
            t.pubkey = s
          },
          parsePublicPKCS8Hex: function(s) {
            var q = {};
            q.algparam = null;
            var r = ASN1HEX.getPosArrayOfChildren_AtObj(s, 0);
            if (r.length != 2) {
              throw "outer DERSequence shall have 2 elements: " + r.length
            }
            var t = r[0];
            if (s.substr(t, 2) != "30") {
              throw "malformed PKCS8 public key(code:001)"
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(s, t);
            if (p.length != 2) {
              throw "malformed PKCS8 public key(code:002)"
            }
            if (s.substr(p[0], 2) != "06") {
              throw "malformed PKCS8 public key(code:003)"
            }
            q.algoid = ASN1HEX.getHexOfV_AtObj(s, p[0]);
            if (s.substr(p[1], 2) == "06") {
              q.algparam = ASN1HEX.getHexOfV_AtObj(s, p[1])
            } else {
              if (s.substr(p[1], 2) == "30") {
                q.algparam = {};
                q.algparam.p = ASN1HEX.getVbyList(s, p[1], [0], "02");
                q.algparam.q = ASN1HEX.getVbyList(s, p[1], [1], "02");
                q.algparam.g = ASN1HEX.getVbyList(s, p[1], [2], "02")
              }
            }
            if (s.substr(r[1], 2) != "03") {
              throw "malformed PKCS8 public key(code:004)"
            }
            q.key = ASN1HEX.getHexOfV_AtObj(s, r[1]).substr(2);
            return q
          },
          getRSAKeyFromPublicPKCS8Hex: function(t) {
            var s = ASN1HEX.getPosArrayOfChildren_AtObj(t, 0);
            if (s.length != 2) {
              throw "outer DERSequence shall have 2 elements: " + s.length
            }
            var r = ASN1HEX.getHexOfTLV_AtObj(t, s[0]);
            if (r != "300d06092a864886f70d0101010500") {
              throw "PKCS8 AlgorithmId is not rsaEncryption"
            }
            if (t.substr(s[1], 2) != "03") {
              throw "PKCS8 Public Key is not BITSTRING encapslated."
            }
            var v = ASN1HEX.getStartPosOfV_AtObj(t, s[1]) + 2;
            if (t.substr(v, 2) != "30") {
              throw "PKCS8 Public Key is not SEQUENCE."
            }
            var p = ASN1HEX.getPosArrayOfChildren_AtObj(t, v);
            if (p.length != 2) {
              throw "inner DERSequence shall have 2 elements: " + p.length
            }
            if (t.substr(p[0], 2) != "02") {
              throw "N is not ASN.1 INTEGER"
            }
            if (t.substr(p[1], 2) != "02") {
              throw "E is not ASN.1 INTEGER"
            }
            var w = ASN1HEX.getHexOfV_AtObj(t, p[0]);
            var u = ASN1HEX.getHexOfV_AtObj(t, p[1]);
            var q = new RSAKey();
            q.setPublic(w, u);
            return q
          }
        }
      }();
      KEYUTIL.getKey = function(c, o, i) {
        if (typeof RSAKey != "undefined" && c instanceof RSAKey) {
          return c
        }
        if (typeof KJUR.crypto.ECDSA != "undefined" && c instanceof KJUR.crypto.ECDSA) {
          return c
        }
        if (typeof KJUR.crypto.DSA != "undefined" && c instanceof KJUR.crypto.DSA) {
          return c
        }
        if (c.xy !== undefined && c.curve !== undefined) {
          return new KJUR.crypto.ECDSA({
            prv: c.xy,
            curve: c.curve
          })
        }
        if (c.n !== undefined && c.e !== undefined && c.d !== undefined && c.p !== undefined && c.q !== undefined && c.dp !== undefined && c.dq !== undefined && c.co !== undefined) {
          var n = new RSAKey();
          n.setPrivateEx(c.n, c.e, c.d, c.p, c.q, c.dp, c.dq, c.co);
          return n
        }
        if (c.p !== undefined && c.q !== undefined && c.g !== undefined && c.y !== undefined && c.x !== undefined) {
          var n = new KJUR.crypto.DSA();
          n.setPrivate(c.p, c.q, c.g, c.y, c.x);
          return n
        }
        if (c.d !== undefined && c.curve !== undefined) {
          return new KJUR.crypto.ECDSA({
            pub: c.d,
            curve: c.curve
          })
        }
        if (c.n !== undefined && c.e) {
          var n = new RSAKey();
          n.setPublic(c.n, c.e);
          return n
        }
        if (c.p !== undefined && c.q !== undefined && c.g !== undefined && c.y !== undefined && c.x === undefined) {
          var n = new KJUR.crypto.DSA();
          n.setPublic(c.p, c.q, c.g, c.y);
          return n
        }
        if (c.indexOf("-END CERTIFICATE-", 0) != -1 || c.indexOf("-END X509 CERTIFICATE-", 0) != -1 || c.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
          return X509.getPublicKeyFromCertPEM(c)
        }
        if (i === "pkcs8pub") {
          return KEYUTIL.getKeyFromPublicPKCS8Hex(c)
        }
        if (c.indexOf("-END PUBLIC KEY-") != -1) {
          return KEYUTIL.getKeyFromPublicPKCS8PEM(c)
        }
        if (i === "pkcs5prv") {
          var n = new RSAKey();
          n.readPrivateKeyFromASN1HexString(c);
          return n
        }
        if (i === "pkcs5prv") {
          var n = new RSAKey();
          n.readPrivateKeyFromASN1HexString(c);
          return n
        }
        if (c.indexOf("-END RSA PRIVATE KEY-") != -1 && c.indexOf("4,ENCRYPTED") == -1) {
          var n = new RSAKey();
          n.readPrivateKeyFromPEMString(c);
          return n
        }
        if (c.indexOf("-END DSA PRIVATE KEY-") != -1 && c.indexOf("4,ENCRYPTED") == -1) {
          var m = this.getHexFromPEM(c, "DSA PRIVATE KEY");
          var b = ASN1HEX.getVbyList(m, 0, [1], "02");
          var a = ASN1HEX.getVbyList(m, 0, [2], "02");
          var e = ASN1HEX.getVbyList(m, 0, [3], "02");
          var k = ASN1HEX.getVbyList(m, 0, [4], "02");
          var l = ASN1HEX.getVbyList(m, 0, [5], "02");
          var n = new KJUR.crypto.DSA();
          n.setPrivate(new BigInteger(b, 16), new BigInteger(a, 16), new BigInteger(e, 16), new BigInteger(k, 16), new BigInteger(l, 16));
          return n
        }
        if (c.indexOf("-END PRIVATE KEY-") != -1) {
          return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(c)
        }
        if (c.indexOf("-END RSA PRIVATE KEY-") != -1 && c.indexOf("4,ENCRYPTED") != -1) {
          return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(c, o)
        }
        if (c.indexOf("-END EC PRIVATE KEY-") != -1 && c.indexOf("4,ENCRYPTED") != -1) {
          var m = KEYUTIL.getDecryptedKeyHex(c, o);
          var n = ASN1HEX.getVbyList(m, 0, [1], "04");
          var j = ASN1HEX.getVbyList(m, 0, [2, 0], "06");
          var d = ASN1HEX.getVbyList(m, 0, [3, 0], "03").substr(2);
          var h = "";
          if (KJUR.crypto.OID.oidhex2name[j] !== undefined) {
            h = KJUR.crypto.OID.oidhex2name[j]
          } else {
            throw "undefined OID(hex) in KJUR.crypto.OID: " + j
          }
          var f = new KJUR.crypto.ECDSA({
            name: h
          });
          f.setPublicKeyHex(d);
          f.setPrivateKeyHex(n);
          f.isPublic = false;
          return f
        }
        if (c.indexOf("-END DSA PRIVATE KEY-") != -1 && c.indexOf("4,ENCRYPTED") != -1) {
          var m = KEYUTIL.getDecryptedKeyHex(c, o);
          var b = ASN1HEX.getVbyList(m, 0, [1], "02");
          var a = ASN1HEX.getVbyList(m, 0, [2], "02");
          var e = ASN1HEX.getVbyList(m, 0, [3], "02");
          var k = ASN1HEX.getVbyList(m, 0, [4], "02");
          var l = ASN1HEX.getVbyList(m, 0, [5], "02");
          var n = new KJUR.crypto.DSA();
          n.setPrivate(new BigInteger(b, 16), new BigInteger(a, 16), new BigInteger(e, 16), new BigInteger(k, 16), new BigInteger(l, 16));
          return n
        }
        if (c.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
          return KEYUTIL.getKeyFromEncryptedPKCS8PEM(c, o)
        }
        throw "not supported argument"
      };
      KEYUTIL.generateKeypair = function(a, c) {
        if (a == "RSA") {
          var b = c;
          var h = new RSAKey();
          h.generate(b, "10001");
          h.isPrivate = true;
          h.isPublic = true;
          var f = new RSAKey();
          var e = h.n.toString(16);
          var i = h.e.toString(16);
          f.setPublic(e, i);
          f.isPrivate = false;
          f.isPublic = true;
          var k = {};
          k.prvKeyObj = h;
          k.pubKeyObj = f;
          return k
        } else {
          if (a == "EC") {
            var d = c;
            var g = new KJUR.crypto.ECDSA({
              curve: d
            });
            var j = g.generateKeyPairHex();
            var h = new KJUR.crypto.ECDSA({
              curve: d
            });
            h.setPrivateKeyHex(j.ecprvhex);
            h.isPrivate = true;
            h.isPublic = false;
            var f = new KJUR.crypto.ECDSA({
              curve: d
            });
            f.setPublicKeyHex(j.ecpubhex);
            f.isPrivate = false;
            f.isPublic = true;
            var k = {};
            k.prvKeyObj = h;
            k.pubKeyObj = f;
            return k
          } else {
            throw "unknown algorithm: " + a
          }
        }
      };
      KEYUTIL.getPEM = function(a, r, o, g, j) {
        var v = KJUR.asn1;
        var u = KJUR.crypto;

        function p(s) {
          var w = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 0
            }, {
              "int": {
                bigint: s.n
              }
            }, {
              "int": s.e
            }, {
              "int": {
                bigint: s.d
              }
            }, {
              "int": {
                bigint: s.p
              }
            }, {
              "int": {
                bigint: s.q
              }
            }, {
              "int": {
                bigint: s.dmp1
              }
            }, {
              "int": {
                bigint: s.dmq1
              }
            }, {
              "int": {
                bigint: s.coeff
              }
            }]
          });
          return w
        }

        function q(w) {
          var s = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 1
            }, {
              octstr: {
                hex: w.prvKeyHex
              }
            }, {
              tag: ["a0", true, {
                oid: {
                  name: w.curveName
                }
              }]
            }, {
              tag: ["a1", true, {
                bitstr: {
                  hex: "00" + w.pubKeyHex
                }
              }]
            }]
          });
          return s
        }

        function n(s) {
          var w = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 0
            }, {
              "int": {
                bigint: s.p
              }
            }, {
              "int": {
                bigint: s.q
              }
            }, {
              "int": {
                bigint: s.g
              }
            }, {
              "int": {
                bigint: s.y
              }
            }, {
              "int": {
                bigint: s.x
              }
            }]
          });
          return w
        }
        if (((typeof RSAKey != "undefined" && a instanceof RSAKey) || (typeof u.DSA != "undefined" && a instanceof u.DSA) || (typeof u.ECDSA != "undefined" && a instanceof u.ECDSA)) && a.isPublic == true && (r === undefined || r == "PKCS8PUB")) {
          var t = new KJUR.asn1.x509.SubjectPublicKeyInfo(a);
          var m = t.getEncodedHex();
          return v.ASN1Util.getPEMStringFromHex(m, "PUBLIC KEY")
        }
        if (r == "PKCS1PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && (o === undefined || o == null) && a.isPrivate == true) {
          var t = p(a);
          var m = t.getEncodedHex();
          return v.ASN1Util.getPEMStringFromHex(m, "RSA PRIVATE KEY")
        }
        if (r == "PKCS1PRV" && typeof RSAKey != "undefined" && a instanceof KJUR.crypto.ECDSA && (o === undefined || o == null) && a.isPrivate == true) {
          var f = new KJUR.asn1.DERObjectIdentifier({
            name: a.curveName
          });
          var l = f.getEncodedHex();
          var e = q(a);
          var k = e.getEncodedHex();
          var i = "";
          i += v.ASN1Util.getPEMStringFromHex(l, "EC PARAMETERS");
          i += v.ASN1Util.getPEMStringFromHex(k, "EC PRIVATE KEY");
          return i
        }
        if (r == "PKCS1PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && (o === undefined || o == null) && a.isPrivate == true) {
          var t = n(a);
          var m = t.getEncodedHex();
          return v.ASN1Util.getPEMStringFromHex(m, "DSA PRIVATE KEY")
        }
        if (r == "PKCS5PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && (o !== undefined && o != null) && a.isPrivate == true) {
          var t = p(a);
          var m = t.getEncodedHex();
          if (g === undefined) {
            g = "DES-EDE3-CBC"
          }
          return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", m, o, g)
        }
        if (r == "PKCS5PRV" && typeof KJUR.crypto.ECDSA != "undefined" && a instanceof KJUR.crypto.ECDSA && (o !== undefined && o != null) && a.isPrivate == true) {
          var t = q(a);
          var m = t.getEncodedHex();
          if (g === undefined) {
            g = "DES-EDE3-CBC"
          }
          return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", m, o, g)
        }
        if (r == "PKCS5PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && (o !== undefined && o != null) && a.isPrivate == true) {
          var t = n(a);
          var m = t.getEncodedHex();
          if (g === undefined) {
            g = "DES-EDE3-CBC"
          }
          return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", m, o, g)
        }
        var h = function(w, s) {
          var y = b(w, s);
          var x = new KJUR.asn1.ASN1Util.newObject({
            seq: [{
              seq: [{
                oid: {
                  name: "pkcs5PBES2"
                }
              }, {
                seq: [{
                  seq: [{
                    oid: {
                      name: "pkcs5PBKDF2"
                    }
                  }, {
                    seq: [{
                      octstr: {
                        hex: y.pbkdf2Salt
                      }
                    }, {
                      "int": y.pbkdf2Iter
                    }]
                  }]
                }, {
                  seq: [{
                    oid: {
                      name: "des-EDE3-CBC"
                    }
                  }, {
                    octstr: {
                      hex: y.encryptionSchemeIV
                    }
                  }]
                }]
              }]
            }, {
              octstr: {
                hex: y.ciphertext
              }
            }]
          });
          return x.getEncodedHex()
        };
        var b = function(D, E) {
          var x = 100;
          var C = CryptoJS.lib.WordArray.random(8);
          var B = "DES-EDE3-CBC";
          var s = CryptoJS.lib.WordArray.random(8);
          var y = CryptoJS.PBKDF2(E, C, {
            keySize: 192 / 32,
            iterations: x
          });
          var z = CryptoJS.enc.Hex.parse(D);
          var A = CryptoJS.TripleDES.encrypt(z, y, {
            iv: s
          }) + "";
          var w = {};
          w.ciphertext = A;
          w.pbkdf2Salt = CryptoJS.enc.Hex.stringify(C);
          w.pbkdf2Iter = x;
          w.encryptionSchemeAlg = B;
          w.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);
          return w
        };
        if (r == "PKCS8PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && a.isPrivate == true) {
          var d = p(a);
          var c = d.getEncodedHex();
          var t = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 0
            }, {
              seq: [{
                oid: {
                  name: "rsaEncryption"
                }
              }, {
                "null": true
              }]
            }, {
              octstr: {
                hex: c
              }
            }]
          });
          var m = t.getEncodedHex();
          if (o === undefined || o == null) {
            return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
          } else {
            var k = h(m, o);
            return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
          }
        }
        if (r == "PKCS8PRV" && typeof KJUR.crypto.ECDSA != "undefined" && a instanceof KJUR.crypto.ECDSA && a.isPrivate == true) {
          var d = new KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 1
            }, {
              octstr: {
                hex: a.prvKeyHex
              }
            }, {
              tag: ["a1", true, {
                bitstr: {
                  hex: "00" + a.pubKeyHex
                }
              }]
            }]
          });
          var c = d.getEncodedHex();
          var t = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 0
            }, {
              seq: [{
                oid: {
                  name: "ecPublicKey"
                }
              }, {
                oid: {
                  name: a.curveName
                }
              }]
            }, {
              octstr: {
                hex: c
              }
            }]
          });
          var m = t.getEncodedHex();
          if (o === undefined || o == null) {
            return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
          } else {
            var k = h(m, o);
            return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
          }
        }
        if (r == "PKCS8PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && a.isPrivate == true) {
          var d = new KJUR.asn1.DERInteger({
            bigint: a.x
          });
          var c = d.getEncodedHex();
          var t = KJUR.asn1.ASN1Util.newObject({
            seq: [{
              "int": 0
            }, {
              seq: [{
                oid: {
                  name: "dsa"
                }
              }, {
                seq: [{
                  "int": {
                    bigint: a.p
                  }
                }, {
                  "int": {
                    bigint: a.q
                  }
                }, {
                  "int": {
                    bigint: a.g
                  }
                }]
              }]
            }, {
              octstr: {
                hex: c
              }
            }]
          });
          var m = t.getEncodedHex();
          if (o === undefined || o == null) {
            return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
          } else {
            var k = h(m, o);
            return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
          }
        }
        throw "unsupported object nor format"
      };
      KEYUTIL.getKeyFromCSRPEM = function(b) {
        var a = KEYUTIL.getHexFromPEM(b, "CERTIFICATE REQUEST");
        var c = KEYUTIL.getKeyFromCSRHex(a);
        return c
      };
      KEYUTIL.getKeyFromCSRHex = function(a) {
        var c = KEYUTIL.parseCSRHex(a);
        var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");
        return b
      };
      KEYUTIL.parseCSRHex = function(c) {
        var b = {};
        var e = c;
        if (e.substr(0, 2) != "30") {
          throw "malformed CSR(code:001)"
        }
        var d = ASN1HEX.getPosArrayOfChildren_AtObj(e, 0);
        if (d.length < 1) {
          throw "malformed CSR(code:002)"
        }
        if (e.substr(d[0], 2) != "30") {
          throw "malformed CSR(code:003)"
        }
        var a = ASN1HEX.getPosArrayOfChildren_AtObj(e, d[0]);
        if (a.length < 3) {
          throw "malformed CSR(code:004)"
        }
        b.p8pubkeyhex = ASN1HEX.getHexOfTLV_AtObj(e, a[2]);
        return b
      };
      /*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      function _rsapem_pemToBase64(b) {
        var a = b;
        a = a.replace("-----BEGIN RSA PRIVATE KEY-----", "");
        a = a.replace("-----END RSA PRIVATE KEY-----", "");
        a = a.replace(/[ \n]+/g, "");
        return a
      }

      function _rsapem_getPosArrayOfChildrenFromHex(d) {
        var j = new Array();
        var k = ASN1HEX.getStartPosOfV_AtObj(d, 0);
        var f = ASN1HEX.getPosOfNextSibling_AtObj(d, k);
        var h = ASN1HEX.getPosOfNextSibling_AtObj(d, f);
        var b = ASN1HEX.getPosOfNextSibling_AtObj(d, h);
        var l = ASN1HEX.getPosOfNextSibling_AtObj(d, b);
        var e = ASN1HEX.getPosOfNextSibling_AtObj(d, l);
        var g = ASN1HEX.getPosOfNextSibling_AtObj(d, e);
        var c = ASN1HEX.getPosOfNextSibling_AtObj(d, g);
        var i = ASN1HEX.getPosOfNextSibling_AtObj(d, c);
        j.push(k, f, h, b, l, e, g, c, i);
        return j
      }

      function _rsapem_getHexValueArrayOfChildrenFromHex(i) {
        var o = _rsapem_getPosArrayOfChildrenFromHex(i);
        var r = ASN1HEX.getHexOfV_AtObj(i, o[0]);
        var f = ASN1HEX.getHexOfV_AtObj(i, o[1]);
        var j = ASN1HEX.getHexOfV_AtObj(i, o[2]);
        var k = ASN1HEX.getHexOfV_AtObj(i, o[3]);
        var c = ASN1HEX.getHexOfV_AtObj(i, o[4]);
        var b = ASN1HEX.getHexOfV_AtObj(i, o[5]);
        var h = ASN1HEX.getHexOfV_AtObj(i, o[6]);
        var g = ASN1HEX.getHexOfV_AtObj(i, o[7]);
        var l = ASN1HEX.getHexOfV_AtObj(i, o[8]);
        var m = new Array();
        m.push(r, f, j, k, c, b, h, g, l);
        return m
      }

      function _rsapem_readPrivateKeyFromASN1HexString(c) {
        var b = _rsapem_getHexValueArrayOfChildrenFromHex(c);
        this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
      }

      function _rsapem_readPrivateKeyFromPEMString(e) {
        var c = _rsapem_pemToBase64(e);
        var d = b64tohex(c);
        var b = _rsapem_getHexValueArrayOfChildrenFromHex(d);
        this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
      }
      RSAKey.prototype.readPrivateKeyFromPEMString = _rsapem_readPrivateKeyFromPEMString;
      RSAKey.prototype.readPrivateKeyFromASN1HexString = _rsapem_readPrivateKeyFromASN1HexString;
      /*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      var _RE_HEXDECONLY = new RegExp("");
      _RE_HEXDECONLY.compile("[^0-9a-f]", "gi");

      function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {
        var b = function(f) {
          return KJUR.crypto.Util.hashString(f, a)
        };
        var c = b(d);
        return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e)
      }

      function _zeroPaddingOfSignature(e, d) {
        var c = "";
        var a = d / 4 - e.length;
        for (var b = 0; b < a; b++) {
          c = c + "0"
        }
        return c + e
      }

      function _rsasign_signString(d, a) {
        var b = function(e) {
          return KJUR.crypto.Util.hashString(e, a)
        };
        var c = b(d);
        return this.signWithMessageHash(c, a)
      }

      function _rsasign_signWithMessageHash(e, c) {
        var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());
        var b = parseBigInt(f, 16);
        var d = this.doPrivate(b);
        var a = d.toString(16);
        return _zeroPaddingOfSignature(a, this.n.bitLength())
      }

      function _rsasign_signStringWithSHA1(a) {
        return _rsasign_signString.call(this, a, "sha1")
      }

      function _rsasign_signStringWithSHA256(a) {
        return _rsasign_signString.call(this, a, "sha256")
      }

      function pss_mgf1_str(c, a, e) {
        var b = "",
          d = 0;
        while (b.length < a) {
          b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));
          d += 1
        }
        return b
      }

      function _rsasign_signStringPSS(e, a, d) {
        var c = function(f) {
          return KJUR.crypto.Util.hashHex(f, a)
        };
        var b = c(rstrtohex(e));
        if (d === undefined) {
          d = -1
        }
        return this.signWithMessageHashPSS(b, a, d)
      }

      function _rsasign_signWithMessageHashPSS(l, a, k) {
        var b = hextorstr(l);
        var g = b.length;
        var m = this.n.bitLength() - 1;
        var c = Math.ceil(m / 8);
        var d;
        var o = function(i) {
          return KJUR.crypto.Util.hashHex(i, a)
        };
        if (k === -1 || k === undefined) {
          k = g
        } else {
          if (k === -2) {
            k = c - g - 2
          } else {
            if (k < -2) {
              throw "invalid salt length"
            }
          }
        }
        if (c < (g + k + 2)) {
          throw "data too long"
        }
        var f = "";
        if (k > 0) {
          f = new Array(k);
          new SecureRandom().nextBytes(f);
          f = String.fromCharCode.apply(String, f)
        }
        var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));
        var j = [];
        for (d = 0; d < c - k - g - 2; d += 1) {
          j[d] = 0
        }
        var e = String.fromCharCode.apply(String, j) + "\x01" + f;
        var h = pss_mgf1_str(n, e.length, o);
        var q = [];
        for (d = 0; d < e.length; d += 1) {
          q[d] = e.charCodeAt(d) ^ h.charCodeAt(d)
        }
        var p = (65280 >> (8 * c - m)) & 255;
        q[0] &= ~p;
        for (d = 0; d < g; d++) {
          q.push(n.charCodeAt(d))
        }
        q.push(188);
        return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength())
      }

      function _rsasign_getDecryptSignatureBI(a, d, c) {
        var b = new RSAKey();
        b.setPublic(d, c);
        var e = b.doPublic(a);
        return e
      }

      function _rsasign_getHexDigestInfoFromSig(a, c, b) {
        var e = _rsasign_getDecryptSignatureBI(a, c, b);
        var d = e.toString(16).replace(/^1f+00/, "");
        return d
      }

      function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
        for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
          var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];
          var b = d.length;
          if (f.substring(0, b) == d) {
            var c = [e, f.substring(b)];
            return c
          }
        }
        return []
      }

      function _rsasign_verifySignatureWithArgs(f, b, g, j) {
        var e = _rsasign_getHexDigestInfoFromSig(b, g, j);
        var h = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
        if (h.length == 0) {
          return false
        }
        var d = h[0];
        var i = h[1];
        var a = function(k) {
          return KJUR.crypto.Util.hashString(k, d)
        };
        var c = a(f);
        return (i == c)
      }

      function _rsasign_verifyHexSignatureForMessage(c, b) {
        var d = parseBigInt(c, 16);
        var a = _rsasign_verifySignatureWithArgs(b, d, this.n.toString(16), this.e.toString(16));
        return a
      }

      function _rsasign_verifyString(f, j) {
        j = j.replace(_RE_HEXDECONLY, "");
        j = j.replace(/[ \n]+/g, "");
        var b = parseBigInt(j, 16);
        if (b.bitLength() > this.n.bitLength()) {
          return 0
        }
        var i = this.doPublic(b);
        var e = i.toString(16).replace(/^1f+00/, "");
        var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
        if (g.length == 0) {
          return false
        }
        var d = g[0];
        var h = g[1];
        var a = function(k) {
          return KJUR.crypto.Util.hashString(k, d)
        };
        var c = a(f);
        return (h == c)
      }

      function _rsasign_verifyWithMessageHash(e, a) {
        a = a.replace(_RE_HEXDECONLY, "");
        a = a.replace(/[ \n]+/g, "");
        var b = parseBigInt(a, 16);
        if (b.bitLength() > this.n.bitLength()) {
          return 0
        }
        var h = this.doPublic(b);
        var g = h.toString(16).replace(/^1f+00/, "");
        var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);
        if (c.length == 0) {
          return false
        }
        var d = c[0];
        var f = c[1];
        return (f == e)
      }

      function _rsasign_verifyStringPSS(c, b, a, f) {
        var e = function(g) {
          return KJUR.crypto.Util.hashHex(g, a)
        };
        var d = e(rstrtohex(c));
        if (f === undefined) {
          f = -1
        }
        return this.verifyWithMessageHashPSS(d, b, a, f)
      }

      function _rsasign_verifyWithMessageHashPSS(f, s, l, c) {
        var k = new BigInteger(s, 16);
        if (k.bitLength() > this.n.bitLength()) {
          return false
        }
        var r = function(i) {
          return KJUR.crypto.Util.hashHex(i, l)
        };
        var j = hextorstr(f);
        var h = j.length;
        var g = this.n.bitLength() - 1;
        var m = Math.ceil(g / 8);
        var q;
        if (c === -1 || c === undefined) {
          c = h
        } else {
          if (c === -2) {
            c = m - h - 2
          } else {
            if (c < -2) {
              throw "invalid salt length"
            }
          }
        }
        if (m < (h + c + 2)) {
          throw "data too long"
        }
        var a = this.doPublic(k).toByteArray();
        for (q = 0; q < a.length; q += 1) {
          a[q] &= 255
        }
        while (a.length < m) {
          a.unshift(0)
        }
        if (a[m - 1] !== 188) {
          throw "encoded message does not end in 0xbc"
        }
        a = String.fromCharCode.apply(String, a);
        var d = a.substr(0, m - h - 1);
        var e = a.substr(d.length, h);
        var p = (65280 >> (8 * m - g)) & 255;
        if ((d.charCodeAt(0) & p) !== 0) {
          throw "bits beyond keysize not zero"
        }
        var n = pss_mgf1_str(e, d.length, r);
        var o = [];
        for (q = 0; q < d.length; q += 1) {
          o[q] = d.charCodeAt(q) ^ n.charCodeAt(q)
        }
        o[0] &= ~p;
        var b = m - h - c - 2;
        for (q = 0; q < b; q += 1) {
          if (o[q] !== 0) {
            throw "leftmost octets not zero"
          }
        }
        if (o[b] !== 1) {
          throw "0x01 marker not found"
        }
        return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c)))))
      }
      RSAKey.prototype.signWithMessageHash = _rsasign_signWithMessageHash;
      RSAKey.prototype.signString = _rsasign_signString;
      RSAKey.prototype.signStringWithSHA1 = _rsasign_signStringWithSHA1;
      RSAKey.prototype.signStringWithSHA256 = _rsasign_signStringWithSHA256;
      RSAKey.prototype.sign = _rsasign_signString;
      RSAKey.prototype.signWithSHA1 = _rsasign_signStringWithSHA1;
      RSAKey.prototype.signWithSHA256 = _rsasign_signStringWithSHA256;
      RSAKey.prototype.signWithMessageHashPSS = _rsasign_signWithMessageHashPSS;
      RSAKey.prototype.signStringPSS = _rsasign_signStringPSS;
      RSAKey.prototype.signPSS = _rsasign_signStringPSS;
      RSAKey.SALT_LEN_HLEN = -1;
      RSAKey.SALT_LEN_MAX = -2;
      RSAKey.prototype.verifyWithMessageHash = _rsasign_verifyWithMessageHash;
      RSAKey.prototype.verifyString = _rsasign_verifyString;
      RSAKey.prototype.verifyHexSignatureForMessage = _rsasign_verifyHexSignatureForMessage;
      RSAKey.prototype.verify = _rsasign_verifyString;
      RSAKey.prototype.verifyHexSignatureForByteArrayMessage = _rsasign_verifyHexSignatureForMessage;
      RSAKey.prototype.verifyWithMessageHashPSS = _rsasign_verifyWithMessageHashPSS;
      RSAKey.prototype.verifyStringPSS = _rsasign_verifyStringPSS;
      RSAKey.prototype.verifyPSS = _rsasign_verifyStringPSS;
      RSAKey.SALT_LEN_RECOVER = -2;
      /*! x509-1.1.3.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
       */
      function X509() {
        this.subjectPublicKeyRSA = null;
        this.subjectPublicKeyRSA_hN = null;
        this.subjectPublicKeyRSA_hE = null;
        this.hex = null;
        this.getSerialNumberHex = function() {
          return ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 1])
        };
        this.getIssuerHex = function() {
          return ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 3])
        };
        this.getIssuerString = function() {
          return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 3]))
        };
        this.getSubjectHex = function() {
          return ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 5])
        };
        this.getSubjectString = function() {
          return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 5]))
        };
        this.getNotBefore = function() {
          var a = ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 4, 0]);
          a = a.replace(/(..)/g, "%$1");
          a = decodeURIComponent(a);
          return a
        };
        this.getNotAfter = function() {
          var a = ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 4, 1]);
          a = a.replace(/(..)/g, "%$1");
          a = decodeURIComponent(a);
          return a
        };
        this.readCertPEM = function(c) {
          var e = X509.pemToHex(c);
          var b = X509.getPublicKeyHexArrayFromCertHex(e);
          var d = new RSAKey();
          d.setPublic(b[0], b[1]);
          this.subjectPublicKeyRSA = d;
          this.subjectPublicKeyRSA_hN = b[0];
          this.subjectPublicKeyRSA_hE = b[1];
          this.hex = e
        };
        this.readCertPEMWithoutRSAInit = function(c) {
          var d = X509.pemToHex(c);
          var b = X509.getPublicKeyHexArrayFromCertHex(d);
          this.subjectPublicKeyRSA.setPublic(b[0], b[1]);
          this.subjectPublicKeyRSA_hN = b[0];
          this.subjectPublicKeyRSA_hE = b[1];
          this.hex = d
        }
      }
      X509.pemToBase64 = function(a) {
        var b = a;
        b = b.replace("-----BEGIN CERTIFICATE-----", "");
        b = b.replace("-----END CERTIFICATE-----", "");
        b = b.replace(/[ \n]+/g, "");
        return b
      };
      X509.pemToHex = function(a) {
        var c = X509.pemToBase64(a);
        var b = b64tohex(c);
        return b
      };
      X509.getSubjectPublicKeyPosFromCertHex = function(f) {
        var e = X509.getSubjectPublicKeyInfoPosFromCertHex(f);
        if (e == -1) {
          return -1
        }
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(f, e);
        if (b.length != 2) {
          return -1
        }
        var d = b[1];
        if (f.substring(d, d + 2) != "03") {
          return -1
        }
        var c = ASN1HEX.getStartPosOfV_AtObj(f, d);
        if (f.substring(c, c + 2) != "00") {
          return -1
        }
        return c + 2
      };
      X509.getSubjectPublicKeyInfoPosFromCertHex = function(d) {
        var c = ASN1HEX.getStartPosOfV_AtObj(d, 0);
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(d, c);
        if (b.length < 1) {
          return -1
        }
        if (d.substring(b[0], b[0] + 10) == "a003020102") {
          if (b.length < 6) {
            return -1
          }
          return b[6]
        } else {
          if (b.length < 5) {
            return -1
          }
          return b[5]
        }
      };
      X509.getPublicKeyHexArrayFromCertHex = function(f) {
        var e = X509.getSubjectPublicKeyPosFromCertHex(f);
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(f, e);
        if (b.length != 2) {
          return []
        }
        var d = ASN1HEX.getHexOfV_AtObj(f, b[0]);
        var c = ASN1HEX.getHexOfV_AtObj(f, b[1]);
        if (d != null && c != null) {
          return [d, c]
        } else {
          return []
        }
      };
      X509.getHexTbsCertificateFromCert = function(b) {
        var a = ASN1HEX.getStartPosOfV_AtObj(b, 0);
        return a
      };
      X509.getPublicKeyHexArrayFromCertPEM = function(c) {
        var d = X509.pemToHex(c);
        var b = X509.getPublicKeyHexArrayFromCertHex(d);
        return b
      };
      X509.hex2dn = function(e) {
        var f = "";
        var c = ASN1HEX.getPosArrayOfChildren_AtObj(e, 0);
        for (var d = 0; d < c.length; d++) {
          var b = ASN1HEX.getHexOfTLV_AtObj(e, c[d]);
          f = f + "/" + X509.hex2rdn(b)
        }
        return f
      };
      X509.hex2rdn = function(a) {
        var f = ASN1HEX.getDecendantHexTLVByNthList(a, 0, [0, 0]);
        var e = ASN1HEX.getDecendantHexVByNthList(a, 0, [0, 1]);
        var c = "";
        try {
          c = X509.DN_ATTRHEX[f]
        } catch (b) {
          c = f
        }
        e = e.replace(/(..)/g, "%$1");
        var d = decodeURIComponent(e);
        return c + "=" + d
      };
      X509.DN_ATTRHEX = {
        "0603550406": "C",
        "060355040a": "O",
        "060355040b": "OU",
        "0603550403": "CN",
        "0603550405": "SN",
        "0603550408": "ST",
        "0603550407": "L"
      };
      X509.getPublicKeyFromCertPEM = function(f) {
        var c = X509.getPublicKeyInfoPropOfCertPEM(f);
        if (c.algoid == "2a864886f70d010101") {
          var i = KEYUTIL.parsePublicRawRSAKeyHex(c.keyhex);
          var j = new RSAKey();
          j.setPublic(i.n, i.e);
          return j
        } else {
          if (c.algoid == "2a8648ce3d0201") {
            var e = KJUR.crypto.OID.oidhex2name[c.algparam];
            var j = new KJUR.crypto.ECDSA({
              curve: e,
              info: c.keyhex
            });
            j.setPublicKeyHex(c.keyhex);
            return j
          } else {
            if (c.algoid == "2a8648ce380401") {
              var b = ASN1HEX.getVbyList(c.algparam, 0, [0], "02");
              var a = ASN1HEX.getVbyList(c.algparam, 0, [1], "02");
              var d = ASN1HEX.getVbyList(c.algparam, 0, [2], "02");
              var h = ASN1HEX.getHexOfV_AtObj(c.keyhex, 0);
              h = h.substr(2);
              var j = new KJUR.crypto.DSA();
              j.setPublic(new BigInteger(b, 16), new BigInteger(a, 16), new BigInteger(d, 16), new BigInteger(h, 16));
              return j
            } else {
              throw "unsupported key"
            }
          }
        }
      };
      X509.getPublicKeyInfoPropOfCertPEM = function(e) {
        var c = {};
        c.algparam = null;
        var g = X509.pemToHex(e);
        var d = ASN1HEX.getPosArrayOfChildren_AtObj(g, 0);
        if (d.length != 3) {
          throw "malformed X.509 certificate PEM (code:001)"
        }
        if (g.substr(d[0], 2) != "30") {
          throw "malformed X.509 certificate PEM (code:002)"
        }
        var b = ASN1HEX.getPosArrayOfChildren_AtObj(g, d[0]);
        if (b.length < 7) {
          throw "malformed X.509 certificate PEM (code:003)"
        }
        var h = ASN1HEX.getPosArrayOfChildren_AtObj(g, b[6]);
        if (h.length != 2) {
          throw "malformed X.509 certificate PEM (code:004)"
        }
        var f = ASN1HEX.getPosArrayOfChildren_AtObj(g, h[0]);
        if (f.length != 2) {
          throw "malformed X.509 certificate PEM (code:005)"
        }
        c.algoid = ASN1HEX.getHexOfV_AtObj(g, f[0]);
        if (g.substr(f[1], 2) == "06") {
          c.algparam = ASN1HEX.getHexOfV_AtObj(g, f[1])
        } else {
          if (g.substr(f[1], 2) == "30") {
            c.algparam = ASN1HEX.getHexOfTLV_AtObj(g, f[1])
          }
        }
        if (g.substr(h[1], 2) != "03") {
          throw "malformed X.509 certificate PEM (code:006)"
        }
        var a = ASN1HEX.getHexOfV_AtObj(g, h[1]);
        c.keyhex = a.substr(2);
        return c
      };
    </script>
  </div>
  <div class="suntrust-herosignonsupport-link">
    <a class="suntrust-support-link-herosignon" href="/dotcom/external?clickedUrl=https://onlinebanking.suntrust.com/UI/login#/forgotcredentials" target="_blank">Forgot User ID/Password?</a>
    <a class="suntrust-support-link-herosignon" href="/dotcom/external?clickedUrl=https://onlinebanking.suntrust.com/UI/login#/enrollment" target="_blank">Sign Up Now</a>
  </div>
</form>

Name: loginForm-herosignon-OCMPOST https://wholesalelogin.suntrust.com/authentication/post

<form action="https://wholesalelogin.suntrust.com/authentication/post" class="signOnLoginForm herosignon-OCM" method="post" name="loginForm-herosignon-OCM" autocomplete="off" data-appid="herosignon-OCM" data-gateway="11g" data-apptype="OCM">
  <div class="suntrust-login-form-field">
    <label for="sign-on-herosignon-OCM-user" class="suntrust-accessible-text">User ID</label>
    <input type="text" title="User ID" class="suntrust-login-input suntrust-login-user-input" placeholder="User ID" id="sign-on-herosignon-OCM-user" autocomplete="off" value="">
    <input type="hidden" name="username" class="suntrust-login-hidden-user-id" value="">
    <input type="hidden" name="isEncrypted" class="suntrust-login-input-is-encrypted" value="false">
    <input type="hidden" name="devicedetails" class="suntrust-devicedetails-input" value="">
    <!-- <input type="hidden" name="trk" class="suntrust-trk-input" value=""> -->
  </div>
  <div class="suntrust-login-form-field suntrust-remember-me-accessible">
    <label for="sign-on-herosignon-OCM-password" class="suntrust-accessible-text">Password</label>
    <input type="password" placeholder="Password" class="suntrust-login-input suntrust-login-password-herosignon" id="sign-on-herosignon-OCM-password" title="Password" value="" autocomplete="off">
    <input type="hidden" name="password" class="hiddenPassword" value="">
    <div class="suntrust-remember-me-field">
      <div class="sun-checkbox-input-container" id="uniform-sign-on-herosignon-OCM-check-hero"><span><input type="checkbox" id="sign-on-herosignon-OCM-check-hero" data-suntrust-class="suntrust-checkbox" class="suntrust-login-checkbox"
            name="chkRememberUser"></span></div>
      <input type="hidden" name="rememberMe" class="suntrust-login-checkbox-hidden" value="false">
      <label for="sign-on-herosignon-OCM-check-hero" class="suntrust-checkbox-label">Remember User ID</label>
    </div>
    <div class="suntrust-login-button-herosignon-container">
      <input class="suntrust-login-button-herosignon" type="submit" value="Sign On">
    </div>
    <div>
      <input type="hidden" name="type" value="BusinessPortal">
      <input type="hidden" name="successurl" value="https://wholesaleportal.suntrust.com/OCM/UI/SplashPage/">
      <input type="hidden" name="initlogin" value="true">
      <input type="hidden" name="devicedetails">
    </div>
  </div>
  <div class="suntrust-herosignonsupport-link">
    <a class="suntrust-support-link-herosignon" href="/dotcom/external?clickedUrl=https://login.businessonline.suntrust.com/business/forgotpassword" target="_blank">Forgot User ID/Password?</a>
    <a class="suntrust-support-link-herosignon" href="/dotcom/external?clickedUrl=https://login.businessonline.suntrust.com/business/sboenrollment" target="_blank">Sign Up Now</a>
  </div>
</form>

Text Content

suntrustbanks
Home Skip to main content Skip to footer
Search Clear



INVESTMENT ACCOUNT ACCESS




ATTENTION: SUNTRUST INVESTMENT
SERVICES, NOW TRUIST INVESTMENT SERVICES, INC. ACCOUNT HOLDERS

Important changes are coming to improve the way
you view your account documents and access your
investment accounts.

Sign On

Online Banking

Business Online
User ID
Password

Remember User ID


Forgot User ID/Password? Sign Up Now
User ID
Password

Remember User ID


Forgot User ID/Password? Sign Up Now

Attention: SunTrust Investment
Services, now Truist Investment Services, Inc. Account Holders
Important changes are coming to improve the way
you view your account documents and access your
investment accounts.
SIGN ON

Online Banking Sign On
Link opens in New window.

Business Online Sign On
Link opens in New window.



WHAT’S CHANGING?

We’re adding two new features to SunTrust Online Banking to provide seamless
access to:

 * Your account documents
 * Investment Portfolio—our new, robust digital experience where you can view
   and interact with all your investment account details

Already have a SunTrust Online account? Simply sign on to access your account
documents and Investment Portfolio.





NEW TO ONLINE BANKING?

SunTrust Online Banking gives you easy access to your account documents and
Investment Portfolio. Plus, you can view balances, transfer funds, pay bills,
deposit checks, and much more—all 24/7.
Enroll now




THIRD PARTIES AND NON-ACCOUNT HOLDERS

Third-party users with authorization to view client account information can
continue to use Wealthscape Investor.


CONNECT WITH US!

          

 * Privacy
 * Fraud & Security
 * Terms & Conditions




Truist Bank, Member FDIC. ©2021 Truist Financial Corporation. SunTrust®, the
SunTrust logo, and Truist are service marks of Truist Financial Corporation. 

Equal Housing Lender

Investment and Insurance Products:

 * Are Not FDIC or any other Government Agency Insured
 * Are Not Bank Guaranteed
 * May Lose Value

All Truist mortgage professionals are registered on the Nationwide Mortgage
Licensing System & Registry (NMLS), which promotes uniformity and transparency
throughout the residential real estate industry. Search the NMLS Registry.Link
opens a new window

Services provided by the following affiliates of Truist Financial Corporation:
Banking products and services, including loans and deposit accounts, are
provided by SunTrust Bank and Branch Banking and Trust Company, both now Truist
Bank, Member FDIC. Trust and investment management services are provided by
SunTrust Bank and Branch Banking and Trust Company, both now Truist Bank, and
SunTrust Delaware Trust Company. Securities, brokerage accounts and /or
insurance (including annuities) are offered by Truist Investment Services, Inc.
(d/b/a SunTrust Investment Services, Inc.),  BB&T Securities, LLC, and P.J. Robb
Variable Corp., which are SEC registered broker-dealers, members FINRALink opens
a new window, SIPCLink opens a new window, and a licensed insurance agency where
applicable. Investment advisory services are offered by Truist Advisory
Services, Inc. (d/b/a SunTrust Advisory Services, Inc.), GFO Advisory Services,
LLC, BB&T Securities, LLC, Sterling Capital Management, LLC, Precept Advisory
Group, LLC, and BB&T Institutional Investment Advisors, Inc., each SEC
registered investment advisers. BB&T Investments and BB&T Scott & Stringfellow
are divisions of BB&T Securities, LLC. Mutual fund products are advised by
Sterling Capital Management, LLC. Mortgage products and services are offered
through SunTrust Mortgage, a tradename for SunTrust Bank now Truist Bank.  Life
insurance products are offered through Truist Life Insurance Services, a
division of Crump Life Insurance Services, Inc., AR license #100103477, a wholly
owned subsidiary of Truist Insurance Holdings, Inc.

"SunTrust Advisors" may be officers and/or associated persons of the following
affiliates of Truist Financial Corporation: SunTrust Bank now Truist Bank, our
commercial bank, which provides banking, trust and asset management services;
Truist Investment Services, Inc., a registered broker-dealer, which is a member
of FINRALink opens a new window and SIPCLink opens a new window, and a licensed
insurance agency, and which provides securities, annuities and life insurance
products; Truist Advisory Services, Inc., an SEC registered investment adviser
which provides Investment Advisory services.

Comments regarding tax implications are informational only. Truist and its
representatives do not provide tax or legal advice. You should consult your
individual tax or legal professional before taking any action that may have tax
or legal consequences.

SunTrust Private Wealth Management, International Wealth Management, GenSpring,
Business Owner Specialty Group, Sports and Entertainment Group, and Legal and
Medical Specialty Groups are marketing names used by SunTrust Bank now Truist
Bank, Truist Investment Services, Inc., and Truist Advisory Services, Inc.

Truist Securities is the trade name for the corporate and investment banking
services of Truist Financial Corporation and its subsidiaries, including Truist
Securities, Inc., member FINRALink opens a new window and SIPCLink opens a new
window.

New York City residents: Translation or other language access services may be
available.  When calling our office regarding collection activity, if you speak
a language other than English and need verbal translation services, be sure to
inform the representative. A description and translation of commonly-used debt
collection terms is available in multiple languages at www.nyc.gov/dca. 

Thank you for choosing SunTrust now Truist. We welcome the opportunity to serve
your financial needs. While SunTrust and BB&T have merged to become Truist, both
institutions will continue to offer independent product lines for a period of
time. This may include differing underwriting guidelines, product features,
terms, fees, and pricing.

Our friendly teammates at your local BB&T branches will be happy to walk you
through their products. You can also learn more by contacting them at
1-800-BANK-BBT or BBT.com.




×

Opens a new window





close modal