Giter VIP home page Giter VIP logo

js-confuser's People

Contributors

michaelxf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

js-confuser's Issues

Dispatcher only applies to the top level of the code

Describe the bug:

Dispatcher should recursively apply to every scope of the code.

Config and Small code sample

Config:

{
  target: "node",
  dispatcher: true,
  compact: false,
}

Code:

function OUTER(){
  function INNER(){
    return 100;
  }
  return INNER();
}

console.log(OUTER());

Expected behavior

Obfuscate the INNER function.

Actual behavior

The INNER function was never obfuscated.

Additional context

var __p_1982331520 = Object.create(null);
var $jsc_d0_payload = [];
console["log"](
  new __p_3269620441_dispatcher_0("dCFVru", "PxkGxg", "I4oY_3").MSq66Q
);
function __p_3269620441_dispatcher_0(
  __p_5135106733,
  __p_4768529421,
  __p_3345282446
) {
  var __p_0667312621 = {
    dCFVru: function () {
      function INNER() { // <- INNER was never obfuscated
        return 100;
      }
      return INNER();
    },
  };
  var z3lXmbn;
  if (__p_4768529421 == "PxkGxg") {
    $jsc_d0_payload = [];
  }
  if (__p_4768529421 == "IRK3x4") {
    z3lXmbn =
      __p_1982331520[__p_5135106733] ||
      (__p_1982331520[__p_5135106733] = function (...__p_7966752171) {
        $jsc_d0_payload = __p_7966752171;
        return __p_0667312621[__p_5135106733].call(this, "Hujjep");
      });
  } else {
    z3lXmbn = __p_0667312621[__p_5135106733]("XpIQpf3");
  }
  if (__p_3345282446 == "I4oY_3") {
    return { MSq66Q: z3lXmbn };
  } else {
    return z3lXmbn;
  }
}

Name Recycling and String Compression breaks code

Describe the bug:

Name Recycling and String Compression breaks code

Config and Small code sample

Config:

{
  target: "node",
  nameRecycling: true,
  stringCompression: true,
  renameVariables: false,
}

Code:

console.log("Hello World");

Error

(node:17892) UnhandledPromiseRejectionWarning: ReferenceError: __p_8057609245 is not defined

TypeError

Describe the bug:

TypeError: Cannot read properties of null (reading 'type')

Config and Small code sample

Too Big

Code:

Too big can't upload

Expected behavior

The Program should be obfuscated successfully

Actual behavior

Not Obfusacting

ES5 fails on class fields

Describe the bug:

The es5 option errors when class fields are encountered

Config and Small code sample

Config:

{
  target: "node",
  es5: true,
}

Code:

class MyClass {
  myField = 1;
}

Error:

Node {
  type: 'PropertyDefinition',
  start: 23,
  end: 35,
  static: false,
  computed: false,
  key: Node { type: 'Identifier', start: 23, end: 30, name: 'myField' },
  value: Node { type: 'Literal', start: 33, end: 34, value: 1, raw: '1' }
}
(node:4288) UnhandledPromiseRejectionWarning: Error: Unsupported method definition

Name Recycling breaks import statement

Describe the bug:

Name Recycling breaks import statement

Config and Small code sample

Config:

{
  target: "node",
  nameRecycling: true,
}

Code:

import crypto from 'node:crypto'

var x = 1;

console.log(x);

Output:

import OuWqJ3u from "node:crypto";
OuWqJ3u = 1;
console["log"](OuWqJ3u);

Error:

OuWqJ3u = 1;
        ^

TypeError: Assignment to constant variable.

jsconfuser.com down

I think you need to renew it.(its OK if you dont want to, but wanted to let you know)

Object Extraction throws error "Cannot read property 'name' of undefined"

Describe the bug:

Object Extraction throws an error while encountering a spread element node

Config and Small code sample

Config:

{
  target: "node",
  objectExtraction: true
}

Code:

var x = { firstName: "John", lastName: "Doe" }
var y = { ...x };

console.log(y);

Error:

TypeError: Cannot read property 'name' of undefined

Shuffle transform in shift mode breaks program

Describe the bug:

shuffle transform will attempt to assign to arrays that are const

Config and Small code sample

Config:

{
    target: 'browser',
    shuffle: true,
    compact: false,
    minify: false,
}

Code:

const a=[1,2,3];

Expected behavior

it shouldn't try assigning to a const

Actual behavior

it assigns to a const

Additional context

if (varDeclarator.type == "VariableDeclarator") {
var varDec = parents[2];
if (varDec.type == "VariableDeclaration") {
var body = parents[3];
if (
varDec.declarations.length == 1 &&
Array.isArray(body) &&
varDeclarator.id.type === "Identifier" &&
varDeclarator.init === object
) {
inPlaceIndex = body.indexOf(varDec);
inPlaceBody = body;
inPlace = inPlaceIndex !== -1;
inPlaceName = varDeclarator.id.name;
}
}
}

