1

This question is related to another question made on StackOverflow.

The users ask about an unknown JavaScript file which is being loaded on his website. I managed to unroll a bit of the JavaScript file, which you can find here.

Is there any technique to approach this code? Or it has to be done totally manual? I'm very intrigued about what this script do...

I tried to debug as much I could, but this is probably the most complex obfuscation I have seen.

1
  • 2
    Try JSDetox and JSHint. Apr 24, 2014 at 7:15

1 Answer 1

1

You can try jsnice which always does a fantastic job.

'use strict';
/**
 * @param {!Object} value
 * @param {string} s
 * @param {string} name
 * @return {?}
 */
var f = function(value, s, name) {
  if (s = typeof value, "object" == s) {
    if (value) {
      if (value instanceof Array) {
        return "array";
      }
      if (value instanceof Object) {
        return s;
      }
      if (name = Object.prototype.toString.call(value), "[object Window]" == name) {
        return "object";
      }
      if ("[object Array]" == name || "number" == typeof value.length && "undefined" != typeof value.splice && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("splice")) {
        return "array";
      }
      if ("[object Function]" == name || "undefined" != typeof value.call && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("call")) {
        return "function";
      }
    } else {
      return "null";
    }
  } else {
    if ("function" == s && "undefined" == typeof value.call) {
      return "object";
    }
  }
  return s;
};
/**
 * @param {string} n
 * @param {string} v
 * @param {string} d
 * @param {!Object} a
 * @param {string} i
 * @return {undefined}
 */
var n = function(n, v, d, a, i) {
  d = n.split(".");
  a = g;
  if (!(d[0] in a || !a.execScript)) {
    a.execScript("var " + d[0]);
  }
  for (; d.length && (i = d.shift());) {
    if (d.length || v === k) {
      a = a[i] ? a[i] : a[i] = {};
    } else {
      /** @type {string} */
      a[i] = v;
    }
  }
};
/** @type {function(): number} */
var p = Date.now || function() {
  return +new Date;
};
/** @type {!RegExp} */
var r = /&/g;
/** @type {!RegExp} */
var t = /</g;
/** @type {!RegExp} */
var u = />/g;
/** @type {!RegExp} */
var w = /"/g;
/** @type {!RegExp} */
var x = /'/g;
var k = void 0;
/** @type {!global this} */
var g = this;
var z;
var A = "".oa ? "".ma() : "";
/** @type {function(number, string, string, number, number, number): undefined} */
var E = (/[&<>"']/.test(A) && (-1 != A.indexOf("&") && (A = A.replace(r, "&amp;")), -1 != A.indexOf("<") && (A = A.replace(t, "&lt;")), -1 != A.indexOf(">") && (A = A.replace(u, "&gt;")), -1 != A.indexOf('"') && (A = A.replace(w, "&quot;")), -1 != A.indexOf("'") && (A = A.replace(x, "&#39;"))), new function() {
  p();
}, function(val, orig, c, len, i, d) {
  try {
    if (this.j = 2048, this.c = [], B(this, this.b, 0), B(this, this.l, 0), B(this, this.p, 0), B(this, this.h, []), B(this, this.d, []), B(this, this.H, "object" == typeof window ? window : g), B(this, this.I, this), B(this, this.r, 0), B(this, this.F, 0), B(this, this.G, 0), B(this, this.f, C(4)), B(this, this.o, []), B(this, this.k, {}), this.q = true, val && "," == val[0]) {
      /** @type {number} */
      this.m = val;
    } else {
      if (window.atob) {
        c = window.atob(val);
        /** @type {!Array} */
        val = [];
        /** @type {number} */
        i = len = 0;
        for (; i < c.length; i++) {
          d = c.charCodeAt(i);
          for (; 255 < d;) {
            /** @type {number} */
            val[len++] = d & 255;
            /** @type {number} */
            d = d >> 8;
          }
          /** @type {number} */
          val[len++] = d;
        }
        /** @type {number} */
        orig = val;
      } else {
        /** @type {null} */
        orig = null;
      }
      if ((this.e = orig) && this.e.length) {
        /** @type {!Array} */
        this.K = [];
        this.s();
      } else {
        this.g(this.U);
      }
    }
  } catch (item) {
    D(this, item);
  }
});
/** @type {function(!Object, !Function, !NodeList, number, !NodeList, number): undefined} */
var G = (E.prototype.g = function(e, d, s, index) {
  index = this.a(this.l);
  /** @type {!Array} */
  e = [e, index >> 8 & 255, index & 255];
  if (s != k) {
    e.push(s);
  }
  if (0 == this.a(this.h).length) {
    this.c[this.h] = k;
    B(this, this.h, e);
  }
  /** @type {string} */
  s = "";
  if (d) {
    if (d.message) {
      /** @type {string} */
      s = s + d.message;
    }
    if (d.stack) {
      /** @type {string} */
      s = s + (":" + d.stack);
    }
  }
  if (3 < this.j) {
    /** @type {string} */
    s = s.slice(0, this.j - 3);
    this.j -= s.length + 3;
    s = F(s);
    G(this, this.f, H(s.length, 2).concat(s), this.$);
  }
}, function(data, type, b, len, c, p) {
  c = data.a(type);
  /** @type {!Function} */
  type = type == data.f ? function(b, j, x, d) {
    if (j = c.length, x = j - 4 >> 3, c.ba != x) {
      /** @type {number} */
      c.ba = x;
      /** @type {number} */
      x = (x << 3) - 4;
      /** @type {!Array} */
      d = [0, 0, 0, data.a(data.G)];
      try {
        c.aa = I(J(c, x), J(c, x + 4), d);
      } catch (s) {
        throw s;
      }
    }
    c.push(c.aa[j & 7] ^ b);
  } : function(block) {
    c.push(block);
  };
  if (len) {
    type(len & 255);
  }
  len = b.length;
  /** @type {number} */
  p = 0;
  for (; p < len; p++) {
    type(b[p]);
  }
});
/**
 * @param {!Array} value
 * @param {string} b
 * @param {!Function} x
 * @param {!Function} v
 * @param {!Object} self
 * @param {string} root
 * @param {string} string
 * @param {!Array} n
 * @param {string} fn
 * @return {?}
 */
