| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 | /*! JSFuck 0.5.0 - http://jsfuck.com */(function(self){  const MIN = 32, MAX = 126;  const SIMPLE = {    'false':      '![]',    'true':       '!![]',    'undefined':  '[][[]]',    'NaN':        '+[![]]',    'Infinity':   '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' // +"1e1000"  };  const CONSTRUCTORS = {    'Array':    '[]',    'Number':   '(+[])',    'String':   '([]+[])',    'Boolean':  '(![])',    'Function': '[]["flat"]',    'RegExp':   'Function("return/"+false+"/")()',    'Object':	'[]["entries"]()'  };  const MAPPING = {    'a':   '(false+"")[1]',    'b':   '([]["entries"]()+"")[2]',    'c':   '([]["flat"]+"")[3]',    'd':   '(undefined+"")[2]',    'e':   '(true+"")[3]',    'f':   '(false+"")[0]',    'g':   '(false+[0]+String)[20]',    'h':   '(+(101))["to"+String["name"]](21)[1]',    'i':   '([false]+undefined)[10]',    'j':   '([]["entries"]()+"")[3]',    'k':   '(+(20))["to"+String["name"]](21)',    'l':   '(false+"")[2]',    'm':   '(Number+"")[11]',    'n':   '(undefined+"")[1]',    'o':   '(true+[]["flat"])[10]',    'p':   '(+(211))["to"+String["name"]](31)[1]',    'q':   '("")["fontcolor"]([0]+false+")[20]',    'r':   '(true+"")[1]',    's':   '(false+"")[3]',    't':   '(true+"")[0]',    'u':   '(undefined+"")[0]',    'v':   '(+(31))["to"+String["name"]](32)',    'w':   '(+(32))["to"+String["name"]](33)',    'x':   '(+(101))["to"+String["name"]](34)[1]',    'y':   '(NaN+[Infinity])[10]',    'z':   '(+(35))["to"+String["name"]](36)',    'A':   '(NaN+[]["entries"]())[11]',    'B':   '(+[]+Boolean)[10]',    'C':   'Function("return escape")()(("")["italics"]())[2]',    'D':   'Function("return escape")()([]["flat"])["slice"]("-1")',    'E':   '(RegExp+"")[12]',    'F':   '(+[]+Function)[10]',    'G':   '(false+Function("return Date")()())[30]',    'H':   null,    'I':   '(Infinity+"")[0]',    'J':   null,    'K':   null,    'L':   null,    'M':   '(true+Function("return Date")()())[30]',    'N':   '(NaN+"")[0]',    'O':   '(+[]+Object)[10]',    'P':   null,    'Q':   null,    'R':   '(+[]+RegExp)[10]',    'S':   '(+[]+String)[10]',    'T':   '(NaN+Function("return Date")()())[30]',    'U':   '(NaN+Object()["to"+String["name"]]["call"]())[11]',    'V':   null,    'W':   null,    'X':   null,    'Y':   null,    'Z':   null,    ' ':   '(NaN+[]["flat"])[11]',    '!':   null,    '"':   '("")["fontcolor"]()[12]',    '#':   null,    '$':   null,    '%':   'Function("return escape")()([]["flat"])[21]',    '&':   '("")["fontcolor"](")[13]',    '\'':  null,    '(':   '([]["flat"]+"")[13]',    ')':   '([0]+false+[]["flat"])[20]',    '*':   null,    '+':   '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]',    ',':   '[[]]["concat"]([[]])+""',    '-':   '(+(.+[0000001])+"")[2]',    '.':   '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]',    '/':   '(false+[0])["italics"]()[10]',    ':':   '(RegExp()+"")[3]',    ';':   '("")["fontcolor"](NaN+")[21]',    '<':   '("")["italics"]()[0]',    '=':   '("")["fontcolor"]()[11]',    '>':   '("")["italics"]()[2]',    '?':   '(RegExp()+"")[2]',    '@':   null,    '[':   '([]["entries"]()+"")[0]',    '\\':  '(RegExp("/")+"")[1]',    ']':   '([]["entries"]()+"")[22]',    '^':   null,    '_':   null,    '`':   null,    '{':   '(true+[]["flat"])[20]',    '|':   null,    '}':   '([]["flat"]+"")["slice"]("-1")',    '~':   null  };  const GLOBAL = 'Function("return this")()';  function fillMissingDigits(){    var output, number, i;    for (number = 0; number < 10; number++){      output = "+[]";      if (number > 0){ output = "+!" + output; }      for (i = 1; i < number; i++){ output = "+!+[]" + output; }      if (number > 1){ output = output.substr(1); }      MAPPING[number] = "[" + output + "]";    }  }  function replaceMap(){    var character = "", value, i, key;    function replace(pattern, replacement){      value = value.replace(        new RegExp(pattern, "gi"),        replacement      );    }    function digitReplacer(_,x) { return MAPPING[x]; }    function numberReplacer(_,y) {      var values = y.split("");      var head = +(values.shift());      var output = "+[]";      if (head > 0){ output = "+!" + output; }      for (i = 1; i < head; i++){ output = "+!+[]" + output; }      if (head > 1){ output = output.substr(1); }      return [output].concat(values).join("+").replace(/(\d)/g, digitReplacer);    }    for (i = MIN; i <= MAX; i++){      character = String.fromCharCode(i);      value = MAPPING[character];      if(!value) {continue;}      for (key in CONSTRUCTORS){        replace("\\b" + key, CONSTRUCTORS[key] + '["constructor"]');      }      for (key in SIMPLE){        replace(key, SIMPLE[key]);      }      replace('(\\d\\d+)', numberReplacer);      replace('\\((\\d)\\)', digitReplacer);      replace('\\[(\\d)\\]', digitReplacer);      replace("GLOBAL", GLOBAL);      replace('\\+""', "+[]");      replace('""', "[]+[]");      MAPPING[character] = value;    }  }  function replaceStrings(){    var regEx = /[^\[\]\(\)\!\+]{1}/g,      all, value, missing,      count = MAX - MIN;    function findMissing(){      var all, value, done = false;      missing = {};      for (all in MAPPING){        value = MAPPING[all];        if (value && value.match(regEx)){          missing[all] = value;          done = true;        }      }      return done;    }    function mappingReplacer(a, b) {      return b.split("").join("+");    }    function valueReplacer(c) {      return missing[c] ? c : MAPPING[c];    }    for (all in MAPPING){      if (MAPPING[all]){        MAPPING[all] = MAPPING[all].replace(/\"([^\"]+)\"/gi, mappingReplacer);      }    }    while (findMissing()){      for (all in missing){        value = MAPPING[all];        value = value.replace(regEx, valueReplacer);        MAPPING[all] = value;        missing[all] = value;      }      if (count-- === 0){        console.error("Could not compile the following chars:", missing);      }    }  }  function escapeSequence(c) {    var cc = c.charCodeAt(0);    if (cc < 256) {      return '\\' + cc.toString(8);    } else {      var cc16 = cc.toString(16);      return '\\u' + ('0000' + cc16).substring(cc16.length);      }  }  function escapeSequenceForReplace(c) {    return escapeSequence(c).replace('\\', 't');  }  function encode(input, wrapWithEval, runInParentScope){    var output = [];    if (!input){      return "";    }    var unmappped = ''    for(var k in MAPPING) {      if (MAPPING[k]){        unmappped += k;      }    }    unmappped = unmappped.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');    unmappped = new RegExp('[^' + unmappped + ']','g');    var unmappedCharactersCount = (input.match(unmappped) || []).length;    if (unmappedCharactersCount > 1) {      // Without this optimization one unmapped caracter has encoded length      // of about 3600 characters. Every additional unmapped character adds       // 2000 to the total length. For example, the lenght of `~` is 3605,       // `~~` is 5600, and `~~~` is 7595.      //       // The loader with replace has encoded length of about 5300 characters      // and every additional character adds 100 to the total length.       // In the same example the length of `~~` becomes 5371 and `~~~` -- 5463.      //       // So, when we have more than one unmapped character we want to encode whole input      // except select characters (that have encoded length less than about 70)      // into an escape sequence.      //      // NOTE: `t` should be escaped!      input = input.replace(/[^0123456789.adefilnrsuN]/g, escapeSequenceForReplace);    } else if (unmappedCharactersCount > 0) {      //Because we will wrap the input into a string we need to escape Backslash       // and Double quote characters (we do not need to worry about other characters       // because they are not mapped explicitly).      // The JSFuck-encoded representation of `\` is 2121 symbols,      // so esacped `\` is 4243 symbols and escaped `"` is 2261 symbols      // however the escape sequence of that characters are       // 2168 and 2155 symbols respectively, so it's more practical to       // rewrite them as escape sequences.      input = input.replace(/["\\]/g, escapeSequence);      //Convert all unmapped characters to escape sequence      input = input.replace(unmappped, escapeSequence);    }    var r = "";    for (var i in SIMPLE) {      r += i + "|";    }    r+= ".";    input.replace(new RegExp(r, 'g'), function(c) {      var replacement = SIMPLE[c];      if (replacement) {        output.push("(" + replacement + "+[])");      } else {        replacement = MAPPING[c];        if (replacement){          output.push(replacement);        } else {          throw new Error('Found unmapped character: ' + c);        }      }    });    output = output.join("+");    if (/^\d$/.test(input)){      output += "+[]";    }    if (unmappedCharactersCount > 1) {      // replace `t` with `\\`      output = "(" + output + ")[" + encode("split") + "](" + encode ("t") + ")[" + encode("join") +"](" + encode("\\") + ")";    }    if (unmappedCharactersCount > 0) {      output = "[][" + encode("flat") + "]"+      "[" + encode("constructor") + "]" +      "(" + encode("return\"") + "+" + output + "+" + encode("\"") + ")()";    }    if (wrapWithEval){      if (runInParentScope){        output = "[][" + encode("flat") + "]" +          "[" + encode("constructor") + "]" +          "(" + encode("return eval") + ")()" +          "(" + output + ")";      } else {        output = "[][" + encode("flat") + "]" +          "[" + encode("constructor") + "]" +          "(" + output + ")()";      }    }    return output;  }  fillMissingDigits();  replaceMap();  replaceStrings();  self.JSFuck = {    encode: encode  };})(typeof(exports) === "undefined" ? window : exports);
 |