${
inPlace ? `${inPlaceName} = ${name}` : name
} = ${name}.concat((function(){

Eval and Integrity break the program

Describe the bug:

When Integrity and Eval are enabled together, the obfuscated output leads to a reference error.

Config and Small code sample

Config:

{
  target: "node",
  compact: false,
  eval: true,
  lock: {
    integrity: true,
  },
}

Code:

console.log("Hello World")

Output:

var __p_2990862662 = eval('(function (x) {\n    return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, \'\');\n})');
var __p_3728583740 = eval('(function (str, seed) {\n    var h1 = 3735928559 ^ seed;\n    var h2 = 1103547991 ^ seed;\n    for (var i = 0, ch; i < str.length; i++) {\n        !(ch = str.charCodeAt(i), h1 = __p_9764543032(h1 ^ ch, 2654435761), h2 = __p_9764543032(h2 ^ ch, 1597334677));\n    }\n    void (h1 = __p_9764543032(h1 ^ h1 >>> 16, 2246822507) ^ __p_9764543032(h2 ^ h2 >>> 13, 3266489909), h2 = __p_9764543032(h2 ^ h2 >>> 16, 2246822507) ^ __p_9764543032(h1 ^ h1 >>> 13, 3266489909));\n    return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n})');
(function () {
    var __p_9764543032 = Math.imul || eval('(function (opA, opB) {\n    opB |= 0;\n    var result = (opA & 4194303) * opB;\n    if (opA & 4290772992)\n        result += (opA & 4290772992) * opB | 0;\n    return result | 0;\n})');
    function PvW0AzX() {
        console['log'](100);
    }
    var O4fIeB = __p_3728583740(__p_2990862662(PvW0AzX), 907);
    if (O4fIeB == 1092823693876754) {
        return PvW0AzX.apply(this, arguments);
    } else {
        process.exit();
    }
}());

The error:

ReferenceError: __p_9764543032 is not defined

TypeError: Cannot read properties of null (reading 'type')

Describe the bug:

I'm getting TypeError: Cannot read properties of null (reading 'type')

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

can't post it there, too big

Expected behavior

The program should execute the code correctly

Actual behavior

C:\Users\xxxxxxxxx\Downloads\xxxxxxxxxxxxxxxxxr\Priv\node_modules\js-confuser\dist\transforms\opaquePredicates.js:139
        if (test.type == "Literal") {
                 ^

TypeError: Cannot read properties of null (reading 'type')
    at C:\Users\xxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\transforms\opaquePredicates.js:139:18
    at C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\transforms\transform.js:144:42
    at Array.forEach (<anonymous>)
    at C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\transforms\transform.js:144:24
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:89:7)
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:65:13)
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:76:15)
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:76:15)
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:65:13)
    at walk (C:\Users\xxxxxxxxxxxxxx\Downloads\xxxxxxxxxxxxxx\Priv\node_modules\←[4mjs-confuser←[24m\dist\traverse.js:76:15)

BigInt literals are converted to normal numbers

Describe the bug:

BigInt literals (like 1n) are converted to normal numbers (1).

Config and Small code sample

Config:

{
    "compact": true,
    "hexadecimalNumbers": true,
    "identifierGenerator": "randomized",
    "minify": true,
    "shuffle": "false",
    "target": "browser"
}

Code:

console.log(1n);

Expected behavior

Compiles to console.log(1n)

Actual behavior

Compiles to console.log(1)

Dispatcher causes syntax error

Describe the bug:

Dispatcher breaks code that calls toString() and causes a syntax error

Config and Small code sample

Config:

{
  target: "node",
  dispatcher: true
}

Code:

function myFunction(){
    
}

console.log(toString());

Output:

var ZBMWuM = Object.create(null);
var hSR25k = [];
console['log'](new Uf6LgH(function toString() { [native code] }, 'bVTWgeH', 'dq4mH64').P9dYcG);
function Uf6LgH(Uf6LgH, L2edNvN, LyXMkF) {
    var quyW4n5 = {
        'YjEq1X': function () {
        }
    };
    var pCawCBp;
    if (L2edNvN == 'bVTWgeH') {
        hSR25k = [];
    }
    if (L2edNvN == 'McemI0C') {
        pCawCBp = ZBMWuM[Uf6LgH] || (ZBMWuM[Uf6LgH] = function (...iUqjNIT) {
            hSR25k = iUqjNIT;
            return quyW4n5[Uf6LgH].call(this, 'bEANo3');
        });
    } else {
        pCawCBp = quyW4n5[Uf6LgH]('ga3lyI');
    }
    if (LyXMkF == 'dq4mH64') {
        return { P9dYcG: pCawCBp };
    } else {
        return pCawCBp;
    }
}

Notice the function toString() { [native code] } This is most likely due to Dispatcher using a normal object as a dictionary to map old function names to new function names, which causes generic names like toString and hasOwnProperty to get mapped incorrectly.

invalid generated js for `(a ?? {}) && ""`

Describe the bug:

Compiles invalid JS

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

(a ?? {}) && ""

Expected behavior

Compiles to (a??{})&&''

Actual behavior

Compiles to a??{}&&'' which is invalid.

Rename Variables breaks import statement

Describe the bug:

Rename Variables breaks import statement

Config and Small code sample

Config:

{
  target: "node",
  renameVariables: true
}

Code:

import { createHash } from 'node:crypto'

function sha256(content) {  
  return createHash('sha256').update(content).digest('hex')
}

console.log(sha256("Hash this string"));

Output:

import { hry1E0 } from "node:crypto";
function rwArBvq(rwArBvq) {
  return hry1E0("sha256")["update"](rwArBvq)["digest"]("hex");
}
console["log"](rwArBvq("Hash this string"));

Error:

import { hry1E0 } from "crypto";
         ^^^^^^
SyntaxError: The requested module 'crypto' does not provide an export named 'hry1E0'

Catch parameter and lexically defined variable

Describe the bug:

Rename Variable fails in the following situation

Code:

try {

} catch (a){
    let b;
} 

Output:

try{}catch(I2W3L20){let I2W3L20}

Error:

(node:17661) UnhandledPromiseRejectionWarning: SyntaxError: Identifier 'I2W3L20' has already been declared

Flatten breaks code with pattern-based assignment expressions

Describe the bug:

Flatten breaks working code when pattern-based assignment expressions are involved.

Config and Small code sample

Config:

{
  target: "node",
  flatten: true,
  compact: false
}

Code:

var i = 0;

function change() {
  [([i] = [1])];
}
  
change();
console.log(i);

Expected behavior

The program should output 1

Actual behavior

The program outputs 0

Rename Variables breaks code with var & let in same scope

Describe the bug:

Rename Variables breaks code with var & let in same scope

Config and Small code sample

Config:

{
  target: "node",
  renameVariables: true
}

Code:

function log(param) {
  let message = param;
  var isWarning = false;
  var isError = false;

  console.log(message);
};

Output:

function X5pMbM4(X5pMbM4) {
    let wCSLkl = X5pMbM4;
    var mBglfYB = false;
    var wCSLkl = false;
    console['log'](wCSLkl);
};
// Uncaught SyntaxError: Identifier 'wCSLkl' has already been declared

shuffle != hash is re-using variable x and crashing

Describe the bug:

One of the shuffle variants (for shuffle != hash) is re-using the variables x, z and i.
If they are present before (very likely), it'll compile to invalid JS code.

Config and Small code sample

Code:

let x = -999;
let a = [1, 2, 3, 4, 5, 6];

Expected behavior

Should run.

Actual behavior

Uncaught SyntaxError: Identifier 'x' has already been declared when running.

let x = -999;
let a = [
    2,
    3,
    4,
    5,
    6,
    1
];
var __p_6792745382 = a;
for (var x = 16; x % 4 === 0; x++) {
    var z = 0;
    a = __p_6792745382 = __p_6792745382.concat(function () {
        z++;
        if (z === 1) {
            return [];
        }
        for (var i = 20; i; i--) {
            __p_6792745382.unshift(__p_6792745382.pop());
        }
        return [];
    }());
}
for (var __p_4040364912 = 13; __p_4040364912; __p_4040364912--) {
    __p_6792745382.unshift(__p_6792745382.pop());
}

String concealing bug

Code:

var code = 'var TEST_STRING = `Hello World`;console.log(TEST_STRING);';
var output = await JsConfuser(code, {
        target: "browser",
        stringCompression: true,
        stringEncoding: true,
        stringSplitting: true,
        stringConcealing: true,

    });
expect(output).not.toContain("Hello World");

Actual behavior

Error: expect(received).not.toContain(expected) // indexOf
Expected substring: not "Hello World"

RGF breaks countermeasures function and causes error

Describe the bug:

You can't have a countermeasures function and RGF enabled at the same time.

Config and Small code sample

Config:

{
  target: "node",
  rgf: true,
  lock: {
    countermeasures: "myCountermeasuresFunction",
  },
}

Code:

function myCountermeasuresFunction() {
  console.log("The countermeasures function was called!");
}

Output

(node:21475) UnhandledPromiseRejectionWarning: Error: Countermeasures function named 'myCountermeasuresFunction' was not found.

Defining the same variable multiple times

Describe the bug:

Defining the same variable multiple times (has already been declared)

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

can't post it there, too big

Expected behavior

The program should execute the code correctly

Actual behavior

The program simply return an error, "SyntaxError: Identifier 'xxxxxxxx$xxxxxxxx' has already been declared"

Minify causes syntax error

Describe the bug:

Minify causes syntax error

Config and Small code sample

Config:

{
  target: "node",
  minify: true
}

Code:

var myObject = {
  "`": true,
  "^": true,
  "]": true,
  "[": true
}

Output:

var myObject = {
    `: !0,
    ^: !0,
    ]: !0,
    [: !0
};

export function isValidIdentifier(name: string): boolean {
if (typeof name !== "string") {
return false;
}
if (name.includes(".") || name.includes(" ")) {
return false;
}
var x = name.match(/^[A-z$_][A-z0-9$_]*/);
return x && x[0] == name;
}

The regex includes char codes 65 to 122 which is incorrect. It should use A-Za-z instead.

String Concealing breaks class constructor

Describe the bug:

String Concealing breaks class constructor

Config and Small code sample

Config:

{
  target: "node",
  stringConcealing: true
}

Code:

class MyClass1 {}
class MyClass2 extends MyClass1 {
  constructor(){
    super();
    this["string1"] = true;
    this["string2"] = true;
    this["string3"] = true;
  }
}

var instance = new MyClass2();

Error:

(node:16224) UnhandledPromiseRejectionWarning: ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

Variable renaming breaks on default parameters

Describe the bug:

Variable renaming breaks working code when default parameters are involved and the identifier generator is set to 'mangled'

Config and Small code sample

Config:

{
  compact: false,
  target: "node",
  renameVariables: true,
  identifierGenerator: "mangled",
}

Code:

function FuncA(param1, param2 = FuncB){
  param2()
}

function FuncB(){
  console.log("Success!");
}

FuncA();

Expected behavior

The program should output "Success!"

Actual behavior

ReferenceError: Cannot access 'b' before initialization

invalid typings for options

Type defs:

js-confuser/src/options.ts

Lines 456 to 605 in 64a5f6a

lock?: {
/**
* ### `lock.selfDefending`
*
* Prevents the use of code beautifiers or formatters against your code.
*
* [Identical to Obfuscator.io's Self Defending](https://github.com/javascript-obfuscator/javascript-obfuscator#selfdefending)
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
selfDefending?: boolean;
/**
* ### `lock.antiDebug`
*
* Adds `debugger` statements throughout the code. Additionally adds a background function for DevTools detection. (`true/false/0-1`)
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
antiDebug?: ProbabilityMap<boolean>;
/**
* ### `lock.context`
*
* Properties that must be present on the `window` object (or `global` for NodeJS). (`string[]`)
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
context?: string[];
/**
* ### `lock.nativeFunctions`
*
* Set of global functions that are native. Such as `require`, `fetch`. If these variables are modified the program crashes.
* Set to `true` to use the default set of native functions. (`string[]/true/false`)
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
nativeFunctions?: string[] | Set<string> | boolean;
/**
* ### `lock.startDate`
*
* When the program is first able to be used. (`number` or `Date`)
*
* Number should be in milliseconds.
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
startDate?: number | Date | false;
/**
* ### `lock.endDate`
*
* When the program is no longer able to be used. (`number` or `Date`)
*
* Number should be in milliseconds.
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
endDate?: number | Date | false;
/**
* ### `lock.domainLock`
* Array of regex strings that the `window.location.href` must follow. (`Regex[]` or `string[]`)
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
domainLock?: RegExp[] | string[] | false;
/**
* ### `lock.osLock`
* Array of operating-systems where the script is allowed to run. (`string[]`)
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* Allowed values: `"linux"`, `"windows"`, `"osx"`, `"android"`, `"ios"`
*
* Example: `["linux", "windows"]`
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
osLock?: ("linux" | "windows" | "osx" | "android" | "ios")[] | false;
/**
* ### `lock.browserLock`
* Array of browsers where the script is allowed to run. (`string[]`)
*
* - Potency Low
* - Resilience Medium
* - Cost Medium
*
* Allowed values: `"firefox"`, `"chrome"`, `"iexplorer"`, `"edge"`, `"safari"`, `"opera"`
*
* Example: `["firefox", "chrome"]`
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
browserLock?:
| ("firefox" | "chrome" | "iexplorer" | "edge" | "safari" | "opera")[]
| false;
/**
* ### `lock.integrity`
*
* Integrity ensures the source code is unchanged. (`true/false/0-1`)
*
* [Learn more here](https://github.com/MichaelXF/js-confuser/blob/master/Integrity.md).
*
* - Potency Medium
* - Resilience High
* - Cost High
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
integrity?: ProbabilityMap<boolean>;
/**
* ### `lock.countermeasures`
*
* A custom callback function to invoke when a lock is triggered. (`string/false`)
*
* This could be due to an invalid domain, incorrect time, or code's integrity changed.
*
* [Learn more about the rules of your countermeasures function](https://github.com/MichaelXF/js-confuser/blob/master/Countermeasures.md).
*
* Otherwise, the obfuscator falls back to crashing the process.
*
* [See all settings here](https://github.com/MichaelXF/js-confuser/blob/master/README.md#options)
*/
countermeasures?: string | boolean;
};

Assertion stmts:

js-confuser/src/options.ts

Lines 772 to 823 in 64a5f6a

// Validate browser-lock option
if (typeof options.lock.browserLock !== "undefined") {
ok(
Array.isArray(options.lock.browserLock),
"browserLock must be an array"
);
ok(
!options.lock.browserLock.find(
(browserName) => !validBrowsers.has(browserName)
),
'Invalid browser name. Allowed: "firefox", "chrome", "iexplorer", "edge", "safari", "opera"'
);
}
// Validate os-lock option
if (typeof options.lock.osLock !== "undefined") {
ok(Array.isArray(options.lock.osLock), "osLock must be an array");
ok(
!options.lock.osLock.find((osName) => !validOses.has(osName)),
'Invalid OS name. Allowed: "windows", "linux", "osx", "ios", "android"'
);
}
// Validate domain-lock option
if (typeof options.lock.domainLock !== "undefined") {
ok(Array.isArray(options.lock.domainLock), "domainLock must be an array");
}
// Validate context option
if (typeof options.lock.context !== "undefined") {
ok(Array.isArray(options.lock.context), "context must be an array");
}
// Validate start-date option
if (
typeof options.lock.startDate !== "undefined" &&
options.lock.startDate
) {
ok(
typeof options.lock.startDate === "number" ||
options.lock.startDate instanceof Date,
"startDate must be Date object or number"
);
}
// Validate end-date option
if (typeof options.lock.endDate !== "undefined" && options.lock.endDate) {
ok(
typeof options.lock.endDate === "number" ||
options.lock.endDate instanceof Date,
"endDate must be Date object or number"
);
}
}

booleans (or false) are specified as valid values for some of the keys in the typedefs however there are assertion statements that will error out when it doesn't receive anything other than an array.

Object Extraction breaks objects with getter/setter methods

Describe the bug:

Object Extraction breaks the program containing objects with a getter/setter method.

Config and Small code sample

Config:

{
  target: "node",
  objectExtraction: true
}

Code:

var myObject = {
  get key(){
    return 10;
  }
}

console.log(myObject.key); // 10

Expected behavior

The program should output "10"

Actual behavior

var myObject_key = function () {
  return 10;
};
console["log"](myObject_key); // [Function: myObject_key]

The program outputs "[Function: myObject_key]"

Additional context

Object Extraction should not apply to objects with special property kinds.

default in a switch case

Describe the bug:

Compilation failure.

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

switch (0) {
    default:
         console.log("hi");
}

Expected behavior

Successful compilation.

Actual behavior

Compilation error with TypeError: Cannot read properties of null (reading 'type').

Control Flow Flattening breaks strict-mode redefined function declaration

Config and Small code sample

Config:

{
  target: "node",
  controlFlowFlattening: true
}

Code:

"use strict";
var myFunction = function () {
  console.log("Inner");
};

if (true) {
  function myFunction() {
    console.log("Outer");
  }
}

myFunction();

Expected behavior

The program should output "Inner"

Actual behavior

The program outputs "Outer"

Control Flow Flattening breaks nested redefined function declaration

Config and Small code sample

Config:

{
  target: "node",
  controlFlowFlattening: true
}

Code:

if (true) {
  function myFunction() {
    console.log("Top Function Declaration");
  }

  function myFunction() {
    console.log("Bottom Function Declaration");
  }
}

var filler;

myFunction(); // "Bottom Function Declaration"

Expected behavior

The program should output "Bottom Function Declaration"

Actual behavior

The program outputs "Top Function Declaration"

options.minify bug

use minify.test.ts

var code = function greet(){ if(true){ console.log("return"); return; } var output = "should not show!"; console.log(output); } greet();

options = { target: "browser", minify: true }

output code:

var greet=()=>{if(!0){console.log('return')}var output='should not show';console.log(output)};greet()

The return in the if statement is removed

Minify breaks Object constructor

Describe the bug:

Minify breaks Object constructor

Config and Small code sample

Config:

{
  target: "node",
  minify: true
}

Code:

var MyClass = function(){};

var myObject = new MyClass();

Output:

var MyClass=()=>{},myObject=new MyClass

Error:

(node:44533) UnhandledPromiseRejectionWarning: TypeError: MyClass is not a constructor

Minify wants to convert the function to an arrow function, which breaks the new expression.

Control Flow Flattening breaks import statement

Describe the bug:

Control Flow Flattening breaks import statement

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

import { createHash } from 'node:crypto'

function sha256(content) {  
  return createHash('sha256').update(content).digest('hex')
}

console.log(sha256("Hash this string"));

Output:

function sJbFSiU(sJbFSiU) {
    return createHash('sha256')['update'](sJbFSiU)['digest']('hex');
}
var Q9E2KJx = { 'szuCPqW': 'node:crypto' }, brSMkQ = -53, O9PP06 = -42, UZzbiM = -17, QZSrnGc = 132;
while (brSMkQ + O9PP06 + UZzbiM + QZSrnGc != 16) {
    var eHzf2o = (brSMkQ + O9PP06 + UZzbiM + QZSrnGc) * -121 + -45;
    switch (eHzf2o) {
    case -2465:
        import { createHash } from Q9E2KJx['szuCPqW'];
        typeof (brSMkQ += -53 < O9PP06 ? 95 : 198, O9PP06 *= brSMkQ + (QZSrnGc + -172), O9PP06 -= UZzbiM + (brSMkQ + 83), UZzbiM *= 37 > QZSrnGc ? 32 : 2, UZzbiM -= 35 > QZSrnGc ? 118 < brSMkQ ? 131 : 171 : -199, QZSrnGc += O9PP06 + 76);
        break;
    case -3796:
        !(console['log'](sJbFSiU('Hash this string')), brSMkQ += brSMkQ + -81, O9PP06 *= 33 > QZSrnGc ? 2 : -192, O9PP06 -= -82 < O9PP06 ? 153 : -121, UZzbiM *= O9PP06 + 298 < O9PP06 ? QZSrnGc + -251 : 2, UZzbiM -= UZzbiM + -206, QZSrnGc *= 152 > QZSrnGc ? 2 : 157, QZSrnGc -= QZSrnGc + -202 > UZzbiM ? 161 > brSMkQ ? 122 : 144 : -38);
        break;
    }
}

Error:

      import { createHash } from Q9E2KJx['szuCPqW'];
             ^

SyntaxError: Unexpected token '{'

Anti Tooling breaks Symbols

Describe the bug:

Anti Tooling breaks Symbols

Config and Small code sample

Config:

{
  target: "node",
  preset: "low"
}

Code:

var sym1 = Symbol();

sym1;
sym1;

Output:

var sym1=Symbol();+(sym1,sym1)

Error:

(node:32216) UnhandledPromiseRejectionWarning: TypeError: Cannot convert a Symbol value to a number

The Anti Tooling feature combines expressions and chooses a random unary operator (void, typeof, -, !, +, or ~) which can cause errors with symbols. Anti Tooling, which currently has no option to be turned off, should not use unary operators that perform numeric conversions to avoid this error from occuring. The other operators work correctly.

Use hexadecimal representation for numbers

Javascript-Obfuscator (and many other obfuscators as well) does this, Js-confuser should do it too.

// Input
var integer = 10;
var negativeInteger = -10;
var float = 10.1;
var negativeFloat = -10.1;

// Output
var integer = 0xa;
var negativeInteger = -0xa;
var float = 10.1;
var negativeFloat = -10.1;

Notice how only integers get converted.

avoid renaming multiple variables

Hello,

To avoid renaming a certain variable with the example is

renameVariables: name=>name!="jQuery",

Can you provide sample for multiple variables to avoid rename ?

RGF does not work on Arrow Functions or Function expressions

Config and Small code sample

Config:

{
  target: "node",
  rgf: true,
}

Code:

function double1(num){  // Function declaration works
  return num*2;
}

var double2 = function(num){ // Function expression breaks
  return num*2;
}

var double3 = (num)=>{ // Arrow function breaks
  return num*2;
}

console.log(double1(10));
console.log(double2(10));
console.log(double3(10));

Expected behavior

20
20
20

Actual behavior

20
NaN
NaN

Control Flow Flattening breaks function declaration in non-executed switch case block

Config and Small code sample

Config:

{
  target: "node",
  controlFlowFlattening: true
}

Code:

switch (true) {
  case false:
    function myFunction() { // This block is never ran, but declaration is still able to be called
      console.log("Hello World!");
    }
    break;

  case true:
    myFunction();
    break;
}

var filler1;
var filler2;
// "Hello World"

Expected behavior

The program should output "Hello World"

Actual behavior

TypeError: (intermediate value)(intermediate value) is not a function

return in a switch case

Describe the bug:

Using a return statement in a switch case causes a compilation error.

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

function() {
    switch (1) {
        case 0:
            return;
    }
}

Expected behavior

Successful obfuscation.

Actual behavior

Obfuscation fails with SyntaxError: Unexpected token (1:8).

Question: String splitting

The string splitting is really useful, I actually need to hide a link but any of the string obfuscations methods works on it except string splitting, the issue I face is that string splitting breaks part of my code, this is why I would like to know if would be possible to select strings you want to split !

Windows Defender

Describe the bug:

image
image

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

var affect = 0;
class MyClass{
  constructor(){
    affect = 1;
  }
}

var instance = new MyClass();
console.log(affect)

Sample of Trojan:JS/Foretype.A!ml

var gSLAwMP,e_Izy_w,T5fIY1h,PEagBXy,EddB3Qq,hCj_Dfk,lJFJ64f=[0,8,104,9,10,3,243,136,void 0,22,6,275,282,1,2,60,208,18,68,249,165,346,81,186,196,4,178,284,13,158,56,102,402,17,19,483,25,26,93,194,24,184,197,49,20,238,14,15,108,103,139,169,30,28,255,33,5,85,16,185,298,228,411,217,248,62,293,45];function LxVvRh(gSLAwMP){return lJFJ64f[gSLAwMP-49]}~(gSLAwMP=DKJuJH('\x3c\x7e\x3d\x26\x57\x2b\x22\x32\x67\x2d\x6d\x21\x46\x59\x63\x51\x5c\x7e\x3e\x31Ā\x32\x49\x70\x3b\x6a\x3a\x69\x6cđ\x31\x2b\x26\x2c\x35\x39\x3f\x24\x24\x2a\x3e\x26\x35\x3f\x31\x2e\x2a\x3d\x36\x27\x3b\x33\x28\x30\x26\x23\x28\x25\x3a\x3c\x38ē\x7e\x3a\x65\x22\x41\x5c\x35\x72\x45\x30ĝĀ\x37\x21\x4d\x30\x6c\x42\x34\x61\x61\x6f\x3b\x29\x55\x6d\x61\x33\x41\x43ĝħ\x29\x37\x35\x2d\x2c\x26\x2b\x25Ľ\x37\x3c\x33\x45\x65\x45\x57ň\x7e\x38\x6c\x4a\x4dĐĒ\x2d\x2e\x35\x27\x23\x3d\x33\x24\x2e\x3dĽ\x41\x37\x5c\x26\x4bŮ\x46\x2a\x29\x47\x3a\x44\x4a\x26Ů\x38\x54\x26\x5d\x5b\x43\x68\x5b\x45\x26Ɓ\x39\x51ĝ\x2d\x32\x33\x37\x29\x29\x22\x29\x2e\x3a\x38\x38Ƣ\x24\x35\x30ťĀ\x45\x2b\x4c\x2f\x35\x46\x45\x32\x29\x35\x42\x2e\x33ƏƑƓƕŭĒĀ\x41\x30\x3e\x44\x6b\x46\x43\x3eĝ\x2f\x2aƨ\x2d\x3b\x2c\x25\x2d\x35ĽƵ\x6fŋƵ\x2eŮ\x42\x6c\x37\x51\x34ĝ\x2e\x26\x3eŹ\x3eĦžĽ\x45\x5a\x65\x74\x34ǫ\x62Ůƚ\x52\x67\x2b\x3d\x40Ǣ\x32\x38\x37\x2f\x31\x64\x65\x41\x74\x31\x20\x6b\x65\x79\x20\x70Ǿ\x20\x28\x65\x6dȉ\x66\x72\x6f\x6dƕ\x61\x72\x43\x6fǿ\x31\x61\x70\x70\x6c\x79\x31\x6c\x65\x6e\x67\x74\x68\x31\x63\x68ȕȗǿȁ\x31\x73\x6c\x69\x63\x65\x31\x72\x65ȝ\x61Ȳ\x31\x21ȻȻ\x31\x75ȿȿ'),e_Izy_w=[],T5fIY1h=['\x3c\x7e\x42\x6a\x22\x4f\x6d\x3d\x5c\x31\x3b\x3f\x3d\x5f\x4c\x74\x6f\x3a\x5d\x7e\x3e',H7XykPx(LxVvRh(49)),H7XykPx(1),H7XykPx(LxVvRh(63)),'\x2d\x35\x3c\x34\x25\x3e\x34\x2e\x29\x2e\x2c\x37\x2f\x2d\x2c\x31\x2f\x22\x3a\x31',H7XykPx(LxVvRh(54)),H7XykPx(LxVvRh(74)),H7XykPx(LxVvRh(105)),H7XykPx(LxVvRh(59)),H7XykPx(7),'\u003c\u007e\u0047\u0041\u0031\u0072\u002a\u0044\u0067\u0029\u007e\u003e',H7XykPx(LxVvRh(50)),'\u002d\u002e\u0038\u0037\u003d\u003d\u003c\u0030\u002e\u0031',H7XykPx(LxVvRh(52)),H7XykPx(LxVvRh(53)),H7XykPx(11),H7XykPx(12),'\x2d\x25\x31\x27\x37\x3a\x2c\x3a\x25\x22\x39\x28\x25\x3c\x3c\x37\x2e\x25',H7XykPx(LxVvRh(77)),H7XykPx(LxVvRh(95)),H7XykPx(LxVvRh(96)),H7XykPx(LxVvRh(107)),H7XykPx(LxVvRh(82)),H7XykPx(18),H7XykPx(LxVvRh(83)),'\x2b\x2e\x33\x38\x25\x3b\x2c\x22\x2e\x31',H7XykPx(20),'\u003c\u007e\u0044\u0042\u004e\u004d\u0032\u0045\u0063\u0031\u007e\u003e',H7XykPx(21),H7XykPx(22),H7XykPx(23)],PEagBXy={GjSQoQ:[],LJbwud:function(){if(!PEagBXy.GjSQoQ[LxVvRh(49)]){PEagBXy.GjSQoQ.push(9)}return PEagBXy.GjSQoQ.length},cWu3FK:LxVvRh(66),rmY0jRb:59,rIQT8Uv:iOqQJH(LxVvRh(50))});function Y2aTbT(){try{return global}catch(gSLAwMP){return this}}EddB3Qq=Y2aTbT.call(this);function _I6xtc(...gSLAwMP){var e_Izy_w=gSLAwMP=>lJFJ64f[gSLAwMP+107];~(gSLAwMP.length=e_Izy_w(-94),gSLAwMP[LxVvRh(51)]=gSLAwMP[LxVvRh(49)]);switch(gSLAwMP[e_Izy_w(-105)]){case-e_Izy_w(-75):return EddB3Qq[Ejf7Q4(e_Izy_w(-104))];case PEagBXy.LJbwud()?879:-LxVvRh(73):return EddB3Qq[Ejf7Q4(e_Izy_w(-103))];case!PEagBXy.LJbwud()?202:363:return EddB3Qq[Ejf7Q4(11)];case!PEagBXy.LJbwud()?e_Izy_w(-99):-LxVvRh(100):return EddB3Qq[iOqQJH(12)+'\u0065']}}function kSudPk(...gSLAwMP){var e_Izy_w=gSLAwMP=>lJFJ64f[gSLAwMP-191];+(gSLAwMP.length=e_Izy_w(196),gSLAwMP[e_Izy_w(197)]=LxVvRh(78),gSLAwMP[gSLAwMP[gSLAwMP[e_Izy_w(197)]-(gSLAwMP[LxVvRh(55)]-e_Izy_w(197))]-155]=gSLAwMP[LxVvRh(49)]*-72-211,gSLAwMP[gSLAwMP[e_Izy_w(197)]-LxVvRh(56)]=210);switch(gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(58)]+33]-(gSLAwMP[gSLAwMP[243]-(gSLAwMP[gSLAwMP[243]-e_Izy_w(198)]-74)]-55)]){case!PEagBXy.LJbwud()?LxVvRh(57):-34987:return gSLAwMP[1]+gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(55)]-(gSLAwMP[e_Izy_w(197)]-22)]-(gSLAwMP[LxVvRh(58)]-22)]-(gSLAwMP[LxVvRh(55)]-(gSLAwMP[gSLAwMP[22]+LxVvRh(104)]-e_Izy_w(207)))]}}function L11Uy2(...gSLAwMP){var e_Izy_w,T5fIY1h;function EddB3Qq(gSLAwMP){return lJFJ64f[gSLAwMP-203]}!(gSLAwMP.length=EddB3Qq(203),gSLAwMP[111]=gSLAwMP[2],e_Izy_w=219,T5fIY1h=-217,gSLAwMP[LxVvRh(51)]=-171);while(e_Izy_w+T5fIY1h!=EddB3Qq(239)&&PEagBXy.cWu3FK>EddB3Qq(213)){var hCj_Dfk=gSLAwMP=>LxVvRh(gSLAwMP-191);gSLAwMP[gSLAwMP[gSLAwMP[104]+EddB3Qq(214)]+LxVvRh(61)]=(e_Izy_w+T5fIY1h)*(gSLAwMP[LxVvRh(51)]+329)-214;switch(gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(51)]+LxVvRh(60)]+EddB3Qq(215)]){case!(PEagBXy.cWu3FK>LxVvRh(59))?gSLAwMP[104]+324:gSLAwMP[LxVvRh(51)]-(gSLAwMP[hCj_Dfk(242)]-(gSLAwMP[hCj_Dfk(242)]+1695)):~(DCbAaKi=gSLAwMP[gSLAwMP[gSLAwMP[EddB3Qq(205)]+275]+hCj_Dfk(251)]-(gSLAwMP[hCj_Dfk(242)]-LxVvRh(93))>e_Izy_w?gSLAwMP[gSLAwMP[LxVvRh(51)]+275]-(gSLAwMP[hCj_Dfk(242)]-44):hCj_Dfk(253),e_Izy_w*=-(gSLAwMP[104]-(gSLAwMP[LxVvRh(51)]-222))<T5fIY1h?LxVvRh(63):-213,e_Izy_w-=e_Izy_w-LxVvRh(113));break;case PEagBXy.rmY0jRb>-LxVvRh(64)?5948:-(gSLAwMP[EddB3Qq(205)]+172):e_Izy_w+=e_Izy_w-hCj_Dfk(267);break;case gSLAwMP[gSLAwMP[EddB3Qq(205)]-(gSLAwMP[hCj_Dfk(242)]-104)]+4855:return[DCbAaKi];case!(PEagBXy.rmY0jRb>-LxVvRh(64))?-(gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(51)]-(gSLAwMP[104]-LxVvRh(51))]+LxVvRh(60)]+352):gSLAwMP[gSLAwMP[EddB3Qq(205)]-(gSLAwMP[104]-LxVvRh(51))]+273:var [DCbAaKi]=this;e_Izy_w+=gSLAwMP[gSLAwMP[hCj_Dfk(242)]+EddB3Qq(214)]-(gSLAwMP[gSLAwMP[gSLAwMP[EddB3Qq(205)]+LxVvRh(60)]+hCj_Dfk(251)]-66)>e_Izy_w?-(gSLAwMP[104]+403):gSLAwMP[gSLAwMP[hCj_Dfk(242)]+EddB3Qq(214)]+LxVvRh(65)}}}var DCbAaKi=LxVvRh(49);class xhXldmy{constructor(...gSLAwMP){var e_Izy_w,T5fIY1h,EddB3Qq,hCj_Dfk,Y2aTbT;function xhXldmy(gSLAwMP){return lJFJ64f[gSLAwMP+112]}+(gSLAwMP.length=0,gSLAwMP[xhXldmy(-94)]=-181,e_Izy_w=-(gSLAwMP[68]+306),T5fIY1h=-LxVvRh(66),EddB3Qq=xhXldmy(-89),hCj_Dfk=140,Y2aTbT=-(gSLAwMP[68]-(gSLAwMP[gSLAwMP[xhXldmy(-94)]+LxVvRh(68)]-(gSLAwMP[LxVvRh(67)]+xhXldmy(-58)))),gSLAwMP[gSLAwMP[gSLAwMP[68]+xhXldmy(-93)]-(gSLAwMP[LxVvRh(67)]-(gSLAwMP[LxVvRh(67)]+xhXldmy(-91)))]=gSLAwMP[gSLAwMP[xhXldmy(-94)]+249]+427);while(e_Izy_w+T5fIY1h+EddB3Qq+hCj_Dfk+Y2aTbT!=gSLAwMP[xhXldmy(-94)]-(gSLAwMP[xhXldmy(-92)]-520)){function dyHuutR(gSLAwMP){return LxVvRh(gSLAwMP+140)}gSLAwMP[gSLAwMP[LxVvRh(69)]-241]=(e_Izy_w+T5fIY1h+EddB3Qq+hCj_Dfk+Y2aTbT)*-(gSLAwMP[gSLAwMP[xhXldmy(-92)]-LxVvRh(71)]-7)-(gSLAwMP[165]-(gSLAwMP[gSLAwMP[LxVvRh(67)]+LxVvRh(70)]-(gSLAwMP[LxVvRh(67)]+(gSLAwMP[gSLAwMP[165]-LxVvRh(71)]+67))));switch(gSLAwMP[gSLAwMP[gSLAwMP[dyHuutR(-73)]-(gSLAwMP[LxVvRh(67)]-68)]+xhXldmy(-89)]){case-25466:~(T5fIY1h*=gSLAwMP[xhXldmy(-94)]-(gSLAwMP[gSLAwMP[xhXldmy(-92)]-dyHuutR(-69)]-527)>T5fIY1h?dyHuutR(-77):(152>T5fIY1h?-(gSLAwMP[gSLAwMP[xhXldmy(-92)]-xhXldmy(-86)]+389):-(gSLAwMP[gSLAwMP[LxVvRh(67)]+dyHuutR(-70)]-(gSLAwMP[68]+376)))<EddB3Qq?-(gSLAwMP[gSLAwMP[dyHuutR(-73)]-(gSLAwMP[dyHuutR(-73)]-LxVvRh(67))]-(gSLAwMP[xhXldmy(-94)]-dyHuutR(-42))):gSLAwMP[gSLAwMP[xhXldmy(-92)]-178]+251<Y2aTbT?gSLAwMP[LxVvRh(67)]-(gSLAwMP[xhXldmy(-92)]-444):164,T5fIY1h-=gSLAwMP[165]-96<T5fIY1h?hCj_Dfk-153:-(gSLAwMP[xhXldmy(-92)]-102),e_Izy_w*=(20<e_Izy_w?gSLAwMP[xhXldmy(-92)]-LxVvRh(73):94)<Y2aTbT?gSLAwMP[68]+370:2,e_Izy_w-=e_Izy_w+39);break;case-(gSLAwMP[gSLAwMP[LxVvRh(67)]+LxVvRh(70)]+25937):typeof(e_Izy_w*=T5fIY1h+(gSLAwMP[xhXldmy(-94)]+201),e_Izy_w-=(LxVvRh(74)<EddB3Qq?-67:EddB3Qq-259)>e_Izy_w?gSLAwMP[165]-(gSLAwMP[gSLAwMP[165]-LxVvRh(75)]+273)>Y2aTbT?-163:-6:-xhXldmy(-67),Y2aTbT+=T5fIY1h+(-135>e_Izy_w?gSLAwMP[LxVvRh(69)]-(gSLAwMP[68]+dyHuutR(-30)):-(gSLAwMP[68]+xhXldmy(-85))>hCj_Dfk?gSLAwMP[gSLAwMP[dyHuutR(-73)]+dyHuutR(-72)]-(gSLAwMP[xhXldmy(-92)]-502):-(gSLAwMP[LxVvRh(67)]-(gSLAwMP[68]-97))));break;case PEagBXy.rIQT8Uv[iOqQJH(LxVvRh(77))+Ejf7Q4(gSLAwMP[dyHuutR(-73)]-(gSLAwMP[gSLAwMP[xhXldmy(-92)]-xhXldmy(-90)]-441))](gSLAwMP[dyHuutR(-73)]+xhXldmy(-71))==gSLAwMP[gSLAwMP[dyHuutR(-73)]+dyHuutR(-70)]-xhXldmy(-70)?-(gSLAwMP[68]-(gSLAwMP[gSLAwMP[dyHuutR(-71)]-xhXldmy(-90)]-39516)):null:void(EddB3Qq*=T5fIY1h+(gSLAwMP[gSLAwMP[165]-(gSLAwMP[dyHuutR(-71)]-165)]-(gSLAwMP[gSLAwMP[68]+dyHuutR(-72)]+407)),EddB3Qq-=EddB3Qq+(Y2aTbT+(gSLAwMP[gSLAwMP[xhXldmy(-94)]+249]-(gSLAwMP[165]-471))));break;case!(PEagBXy.rIQT8Uv[iOqQJH(gSLAwMP[68]+dyHuutR(-52))+H7XykPx(LxVvRh(89))](3)==dyHuutR(-48))?null:-10409:if(gSLAwMP[gSLAwMP[LxVvRh(67)]-(gSLAwMP[gSLAwMP[68]+xhXldmy(-91)]-437)]){function FcEfMx(...gSLAwMP){function e_Izy_w(gSLAwMP){return LxVvRh(gSLAwMP-53)}typeof(gSLAwMP.length=e_Izy_w(116),gSLAwMP[dyHuutR(-61)]=LxVvRh(78));if(typeof gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[e_Izy_w(132)]-xhXldmy(-81)]-e_Izy_w(133)]-(gSLAwMP[xhXldmy(-82)]-xhXldmy(-82))]-(gSLAwMP[LxVvRh(79)]-(gSLAwMP[dyHuutR(-61)]-dyHuutR(-60)))]-158]!==Ejf7Q4(15)&&PEagBXy.rmY0jRb>-(gSLAwMP[LxVvRh(79)]-98)){function T5fIY1h(gSLAwMP){return xhXldmy(gSLAwMP+87)}throw new(_I6xtc(-dyHuutR(-59)))(Ejf7Q4(16)+iOqQJH(e_Izy_w(135))+iOqQJH(18)+Ejf7Q4(gSLAwMP[T5fIY1h(-169)]-(gSLAwMP[56]-LxVvRh(83))))}gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(79)]-xhXldmy(-81)]-(gSLAwMP[gSLAwMP[e_Izy_w(132)]-(gSLAwMP[56]-LxVvRh(79))]-dyHuutR(-53))]=gSLAwMP[gSLAwMP[gSLAwMP[e_Izy_w(132)]-(gSLAwMP[56]-LxVvRh(79))]-156];if(!gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[xhXldmy(-82)]-(gSLAwMP[56]-56)]-(gSLAwMP[56]-LxVvRh(79))]-(gSLAwMP[dyHuutR(-61)]-xhXldmy(-112))]&&PEagBXy.rmY0jRb>-LxVvRh(64)){throw new(_I6xtc(-e_Izy_w(134)))(Ejf7Q4(20)+Ejf7Q4(gSLAwMP[gSLAwMP[e_Izy_w(132)]-LxVvRh(80)]-(gSLAwMP[LxVvRh(79)]-21))+H7XykPx(gSLAwMP[gSLAwMP[LxVvRh(79)]-e_Izy_w(133)]-133)+iOqQJH(22)+H7XykPx(xhXldmy(-75))+Ejf7Q4(23)+Ejf7Q4(gSLAwMP[xhXldmy(-82)]-134))}gSLAwMP[gSLAwMP[gSLAwMP[dyHuutR(-61)]-dyHuutR(-60)]-65]=_I6xtc(gSLAwMP[gSLAwMP[gSLAwMP[xhXldmy(-82)]-(gSLAwMP[dyHuutR(-61)]-e_Izy_w(132))]-(gSLAwMP[gSLAwMP[e_Izy_w(132)]-LxVvRh(80)]-56)]+721).localStorage.getItem(gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(79)]-dyHuutR(-60)]-102]-(gSLAwMP[xhXldmy(-82)]-(gSLAwMP[e_Izy_w(132)]-(gSLAwMP[xhXldmy(-82)]-xhXldmy(-82))))]-(gSLAwMP[gSLAwMP[xhXldmy(-82)]-LxVvRh(80)]-xhXldmy(-82))]-(gSLAwMP[e_Izy_w(132)]-e_Izy_w(102))]);try{gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(79)]-dyHuutR(-60)]-(gSLAwMP[e_Izy_w(132)]-56)]-(gSLAwMP[gSLAwMP[xhXldmy(-82)]-dyHuutR(-60)]-56)]-(gSLAwMP[gSLAwMP[56]-LxVvRh(80)]-93)]=_I6xtc(gSLAwMP[56]-(gSLAwMP[gSLAwMP[gSLAwMP[e_Izy_w(132)]-dyHuutR(-60)]-e_Izy_w(133)]-(gSLAwMP[56]-(gSLAwMP[gSLAwMP[e_Izy_w(132)]-e_Izy_w(133)]-363)))).parse(gSLAwMP[gSLAwMP[e_Izy_w(132)]-(gSLAwMP[gSLAwMP[gSLAwMP[dyHuutR(-61)]-dyHuutR(-60)]-(gSLAwMP[gSLAwMP[e_Izy_w(132)]-dyHuutR(-60)]-e_Izy_w(132))]-93)])}catch(EddB3Qq){function hCj_Dfk(gSLAwMP){return xhXldmy(gSLAwMP-149)}gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[xhXldmy(-82)]-(gSLAwMP[gSLAwMP[gSLAwMP[e_Izy_w(132)]-dyHuutR(-60)]-dyHuutR(-60)]-56)]-(gSLAwMP[dyHuutR(-61)]-LxVvRh(79))]-157](new(_I6xtc(-e_Izy_w(134)))(kSudPk(dyHuutR(-56),kSudPk(e_Izy_w(137),kSudPk(gSLAwMP[e_Izy_w(132)]-(gSLAwMP[xhXldmy(-82)]-483),iOqQJH(e_Izy_w(138))+iOqQJH(e_Izy_w(139))+Ejf7Q4(27)+Ejf7Q4(gSLAwMP[56]-(gSLAwMP[xhXldmy(-82)]-e_Izy_w(155)))+Ejf7Q4(gSLAwMP[xhXldmy(-82)]-129),gSLAwMP[gSLAwMP[gSLAwMP[56]-xhXldmy(-81)]-(gSLAwMP[56]-(gSLAwMP[LxVvRh(79)]-hCj_Dfk(66)))]),'\x27\x3a\x20'),EddB3Qq.message)))}gSLAwMP[gSLAwMP[gSLAwMP[56]-(gSLAwMP[56]-dyHuutR(-61))]-(gSLAwMP[xhXldmy(-82)]-1)](null,gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(79)]-(gSLAwMP[gSLAwMP[dyHuutR(-61)]-102]-LxVvRh(79))]-(gSLAwMP[gSLAwMP[e_Izy_w(132)]-e_Izy_w(133)]-e_Izy_w(140))])}}~(T5fIY1h*=EddB3Qq-440,T5fIY1h-=Y2aTbT-(gSLAwMP[dyHuutR(-71)]-xhXldmy(-55)));break;case PEagBXy.rIQT8Uv[iOqQJH(gSLAwMP[gSLAwMP[dyHuutR(-71)]-178]+dyHuutR(-52))+H7XykPx(LxVvRh(89))](gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[xhXldmy(-92)]-xhXldmy(-90)]-LxVvRh(71)]-LxVvRh(75)]+LxVvRh(90))==gSLAwMP[68]+230?-(gSLAwMP[dyHuutR(-73)]+34012):null:void(DCbAaKi=gSLAwMP[gSLAwMP[dyHuutR(-71)]-237].pop(),T5fIY1h+=gSLAwMP[xhXldmy(-94)]-(gSLAwMP[LxVvRh(67)]-188)<e_Izy_w?-(gSLAwMP[68]-(gSLAwMP[dyHuutR(-73)]-122)):-(gSLAwMP[gSLAwMP[68]+LxVvRh(70)]-162),EddB3Qq*=T5fIY1h+(e_Izy_w+279),EddB3Qq-=xhXldmy(-70)<hCj_Dfk?-(gSLAwMP[gSLAwMP[gSLAwMP[xhXldmy(-94)]+dyHuutR(-70)]-LxVvRh(71)]-(gSLAwMP[gSLAwMP[dyHuutR(-71)]-(gSLAwMP[xhXldmy(-92)]-dyHuutR(-73))]+188)):385);break;case PEagBXy.rIQT8Uv[iOqQJH(gSLAwMP[gSLAwMP[gSLAwMP[dyHuutR(-73)]+xhXldmy(-91)]-178]+LxVvRh(88))+H7XykPx(gSLAwMP[gSLAwMP[xhXldmy(-94)]+346]-222)](xhXldmy(-107))==dyHuutR(-48)?-(gSLAwMP[xhXldmy(-94)]-(gSLAwMP[xhXldmy(-92)]-4622)):null:typeof(EddB3Qq*=-(gSLAwMP[LxVvRh(69)]-148)>hCj_Dfk?LxVvRh(93):2,EddB3Qq-=-(gSLAwMP[xhXldmy(-94)]+218)>hCj_Dfk?-(gSLAwMP[gSLAwMP[LxVvRh(69)]-dyHuutR(-69)]-(gSLAwMP[68]+357)):-9);break;case!PEagBXy.LJbwud()?null:-41001:!(gSLAwMP[gSLAwMP[xhXldmy(-94)]+190]=L11Uy2.call([DCbAaKi]),hCj_Dfk*=79>e_Izy_w?T5fIY1h+(35<EddB3Qq?xhXldmy(-83):134):-82,hCj_Dfk-=EddB3Qq+(EddB3Qq-(gSLAwMP[gSLAwMP[165]-(gSLAwMP[LxVvRh(69)]-xhXldmy(-94))]+348)),EddB3Qq+=-dyHuutR(-51)<EddB3Qq?143:240,T5fIY1h*=e_Izy_w+41,T5fIY1h-=T5fIY1h+(gSLAwMP[LxVvRh(67)]-(gSLAwMP[LxVvRh(69)]-679)));break;case PEagBXy.LJbwud()?-(gSLAwMP[dyHuutR(-71)]-(gSLAwMP[dyHuutR(-73)]-11655)):null:return gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(69)]-(gSLAwMP[xhXldmy(-94)]-(gSLAwMP[xhXldmy(-94)]-LxVvRh(71)))]-(gSLAwMP[gSLAwMP[xhXldmy(-94)]-(gSLAwMP[LxVvRh(67)]-dyHuutR(-73))]+418)].pop();case!(PEagBXy.rmY0jRb>-xhXldmy(-97))?dyHuutR(-83):-(gSLAwMP[gSLAwMP[dyHuutR(-73)]+249]-(gSLAwMP[gSLAwMP[gSLAwMP[dyHuutR(-71)]-178]+LxVvRh(70)]-29717)):void(gSLAwMP[gSLAwMP[LxVvRh(67)]+191]=false,T5fIY1h*=e_Izy_w-(gSLAwMP[gSLAwMP[LxVvRh(67)]+LxVvRh(68)]-(gSLAwMP[LxVvRh(67)]-42)),T5fIY1h-=gSLAwMP[LxVvRh(67)]+211<Y2aTbT?12>Y2aTbT?-LxVvRh(94):-(gSLAwMP[xhXldmy(-92)]-xhXldmy(-69)):114,hCj_Dfk*=(-44<Y2aTbT?gSLAwMP[LxVvRh(69)]-221:gSLAwMP[xhXldmy(-92)]-xhXldmy(-62))>hCj_Dfk?-130:gSLAwMP[LxVvRh(67)]+183,hCj_Dfk-=EddB3Qq-121);break;case!(PEagBXy.rIQT8Uv[iOqQJH(dyHuutR(-63))+Ejf7Q4(dyHuutR(-45))](gSLAwMP[dyHuutR(-71)]-243)==49)?null:-27378:+(T5fIY1h*=(-206>EddB3Qq?gSLAwMP[165]-(gSLAwMP[dyHuutR(-73)]-(gSLAwMP[gSLAwMP[dyHuutR(-73)]-(gSLAwMP[gSLAwMP[dyHuutR(-73)]+LxVvRh(68)]-165)]-647)):-LxVvRh(96))>e_Izy_w?gSLAwMP[gSLAwMP[LxVvRh(67)]-(gSLAwMP[xhXldmy(-94)]-LxVvRh(69))]-(gSLAwMP[LxVvRh(67)]+425):-(gSLAwMP[xhXldmy(-94)]+406),T5fIY1h-=e_Izy_w+(-(gSLAwMP[xhXldmy(-92)]-128)<hCj_Dfk?-302:-dyHuutR(-43)),Y2aTbT*=gSLAwMP[xhXldmy(-92)]-150>EddB3Qq?gSLAwMP[dyHuutR(-73)]-(gSLAwMP[gSLAwMP[LxVvRh(67)]+249]-(gSLAwMP[68]+375)):xhXldmy(-98),Y2aTbT-=hCj_Dfk-LxVvRh(98));break;case PEagBXy.cWu3FK>6?-(gSLAwMP[LxVvRh(69)]-(gSLAwMP[68]-7353)):xhXldmy(-104):!(e_Izy_w*=-75>e_Izy_w?Y2aTbT+191:gSLAwMP[gSLAwMP[dyHuutR(-71)]-xhXldmy(-90)]-43,e_Izy_w-=T5fIY1h-(gSLAwMP[68]+277));break;case PEagBXy.rIQT8Uv[iOqQJH(gSLAwMP[68]+194)+Ejf7Q4(gSLAwMP[LxVvRh(67)]+195)](LxVvRh(54))==gSLAwMP[165]-(gSLAwMP[68]+378)?-14233:LxVvRh(57):e_Izy_w+=hCj_Dfk+(Y2aTbT+(161<T5fIY1h?LxVvRh(99):gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(69)]-81]-dyHuutR(-65)]-(gSLAwMP[dyHuutR(-73)]-153)))}}}}void(hCj_Dfk=new xhXldmy,_I6xtc(-LxVvRh(100))[iOqQJH(LxVvRh(101))](DCbAaKi));function dyHuutR(gSLAwMP,e_Izy_w=[H7XykPx(27),H7XykPx(LxVvRh(102))]){var EddB3Qq,hCj_Dfk,Y2aTbT,_I6xtc,kSudPk,L11Uy2,DCbAaKi,xhXldmy,dyHuutR,Ejf7Q4;function FcEfMx(gSLAwMP){return lJFJ64f[gSLAwMP-15]}var iOqQJH,EddB3Qq,hCj_Dfk,Y2aTbT,_I6xtc,kSudPk=String,L11Uy2=H7XykPx(29),DCbAaKi=LxVvRh(103),xhXldmy=H7XykPx(LxVvRh(101)),dyHuutR=H7XykPx(31),Ejf7Q4=H7XykPx(32);for('\u003c\u007e'===gSLAwMP[dyHuutR](0,LxVvRh(63))&&'\x7e\x3e'===gSLAwMP[dyHuutR](-LxVvRh(63)),gSLAwMP=gSLAwMP[dyHuutR](LxVvRh(63),-LxVvRh(63))[Ejf7Q4](/s/g,'')[Ejf7Q4]('\x7a',H7XykPx(LxVvRh(104))),iOqQJH=H7XykPx(34)[dyHuutR](gSLAwMP[L11Uy2]%5||LxVvRh(105)),gSLAwMP+=iOqQJH,hCj_Dfk=[],Y2aTbT=FcEfMx(15),_I6xtc=gSLAwMP[L11Uy2];_I6xtc>Y2aTbT;Y2aTbT+=LxVvRh(105))EddB3Qq=52200625*(gSLAwMP[xhXldmy](Y2aTbT)-LxVvRh(104))+614125*(gSLAwMP[xhXldmy](Y2aTbT+FcEfMx(28))-33)+7225*(gSLAwMP[xhXldmy](Y2aTbT+LxVvRh(63))-LxVvRh(104))+LxVvRh(106)*(gSLAwMP[xhXldmy](Y2aTbT+3)-LxVvRh(104))+(gSLAwMP[xhXldmy](Y2aTbT+LxVvRh(74))-FcEfMx(70)),hCj_Dfk.push(DCbAaKi&EddB3Qq>>FcEfMx(55),DCbAaKi&EddB3Qq>>FcEfMx(73),DCbAaKi&EddB3Qq>>FcEfMx(16),DCbAaKi&EddB3Qq);return function(gSLAwMP,T5fIY1h){for(var iOqQJH=T5fIY1h;iOqQJH>FcEfMx(15);iOqQJH--)gSLAwMP.pop()}(hCj_Dfk,iOqQJH[L11Uy2]),kSudPk[e_Izy_w[FcEfMx(15)]][e_Izy_w[FcEfMx(28)]](kSudPk,hCj_Dfk)}function Ejf7Q4(...gSLAwMP){var PEagBXy=gSLAwMP=>lJFJ64f[gSLAwMP-54];!(gSLAwMP.length=LxVvRh(54),gSLAwMP[185]=-113);if(gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(108)]+LxVvRh(109)]-(gSLAwMP[185]-(gSLAwMP[gSLAwMP[185]+298]-(gSLAwMP[LxVvRh(108)]-PEagBXy(68))))]){return gSLAwMP[gSLAwMP[185]-(gSLAwMP[PEagBXy(113)]-1)][e_Izy_w[gSLAwMP[gSLAwMP[LxVvRh(108)]+(gSLAwMP[gSLAwMP[PEagBXy(113)]-(gSLAwMP[gSLAwMP[LxVvRh(108)]+PEagBXy(114)]-PEagBXy(113))]+LxVvRh(110))]]]=Ejf7Q4(gSLAwMP[gSLAwMP[LxVvRh(108)]-(gSLAwMP[LxVvRh(108)]-LxVvRh(49))],gSLAwMP[gSLAwMP[gSLAwMP[PEagBXy(113)]+LxVvRh(109)]+(gSLAwMP[LxVvRh(108)]+227)])}gSLAwMP[104]=gSLAwMP[gSLAwMP[185]+113];if(gSLAwMP[gSLAwMP[PEagBXy(113)]+298]>gSLAwMP[gSLAwMP[LxVvRh(108)]+298]+51){return gSLAwMP[gSLAwMP[gSLAwMP[185]+298]-(gSLAwMP[gSLAwMP[LxVvRh(108)]+298]+LxVvRh(59))]}else{var EddB3Qq=gSLAwMP=>LxVvRh(gSLAwMP+131);return gSLAwMP[gSLAwMP[185]+(gSLAwMP[gSLAwMP[PEagBXy(113)]+298]+227)]?gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[185]+PEagBXy(114)]+PEagBXy(114)]-(gSLAwMP[PEagBXy(113)]-PEagBXy(56))][e_Izy_w[gSLAwMP[gSLAwMP[185]-(gSLAwMP[LxVvRh(108)]-(gSLAwMP[185]-(gSLAwMP[PEagBXy(113)]-PEagBXy(67))))]]]:e_Izy_w[gSLAwMP[gSLAwMP[PEagBXy(113)]+EddB3Qq(-19)]]||(gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[EddB3Qq(-23)]+LxVvRh(109)]+LxVvRh(109)]-(gSLAwMP[PEagBXy(113)]-(gSLAwMP[LxVvRh(108)]+115))]=dyHuutR,e_Izy_w[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[185]+(gSLAwMP[PEagBXy(113)]-(gSLAwMP[LxVvRh(108)]-(gSLAwMP[EddB3Qq(-23)]+LxVvRh(111))))]-(gSLAwMP[LxVvRh(108)]-PEagBXy(113))]+(gSLAwMP[gSLAwMP[gSLAwMP[EddB3Qq(-23)]+PEagBXy(114)]+EddB3Qq(-22)]+LxVvRh(111))]+(gSLAwMP[gSLAwMP[185]+PEagBXy(114)]+330)]]=gSLAwMP[gSLAwMP[gSLAwMP[PEagBXy(113)]+298]+115](T5fIY1h[gSLAwMP[gSLAwMP[LxVvRh(108)]+PEagBXy(117)]]))}}function FcEfMx(gSLAwMP){var e_Izy_w,T5fIY1h,PEagBXy=LxVvRh(49),EddB3Qq='',hCj_Dfk=gSLAwMP.length,lJFJ64f=String,Y2aTbT=H7XykPx(LxVvRh(101)),_I6xtc=H7XykPx(27),kSudPk;for(kSudPk=LxVvRh(49);kSudPk<hCj_Dfk;kSudPk+=1)e_Izy_w=gSLAwMP[Y2aTbT](kSudPk)-LxVvRh(104),e_Izy_w>=0&&e_Izy_w<32?(PEagBXy+=(T5fIY1h=T5fIY1h<<LxVvRh(105)|e_Izy_w,LxVvRh(105)),PEagBXy>=LxVvRh(50)?PEagBXy-=(EddB3Qq+=lJFJ64f[_I6xtc](T5fIY1h>>PEagBXy-LxVvRh(50)&LxVvRh(103)),LxVvRh(50)):0):0;return EddB3Qq}function iOqQJH(...gSLAwMP){var PEagBXy=gSLAwMP=>lJFJ64f[gSLAwMP+9];typeof(gSLAwMP.length=LxVvRh(54),gSLAwMP[LxVvRh(113)]=PEagBXy(56));if(gSLAwMP[LxVvRh(63)]){var EddB3Qq=gSLAwMP=>LxVvRh(gSLAwMP+126);return gSLAwMP[1][e_Izy_w[gSLAwMP[gSLAwMP[248]-(gSLAwMP[gSLAwMP[EddB3Qq(-13)]+EddB3Qq(-54)]-(gSLAwMP[gSLAwMP[LxVvRh(113)]-(gSLAwMP[LxVvRh(113)]-LxVvRh(113))]-(gSLAwMP[gSLAwMP[EddB3Qq(-13)]+EddB3Qq(-54)]-EddB3Qq(-63))))]]]=iOqQJH(gSLAwMP[gSLAwMP[gSLAwMP[248]+LxVvRh(72)]-PEagBXy(56)],gSLAwMP[gSLAwMP[PEagBXy(55)]-(gSLAwMP[PEagBXy(55)]-(gSLAwMP[EddB3Qq(-13)]-61))])}gSLAwMP[gSLAwMP[248]-(gSLAwMP[gSLAwMP[PEagBXy(55)]+186]-PEagBXy(55))]=gSLAwMP[PEagBXy(55)]-107;if(gSLAwMP[gSLAwMP[gSLAwMP[248]-(gSLAwMP[248]-PEagBXy(55))]-(gSLAwMP[LxVvRh(113)]-PEagBXy(55))]>gSLAwMP[LxVvRh(113)]+46){var hCj_Dfk=gSLAwMP=>LxVvRh(gSLAwMP-87);return gSLAwMP[gSLAwMP[gSLAwMP[hCj_Dfk(200)]-(gSLAwMP[248]-248)]-(gSLAwMP[hCj_Dfk(200)]-(gSLAwMP[LxVvRh(113)]-(gSLAwMP[gSLAwMP[248]+PEagBXy(57)]-37)))]}else{var Y2aTbT=gSLAwMP=>LxVvRh(gSLAwMP+198);return gSLAwMP[gSLAwMP[gSLAwMP[248]+PEagBXy(57)]-(gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[248]-(gSLAwMP[Y2aTbT(-85)]-LxVvRh(113))]-(gSLAwMP[248]-Y2aTbT(-85))]-(gSLAwMP[gSLAwMP[LxVvRh(113)]-(gSLAwMP[PEagBXy(55)]-Y2aTbT(-85))]-PEagBXy(55))]-(gSLAwMP[Y2aTbT(-85)]-(gSLAwMP[PEagBXy(55)]-(gSLAwMP[gSLAwMP[LxVvRh(113)]-(gSLAwMP[Y2aTbT(-85)]-248)]+46))))]?gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[248]+293]+293]+LxVvRh(116)][e_Izy_w[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(113)]+Y2aTbT(-83)]+(gSLAwMP[Y2aTbT(-85)]-(gSLAwMP[PEagBXy(55)]-PEagBXy(57)))]+(gSLAwMP[gSLAwMP[LxVvRh(113)]-(gSLAwMP[gSLAwMP[LxVvRh(113)]+PEagBXy(57)]-(gSLAwMP[LxVvRh(113)]+PEagBXy(57)))]-(gSLAwMP[gSLAwMP[LxVvRh(113)]+PEagBXy(57)]-Y2aTbT(-83)))]-(gSLAwMP[gSLAwMP[Y2aTbT(-85)]+Y2aTbT(-83)]-(gSLAwMP[248]-(gSLAwMP[PEagBXy(55)]-1)))]]]:e_Izy_w[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[248]+PEagBXy(57)]+PEagBXy(57)]-(gSLAwMP[248]-Y2aTbT(-85))]-(gSLAwMP[LxVvRh(113)]-(gSLAwMP[gSLAwMP[Y2aTbT(-85)]-(gSLAwMP[gSLAwMP[248]+293]-Y2aTbT(-85))]+293))]+LxVvRh(116)]]||(gSLAwMP[gSLAwMP[248]+47]=FcEfMx,e_Izy_w[gSLAwMP[gSLAwMP[Y2aTbT(-85)]+(gSLAwMP[gSLAwMP[LxVvRh(113)]-(gSLAwMP[PEagBXy(55)]-248)]-(gSLAwMP[PEagBXy(55)]-45))]]=gSLAwMP[gSLAwMP[Y2aTbT(-85)]-(gSLAwMP[gSLAwMP[gSLAwMP[gSLAwMP[LxVvRh(113)]+LxVvRh(115)]-(gSLAwMP[PEagBXy(55)]-PEagBXy(55))]+LxVvRh(115)]-2)](T5fIY1h[gSLAwMP[gSLAwMP[gSLAwMP[248]+293]+LxVvRh(116)]]))}}function H7XykPx(...e_Izy_w){~(e_Izy_w.length=LxVvRh(62),e_Izy_w[200]=e_Izy_w[LxVvRh(49)]);return gSLAwMP[e_Izy_w[200]]}function DKJuJH(gSLAwMP){var e_Izy_w,T5fIY1h,PEagBXy,EddB3Qq={},hCj_Dfk=gSLAwMP.split(''),lJFJ64f=T5fIY1h=hCj_Dfk[0],Y2aTbT=[lJFJ64f],_I6xtc=e_Izy_w=256;for(gSLAwMP=LxVvRh(62);gSLAwMP<hCj_Dfk.length;gSLAwMP++)PEagBXy=hCj_Dfk[gSLAwMP].charCodeAt(LxVvRh(49)),PEagBXy=_I6xtc>PEagBXy?hCj_Dfk[gSLAwMP]:EddB3Qq[PEagBXy]?EddB3Qq[PEagBXy]:T5fIY1h+lJFJ64f,Y2aTbT.push(PEagBXy),lJFJ64f=PEagBXy.charAt(0),EddB3Qq[e_Izy_w]=T5fIY1h+lJFJ64f,e_Izy_w++,T5fIY1h=PEagBXy;return Y2aTbT.join('').split('\x31')}

https://www.virustotal.com/gui/file-analysis/MTdjY2RkYjgyNmU5ZWZkZTliZTMyYjY2NDNhZWI0Nzc6MTYyNDM4NjIzMQ==/detection

"1 security vendor flagged this file as malicious"

Additional context

Windows removes file about 1 every 300 obfuscations

Question: direct run support in browser.

Hi Michael, love this project so much. Got trouble using this repo however, idk if I can do some demo code testing in a bare browser environment. What I did was to first install with npm install js-confuser, and then created a test.js file with the following content:

var JsConfuser = require("js-confuser");

JsConfuser.obfuscate(`
  function fibonacci(num){   
    var a = 0, b = 1, c = num;
    while (num-- > 1) {
      c = a + b;
      a = b;
      b = c;
    }
    return c;
  }

  for ( var i = 1; i <= 25; i++ ) {
    console.log(i, fibonacci(i))
  }
`, {
  target: "browser",
  preset: "high",
  stringEncoding: false, // <- Normally enabled
}).then(obfuscated => {
  console.log(obfuscated)
})

Then I do node test.js > test.txt and finally copy the full content from test.txt and try to paste those codes in Chrome‘s debugging tools and try to make it work. However I got a VM1313:1 Uncaught TypeError: hLcB7T1[NpWOyTI] is not a function error. It looks like I'm doing it all wrong, I'd like to ask if there's any quick start docs for help, thanks.

Control Flow Flattening breaks typeof expression

Describe the bug:

Control Flow Flattening breaks typeof expression

Config and Small code sample

Config:

{
  target: "node",
  controlFlowFlattening: true
}

Code:

console.log(1); // 1
typeof a; // "undefined"

Output:

typeof (console['log'](1), a);
// Uncaught ReferenceError: a is not defined

The typeof expression is special because when checking a single Identifier node, there will not be an error thrown, even if the variable doesn't exist. This only applies on Identifier nodes, when joined in a sequence expression it will error. The fix is to make Control Flow Flattening not change typeof expressions.

shuffle: false not working

Describe the bug:

Disabling shuffle is impossible

Config and Small code sample

Config:

{
  target: "node",
  shuffle: false
}

Code:

let a = [1, 2, 3, 4, 5, 6]

Expected behavior

let a = [1, 2, 3, 4, 5, 6]

Actual behavior

let a = function (__p_5765612342) {
    for (var x = 16; x % 4 === 0; x++) {
        var z = 0;
        __p_5765612342 = __p_5765612342.concat(function () {
            z++;
            if (z === 1) {
                return [];
            }
            for (var i = 102; i; i--) {
                __p_5765612342.unshift(__p_5765612342.pop());
            }
            return [];
        }());
    }
    for (var __p_7280324068 = 19; __p_7280324068; __p_7280324068--) {
        __p_5765612342.unshift(__p_5765612342.pop());
    }
    return __p_5765612342;
}([
    2,
    3,
    4,
    5,
    6,
    1
]);

deconstructuring in for loop

Describe the bug:

It does not compile

Config and Small code sample

Config:

{
  target: "node",
  preset: "high"
}

Code:

// any of these will trigger the error, minimal reproduction example
for(const [] of []) {}
for(const {} of []) {}
for(const [] in []) {}
for(const {} in []) {}

Expected behavior

Should compile.

Actual behavior

Does not compile: TypeError: Cannot read properties of null (reading 'type')

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.