var K = function(value, b, x, v, self, root, string, n, fn) {
  return x = function(o, a, f) {
    o = v[self.D];
    /** @type {boolean} */
    a = o === b;
    o = o && o[self.D];
    /** @type {number} */
    f = 0;
    for (; o && o != root && o != string && o != n && o != fn && 20 > f;) {
      f++;
      o = o[self.D];
    }
    return x[self.ga + a + !(!o + (f >> 2))];
  }, v = function() {
    return x();
  }, self = E.prototype, root = self.s, string = self.Q, fn = self.g, n = E, v[self.J] = self, x[self.fa] = value, value = k, v;
};
/**
 * @param {!Object} data
 * @param {string} key
 * @param {!Array} options
 * @return {?}
 */
var L = function(data, key, options) {
  if (key = data.a(data.b), !(key in data.e)) {
    throw data.g(data.Y), data.u;
  }
  return data.t == k && (data.t = J(data.e, key - 4), data.B = k), data.B != key >> 3 && (data.B = key >> 3, options = [0, 0, 0, data.a(data.p)], data.Z = I(data.t, data.B, options)), B(data, data.b, key + 1), data.e[key] ^ data.Z[key % 8];
};
/**
 * @param {string} a
 * @param {!Object} b
 * @param {number} i
 * @param {number} n
 * @param {number} c
 * @return {?}
 */
var F = function(a, b, i, n, c) {
  a = a.replace(/\\r\\n/g, "\\n");
  /** @type {!Array} */
  b = [];
  /** @type {number} */
  n = i = 0;
  for (; n < a.length; n++) {
    c = a.charCodeAt(n);
    if (128 > c) {
      /** @type {number} */
      b[i++] = c;
    } else {
      if (2048 > c) {
        /** @type {number} */
        b[i++] = c >> 6 | 192;
      } else {
        /** @type {number} */
        b[i++] = c >> 12 | 224;
        /** @type {number} */
        b[i++] = c >> 6 & 63 | 128;
      }
      /** @type {number} */
      b[i++] = c & 63 | 128;
    }
  }
  return b;
};
/**
 * @param {!Object} a
 * @param {!Function} b
 * @param {?} c
 * @return {undefined}
 */
var B = function(a, b, c) {
  if (b == a.b || b == a.l) {
    if (a.c[b]) {
      a.c[b].V(c);
    } else {
      a.c[b] = M(c);
    }
  } else {
    if (b != a.d && b != a.f && b != a.h || !a.c[b]) {
      a.c[b] = K(c, a.a);
    }
  }
  if (b == a.p) {
    a.t = k;
    B(a, a.b, a.a(a.b) + 4);
  }
};
/**
 * @param {number} b
 * @param {number} c
 * @param {!Array} d
 * @param {number} a
 * @return {?}
 */
var I = function(b, c, d, a) {
  try {
    /** @type {number} */
    a = 0;
    for (; 76138654016 != a;) {
      b = b + ((c << 4 ^ c >>> 5) + c ^ a + d[a & 3]);
      /** @type {number} */
      a = a + 2379332938;
      c = c + ((b << 4 ^ b >>> 5) + b ^ a + d[a >>> 11 & 3]);
    }
    return [b >>> 24, b >> 16 & 255, b >> 8 & 255, b & 255, c >>> 24, c >> 16 & 255, c >> 8 & 255, c & 255];
  } catch (e) {
    throw e;
  }
};
/**
 * @param {!Object} item
 * @param {!Object} val
 * @return {?}
 */
var N = function(item, val) {
  return val <= item.ca ? val == item.h || val == item.d || val == item.f || val == item.o ? item.n : val == item.P || val == item.H || val == item.I || val == item.k ? item.v : val == item.w ? item.i : 4 : [1, 2, 4, item.n, item.v, item.i][val % item.da];
};
/** @type {function(!Object, !Object, number, !Function): ?} */
var O = (E.prototype.la = function(results, expr) {
  expr.push(results[0] << 24 | results[1] << 16 | results[2] << 8 | results[3]);
  expr.push(results[4] << 24 | results[5] << 16 | results[6] << 8 | results[7]);
  expr.push(results[8] << 24 | results[9] << 16 | results[10] << 8 | results[11]);
}, function(d, options, canCreateDiscussions, data) {
  options = {};
  options.N = d.a(L(d));
  options.O = L(d);
  /** @type {number} */
  canCreateDiscussions = L(d) - 1;
  data = L(d);
  options.self = d.a(data);
  /** @type {!Array} */
  options.C = [];
  for (; canCreateDiscussions--;) {
    data = L(d);
    options.C.push(d.a(data));
  }
  return options;
});
/** @type {function(!Object, ?, number, ?): ?} */
var Q = (E.prototype.ja = function(b, a, field, value) {
  if (3 == b.length) {
    /** @type {number} */
    field = 0;
    for (; 3 > field; field++) {
      a[field] += b[field];
    }
    /** @type {!Array} */
    value = [13, 8, 13, 12, 16, 5, 3, 10, 15];
    /** @type {number} */
    field = 0;
    for (; 9 > field; field++) {
      a[3](a, field % 3, value[field]);
    }
  }
}, function(d, e, i, canCreateDiscussions) {
  return i = d.a(d.b), d.e && i < d.e.length ? (B(d, d.b, d.e.length), P(d, e)) : B(d, d.b, e), canCreateDiscussions = d.s(), B(d, d.b, i), canCreateDiscussions;
});
/** @type {function(number, number, !Array, number): ?} */
var H = (E.prototype.ka = function(b, sort, aVal, bVal) {
  bVal = b[(sort + 2) % 3];
  /** @type {number} */
  b[sort] = b[sort] - b[(sort + 1) % 3] - bVal ^ (1 == sort ? bVal << aVal : bVal >>> aVal);
}, function(bitmask, k, options, n) {
  /** @type {number} */
  n = k - 1;
  /** @type {!Array} */
  options = [];
  for (; 0 <= n; n--) {
    /** @type {number} */
    options[k - 1 - n] = bitmask >> 8 * n & 255;
  }
  return options;
});
/**
 * @param {!Array} b
 * @param {!Function} o
 * @param {!Function} s
 * @return {?}
 */
var M = function(b, o, s) {
  return o = function() {
    return s();
  }, o.V = function(instance) {
    /** @type {!Array} */
    b = instance;
  }, s = function() {
    return b;
  }, o;
};
/**
 * @param {!Object} a
 * @param {?} b
 * @param {?} X
 * @param {boolean} n
 * @return {?}
 */
var R = function(a, b, X, n) {
  return function() {
    if (!n || a.q) {
      return B(a, a.P, arguments), B(a, a.k, X), Q(a, b);
    }
  };
};
/** @type {function(!Object, ?): undefined} */
var P = (E.prototype.a = function(type, n) {
  if (n = this.c[type], n === k) {
    throw this.g(this.ea, 0, type), this.u;
  }
  return n();
}, function(o, e) {
  o.K.push(o.c.slice());
  o.c[o.b] = k;
  B(o, o.b, e);
});
/**
 * @param {!NodeList} a
 * @param {number} p
 * @return {?}
 */
var J = function(a, p) {
  return a[p] << 24 | a[p + 1] << 16 | a[p + 2] << 8 | a[p + 3];
};
/**
 * @param {number} name
 * @param {!Array} left
 * @return {?}
 */
var C = function(name, left) {
  /** @type {!Array} */
  left = Array(name);
  for (; name--;) {
    /** @type {number} */
    left[name] = 255 * Math.random() | 0;
  }
  return left;
};
/**
 * @param {!Object} a
 * @param {!Error} b
 * @return {undefined}
 */
var D = function(a, b) {
  /** @type {string} */
  a.m = ("E:" + b.message + ":" + b.stack).slice(0, 2048);
};
z = E.prototype;
/** @type {!Array} */
z.M = [function() {
}, function(x, a, y, value, p) {
  a = L(x);
  y = L(x);
  value = x.a(a);
  a = N(x, a);
  p = N(x, y);
  if (p == x.i || p == x.n) {
    /** @type {string} */
    value = "" + value;
  } else {
    if (0 < a) {
      if (1 == a) {
        /** @type {number} */
        value = value & 255;
      } else {
        if (2 == a) {
          /** @type {number} */
          value = value & 65535;
        } else {
          if (4 == a) {
            /** @type {number} */
            value = value & 4294967295;
          }
        }
      }
    }
  }
  B(x, y, value);
}, function(d, e, x, s, i, j, c, a, shotsGroup) {
  if (e = L(d), x = N(d, e), 0 < x) {
    /** @type {number} */
    s = 0;
    for (; x--;) {
      /** @type {number} */
      s = s << 8 | L(d);
    }
    B(d, e, s);
  } else {
    if (x != d.v) {
      if (s = L(d) << 8 | L(d), x == d.i) {
        if (x = "", d.c[d.w] != k) {
          i = d.a(d.w);
          for (; s--;) {
            j = i[L(d) << 8 | L(d)];
            /** @type {string} */
            x = x + j;
          }
        } else {
          /** @type {!Array} */
          x = Array(s);
          /** @type {number} */
          i = 0;
          for (; i < s; i++) {
            x[i] = L(d);
          }
          /** @type {string} */
          s = x;
          /** @type {!Array} */
          x = [];
          /** @type {number} */
          j = i = 0;
          for (; i < s.length;) {
            c = s[i++];
            if (128 > c) {
              /** @type {string} */
              x[j++] = String.fromCharCode(c);
            } else {
              if (191 < c && 224 > c) {
                a = s[i++];
                /** @type {string} */
                x[j++] = String.fromCharCode((c & 31) << 6 | a & 63);
              } else {
                a = s[i++];
                shotsGroup = s[i++];
                /** @type {string} */
                x[j++] = String.fromCharCode((c & 15) << 12 | (a & 63) << 6 | shotsGroup & 63);
              }
            }
          }
          /** @type {string} */
          x = x.join("");
        }
      } else {
        /** @type {!Array} */
        x = Array(s);
        /** @type {number} */
        i = 0;
        for (; i < s; i++) {
          x[i] = L(d);
        }
      }
      B(d, e, x);
    }
  }
}, function(message) {
  L(message);
}, function(args, message, msg, selector) {
  message = L(args);
  msg = L(args);
  selector = L(args);
  msg = args.a(msg);
  message = args.a(message);
  B(args, selector, message[msg]);
}, function(a, b, c) {
  b = L(a);
  c = L(a);
  b = a.a(b);
  B(a, c, f(b));
}, function(a, x, i, c, d) {
  x = L(a);
  i = L(a);
  c = N(a, x);
  d = N(a, i);
  if (i != a.h) {
    if (c == a.i && d == a.i) {
      if (a.c[i] == k) {
        B(a, i, "");
      }
      B(a, i, a.a(i) + a.a(x));
    } else {
      if (d == a.n) {
        if (0 > c) {
          x = a.a(x);
          if (c == a.i) {
            x = F("" + x);
          }
          if (!(i != a.d && i != a.f && i != a.o)) {
            G(a, i, H(x.length, 2));
          }
          G(a, i, x);
        } else {
          if (0 < c) {
            G(a, i, H(a.a(x), c));
          }
        }
      }
    }
  }
}, function(a$jscomp$32, b$jscomp$31, c$jscomp$23) {
  b$jscomp$31 = L(a$jscomp$32);
  c$jscomp$23 = L(a$jscomp$32);
  B(a$jscomp$32, c$jscomp$23, function(a$jscomp$33) {
    return eval(a$jscomp$33);
  }(a$jscomp$32.a(b$jscomp$31)));
}, function(a, link, c) {
  link = L(a);
  c = L(a);
  B(a, c, a.a(c) - a.a(link));
}, function(b, options) {
  options = O(b);
  B(b, options.O, options.N.apply(options.self, options.C));
}, function(x, s, y) {
  s = L(x);
  y = L(x);
  B(x, y, x.a(y) % x.a(s));
}, function(x, s, stdEvent, a, c) {
  s = L(x);
  stdEvent = x.a(L(x));
  a = x.a(L(x));
  c = x.a(L(x));
  x.a(s).addEventListener(stdEvent, R(x, a, c, true), false);
}, function(a, link, s, type) {
  link = L(a);
  s = L(a);
  type = L(a);
  a.a(link)[a.a(s)] = a.a(type);
}, function() {
}, function(x, s, a) {
  s = L(x);
  a = L(x);
  B(x, a, x.a(a) + x.a(s));
}, function(a, link, b) {
  link = L(a);
  b = L(a);
  if (0 != a.a(link)) {
    B(a, a.b, a.a(b));
  }
}, function(a, s, link, c) {
  s = L(a);
  link = L(a);
  c = L(a);
  if (a.a(s) == a.a(link)) {
    B(a, c, a.a(c) + 1);
  }
}, function(a, link, s, c) {
  link = L(a);
  s = L(a);
  c = L(a);
  if (a.a(link) > a.a(s)) {
    B(a, c, a.a(c) + 1);
  }
}, function(args, message, msg, selector) {
  message = L(args);
  msg = L(args);
  selector = L(args);
  B(args, selector, args.a(message) << msg);
}, function(a, link, s, c) {
  link = L(a);
  s = L(a);
  c = L(a);
  B(a, c, a.a(link) | a.a(s));
}, function(d, e) {
  e = d.a(L(d));
  P(d, e);
}, function(t, comments, title, i) {
  if (comments = t.K.pop()) {
    title = L(t);
    for (; 0 < title; title--) {
      i = L(t);
      comments[i] = t.c[i];
    }
    /** @type {string} */
    t.c = comments;
  } else {
    B(t, t.b, t.e.length);
  }
}, function(a, link, s, c) {
  link = L(a);
  s = L(a);
  c = L(a);
  B(a, c, (a.a(link) in a.a(s)) + 0);
}, function(x, y, a, T) {
  y = L(x);
  a = x.a(L(x));
  T = x.a(L(x));
  B(x, y, R(x, a, T));
}, function(a, link, c) {
  link = L(a);
  c = L(a);
  B(a, c, a.a(c) * a.a(link));
}, function(args, message, msg, selector) {
  message = L(args);
  msg = L(args);
  selector = L(args);
  B(args, selector, args.a(message) >> msg);
}, function(a, type, n, c) {
  type = L(a);
  n = L(a);
  c = L(a);
  B(a, c, a.a(type) || a.a(n));
}, function(a, options, args, fn_obj, dir) {
  options = O(a);
  args = options.C;
  fn_obj = options.self;
  dir = options.N;
  switch(args.length) {
    case 0:
      args = new fn_obj[dir];
      break;
    case 1:
      args = new fn_obj[dir](args[0]);
      break;
    case 2:
      args = new fn_obj[dir](args[0], args[1]);
      break;
    case 3:
      args = new fn_obj[dir](args[0], args[1], args[2]);
      break;
    case 4:
      args = new fn_obj[dir](args[0], args[1], args[2], args[3]);
      break;
    default:
      a.g(a.A);
      return;
  }
  B(a, options.O, args);
}, function(c, t, n, i, s, size) {
  if (t = L(c), n = L(c), i = L(c), s = L(c), t = c.a(t), n = c.a(n), i = c.a(i), c = c.a(s), "object" == f(t)) {
    for (size in s = [], t) {
      s.push(size);
    }
    /** @type {number} */
    t = s;
  }
  size = t.length;
  /** @type {number} */
  s = 0;
  for (; s < size; s = s + i) {
    n(t.slice(s, s + i), c);
  }
}];
/** @type {number} */
z.b = 0;
/** @type {number} */
z.p = 1;
/** @type {number} */
z.h = 2;
/** @type {number} */
z.l = 3;
/** @type {number} */
z.d = 4;
/** @type {number} */
z.w = 5;
/** @type {number} */
z.P = 6;
/** @type {number} */
z.L = 8;
/** @type {number} */
z.H = 9;
/** @type {number} */
z.I = 10;
/** @type {number} */
z.r = 11;
/** @type {number} */
z.F = 12;
/** @type {number} */
z.G = 13;
/** @type {number} */
z.f = 14;
/** @type {number} */
z.o = 15;
/** @type {number} */
z.k = 16;
/** @type {number} */
z.ca = 17;
/** @type {number} */
z.R = 253;
/** @type {number} */
z.$ = 254;
/** @type {number} */
z.S = 248;
/** @type {number} */
z.T = 216;
/** @type {number} */
z.da = 6;
/** @type {number} */
z.i = -1;
/** @type {number} */
z.n = -2;
/** @type {number} */
z.v = -3;
/** @type {number} */
z.U = 17;
/** @type {number} */
z.W = 21;
/** @type {number} */
z.A = 22;
/** @type {number} */
z.ea = 30;
/** @type {number} */
z.Y = 31;
/** @type {number} */
z.X = 33;
z.u = {};
/** @type {string} */
z.D = "caller";
/** @type {string} */
z.J = "toString";
/** @type {number} */
z.ga = 34;
/** @type {number} */
z.fa = 36;
E.prototype.ia = function(ref) {
  return (ref = window.performance) && ref.now ? function() {
    return ref.now() | 0;
  } : function() {
    return +new Date;
  };
}();
/**
 * @param {number} target
 * @param {number} pos
 * @param {number} len
 * @param {number} value
 * @param {number} i
 * @param {number} b
 * @param {!Array} m
 * @param {number} e
 * @param {string} t
 * @param {string} x
 * @param {string} n
 * @return {?}
 */
E.prototype.Q = function(target, pos, len, value, i, b, m, e, t, x, n) {
  if (this.m) {
    return this.m;
  }
  try {
    if (this.q = false, pos = this.a(this.d).length, len = this.a(this.f).length, value = this.j, this.c[this.L] && Q(this, this.a(this.L)), i = this.a(this.h), 0 < i.length && G(this, this.d, H(i.length, 2).concat(i), this.R), b = this.a(this.F) & 255, b = b - (this.a(this.d).length + 4), m = this.a(this.f), 4 < m.length && (b = b - (m.length + 3)), 0 < b && G(this, this.d, H(b, 2).concat(C(b)), this.S), 4 < m.length && G(this, this.d, H(m.length, 2).concat(m), this.T), e = [241].concat(this.a(this.d)), 
    window.btoa ? (x = window.btoa(String.fromCharCode.apply(null, e)), t = x.replace(/\\+/g, "-").replace(/\\/ / g, "_").replace(/=/g, "")) : t = k, t) {
      /** @type {string} */
      t = "," + t;
    } else {
      /** @type {string} */
      t = "";
      /** @type {number} */
      i = 0;
      for (; i < e.length; i++) {
        n = e[i][this.J](16);
        if (1 == n.length) {
          /** @type {string} */
          n = "0" + n;
        }
        /** @type {string} */
        t = t + n;
      }
    }
    /** @type {number} */
    this.a(this.d).length = pos;
    /** @type {number} */
    this.a(this.f).length = len;
    /** @type {number} */
    this.j = value;
    /** @type {boolean} */
    this.q = true;
    /** @type {string} */
    target = t;
  } catch (item) {
    D(this, item);
    target = this.m;
  }
  return target;
};
/**
 * @param {number} y
 * @param {number} r
 * @param {undefined} n
 * @param {number} len
 * @param {string} msg
 * @param {!Function} selector
 * @return {?}
 */
E.prototype.s = function(y, r, n, len, msg, selector) {
  try {
    y = this.e.length;
    /** @type {number} */
    r = 2001;
    n = k;
    /** @type {number} */
    len = 0;
    for (; --r && (len = this.a(this.b)) < y;) {
      try {
        B(this, this.l, len);
        /** @type {number} */
        msg = L(this) % this.M.length;
        if (n = this.M[msg]) {
          n(this);
        } else {
          this.g(this.W, 0, msg);
        }
      } catch (b) {
        if (b != this.u) {
          if (selector = this.a(this.r)) {
            B(this, selector, b);
            B(this, this.r, 0);
          } else {
            this.g(this.A, b);
          }
        }
      }
    }
    if (!r) {
      this.g(this.X);
    }
  } catch (b) {
    try {
      this.g(this.A, b);
    } catch (item) {
      D(this, item);
    }
  }
  return this.a(this.k);
};
/**
 * @param {?} callback
 * @param {?} error
 * @return {?}
 */
E.prototype.ha = function(callback, error) {
  return error = this.Q(), callback && callback(error), error;
};
try {
  window.addEventListener("unload", function() {
  }, false);
} catch (S) {
}
n("thintinel.th", E);
n("thintinel.th.prototype.exec", E.prototype.ha);

Or you can use an open source unuglify.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.