@privacyscrubber/mcp-server 2.4.2 → 2.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/mcp/server-card.json +78 -0
- package/LICENSE +23 -0
- package/README.md +1 -1
- package/index.js +2 -2
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/pii-masking-run.js +15 -10
- package/ps-license-manager.cjs +11 -261
- package/ps-license-manager.js +11 -261
- package/ps-pii-engine.cjs +8 -3611
- package/ps-pii-engine.js +8 -3611
- package/scrubber-core.cjs +8 -1801
- package/server.json +3 -3
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"serverInfo": {
|
|
3
|
+
"name": "privacyscrubber/pii-masking-mcp",
|
|
4
|
+
"version": "1.6.9"
|
|
5
|
+
},
|
|
6
|
+
"tools": [
|
|
7
|
+
{
|
|
8
|
+
"name": "sanitize_text",
|
|
9
|
+
"description": "Locally scrubs PII, secrets, and credentials (like API keys, passwords, emails, phones, names) from code, logs, or text. Replaces them with safe placeholders (e.g., [EMAIL_1], [API_KEY_1]). Keep your data secure before passing it to any LLM.",
|
|
10
|
+
"inputSchema": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"text": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "The raw text, code, or logs to sanitize."
|
|
16
|
+
},
|
|
17
|
+
"profile": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "The detection profile to use. Available: 'General' (Free), or PRO profiles: 'Dev' (Engineering/Code), 'Medical', 'Pharma', 'Legal', 'Compliance', 'CCPA', 'Finance', 'Bizops', 'Sales', 'WealthMgmt', 'Insurance', 'Accounting', 'HR', 'Security', 'Marketing', 'Support', 'RealEstate', 'Agents', 'Academic', 'Creative', 'Tech', 'Personal'. Defaults to 'General'."
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"required": ["text"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "reveal_text",
|
|
27
|
+
"description": "Replaces masked tokens (e.g., [EMAIL_1], [API_KEY_1]) in the LLM's response back with the original private data from the local volatile RAM-only session map.",
|
|
28
|
+
"inputSchema": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"properties": {
|
|
31
|
+
"text": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "The AI generated response containing placeholders to restore."
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"required": ["text"]
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "sanitize_file",
|
|
41
|
+
"description": "Reads a local file, sanitizes its contents using the selected profile, and outputs the safe version for AI analysis. Securely keeps original identifiers in memory.",
|
|
42
|
+
"inputSchema": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"properties": {
|
|
45
|
+
"file_path": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Absolute path to the file to sanitize."
|
|
48
|
+
},
|
|
49
|
+
"profile": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"description": "The detection profile to use. Available: 'General' (Free), or PRO profiles: 'Dev' (Engineering/Code), 'Medical', 'Pharma', 'Legal', 'Compliance', 'CCPA', 'Finance', 'Bizops', 'Sales', 'WealthMgmt', 'Insurance', 'Accounting', 'HR', 'Security', 'Marketing', 'Support', 'RealEstate', 'Agents', 'Academic', 'Creative', 'Tech', 'Personal'. Defaults to 'General'."
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"required": ["file_path"]
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "create_default_config",
|
|
59
|
+
"description": "Creates a default 'privacyscrubber.json' configuration file in the active workspace root directory if one does not exist. Includes template structures for custom regex rules and exclusion bypass patterns.",
|
|
60
|
+
"inputSchema": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"properties": {},
|
|
63
|
+
"required": []
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "check_status",
|
|
68
|
+
"description": "Returns the current PrivacyScrubber MCP tier, session usage, available profiles, and PRO upgrade instructions. Call this to see your license status or get setup help.",
|
|
69
|
+
"inputSchema": {
|
|
70
|
+
"type": "object",
|
|
71
|
+
"properties": {},
|
|
72
|
+
"required": []
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"resources": [],
|
|
77
|
+
"prompts": []
|
|
78
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# PrivacyScrubber MCP Server License Agreement
|
|
2
|
+
|
|
3
|
+
**Copyright (c) 2026 Ilya Sibiryakov (BrandMeWeb). All Rights Reserved.**
|
|
4
|
+
|
|
5
|
+
### 1. Grant of License — Community / Development Tier
|
|
6
|
+
Subject to the terms and conditions of this Agreement, BrandMeWeb grants you a personal, worldwide, non-exclusive, non-transferable license to install and run the PrivacyScrubber MCP Server (`@privacyscrubber/mcp-server`) in local IDE environments (such as Cursor, Windsurf, Claude Desktop, and CLI tools) solely for personal evaluation, development, and standard local data sanitization under published Free Tier quotas.
|
|
7
|
+
|
|
8
|
+
### 2. Commercial, Multi-User & Enterprise Tier
|
|
9
|
+
Use of this software within commercial organizations, production automated pipelines, CI/CD gates, high-volume batch processing, multi-seat corporate teams, or the invocation of the 30 Specialized Industry Profiles (HIPAA PHI, Financial PAN/IBAN, Legal Privilege, DevSecOps Cloud Secrets, Automotive, Telecom, Biotech) requires a valid commercial license key:
|
|
10
|
+
- **PrivacyScrubber PRO**: Individual professional use ($15/mo or $110 Lifetime).
|
|
11
|
+
- **PrivacyScrubber TEAMS**: Team and small enterprise seats ($99/mo flat).
|
|
12
|
+
- **PrivacyScrubber Enterprise / Air-Gapped**: Dedicated corporate VPC clusters, Nitro Enclaves, and custom profile calibration ($12,000/yr).
|
|
13
|
+
|
|
14
|
+
Licensing and key activation: https://privacyscrubber.com/pricing
|
|
15
|
+
|
|
16
|
+
### 3. Restrictions on Reverse-Engineering & Redistribution
|
|
17
|
+
Except as expressly authorized herein, you may not:
|
|
18
|
+
- Decompile, disassemble, reverse-engineer, or attempt to reconstruct the underlying pattern databases, regular expression taxonomies, or proprietary tokenization finite-state machines.
|
|
19
|
+
- Extract, harvest, or scrape the 30 specialized industry entity taxonomies to train competing machine learning models or build competing redaction products.
|
|
20
|
+
- Distribute, sublicense, lease, or commercially exploit standalone copies of the engine without an active Enterprise OEM agreement.
|
|
21
|
+
|
|
22
|
+
### 4. Disclaimer of Warranties & Limitation of Liability
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -482,7 +482,7 @@ Returns a visual dashboard showing your current tier, session request count, act
|
|
|
482
482
|
* **Response Example (Free Tier):**
|
|
483
483
|
```
|
|
484
484
|
╔══════════════════════════════════════════════════╗
|
|
485
|
-
║ PrivacyScrubber MCP Server v2.4.
|
|
485
|
+
║ PrivacyScrubber MCP Server v2.4.3 ║
|
|
486
486
|
╠══════════════════════════════════════════════════╣
|
|
487
487
|
║ 🔓 Tier: FREE ║
|
|
488
488
|
║ 📊 Session requests: 5 ║
|
package/index.js
CHANGED
|
@@ -352,7 +352,7 @@ export class StreamingDetokenizer {
|
|
|
352
352
|
const tailLen = 160;
|
|
353
353
|
const tail = this.pendingBuffer.length > tailLen ? this.pendingBuffer.slice(-tailLen) : this.pendingBuffer;
|
|
354
354
|
const offset = this.pendingBuffer.length > tailLen ? this.pendingBuffer.length - tailLen : 0;
|
|
355
|
-
const m = tail.match(/(?:(?:\[|【|[|〔|「|『|<|\{\{?|__?|%5[Bb]|\\u005[Bb]|&(?:amp;)?(?:#0*91;|#[xX]0*5[Bb];|lbrack;))[A-Za-z0-9_
|
|
355
|
+
const m = tail.match(/(?:(?:\[|【|[|〔|「|『|<|\{\{?|__?|%5[Bb]|\\u005[Bb]|&(?:amp;)?(?:#0*91;|#[xX]0*5[Bb];|lbrack;))[A-Za-z0-9_\-\u0410-\u044F\u0401\u0451 *`~.\\]{0,128}(?:%5?|&(?:a(?:m(?:p(?:;)?)?)?)?(?:#(?:0*9?3?|[xX]0*5?[Dd]?)?|r(?:b(?:r(?:a(?:c(?:k)?)?)?)?)?)?)?|%[0-9A-Fa-f]?|\\(?:u(?:0(?:0(?:5)?)?)?)?|&(?:a(?:m(?:p(?:;)?)?)?)?(?:#(?:0*9?1?|[xX]0*5?)?|l(?:b(?:r(?:a(?:c(?:k)?)?)?)?)?)?)$/);
|
|
356
356
|
|
|
357
357
|
if (m) {
|
|
358
358
|
const candidate = m[0];
|
|
@@ -814,7 +814,7 @@ function buildPsr2Receipt(tokenMap, timestamp = new Date().toISOString()) {
|
|
|
814
814
|
const labels = (tokenMap && typeof tokenMap === 'object' ? Object.keys(tokenMap) : []).slice().sort();
|
|
815
815
|
const counts = {};
|
|
816
816
|
for (const t of labels) {
|
|
817
|
-
const m = t.match(
|
|
817
|
+
const m = String(t).trim().match(/^(?:\[|<|\{\{|__)([A-Z0-9_]+)_\d+(?:\]|>|\}\}|__)$/);
|
|
818
818
|
const type = m ? m[1] : 'CUSTOM';
|
|
819
819
|
counts[type] = (counts[type] || 0) + 1;
|
|
820
820
|
}
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "privacyscrubber/pii-masking-mcp",
|
|
4
|
-
"version": "2.4.
|
|
4
|
+
"version": "2.4.3",
|
|
5
5
|
"description": "CISO-Approved Zero-Trust PII & Secrets Redaction MCP Server for Cursor, Windsurf, and Claude Desktop. Prevent API leaks and comply with HIPAA/SOC 2 locally.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "PrivacyScrubber",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@privacyscrubber/mcp-server",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.3",
|
|
4
4
|
"mcpName": "io.github.moxno/privacyscrubber-mcp",
|
|
5
5
|
"description": "CISO-Approved Zero-Trust PII & Secrets Redaction MCP Server for Cursor, Windsurf, and Claude Desktop. Prevent API leaks and comply with HIPAA/SOC 2 locally.",
|
|
6
6
|
"main": "index.js",
|
package/pii-masking-run.js
CHANGED
|
@@ -27,7 +27,7 @@ const cmdIndex = args.indexOf("--");
|
|
|
27
27
|
|
|
28
28
|
if (args.includes("--version") || args.includes("-v")) {
|
|
29
29
|
const pkgPath = path.resolve(__dirname, './package.json');
|
|
30
|
-
let version = '2.4.
|
|
30
|
+
let version = '2.4.3';
|
|
31
31
|
try { version = JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version; } catch (_) {}
|
|
32
32
|
console.log(`ps-guard / pii-masking-run v${version} (PrivacyScrubber MCP)`);
|
|
33
33
|
process.exit(0);
|
|
@@ -250,18 +250,23 @@ function performSanitization(text) {
|
|
|
250
250
|
if (!license.isPro && result.tokenMap) {
|
|
251
251
|
// Free tier: check for secrets and warn
|
|
252
252
|
let hasSecrets = false;
|
|
253
|
+
const SECRET_TOKEN_RE = /^\[(?:SECRET|API_TOKEN|AWS_KEY|JWT_TOKEN|STRIPE_KEY|OPENAI_KEY|DB_URI)_\d+\]$/;
|
|
253
254
|
Object.entries(result.tokenMap).forEach(([token, original]) => {
|
|
254
|
-
let isSecret =
|
|
255
|
-
|
|
256
|
-
detector
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
255
|
+
let isSecret = SECRET_TOKEN_RE.test(token);
|
|
256
|
+
if (!isSecret) {
|
|
257
|
+
for (const detector of DEVOPS_SECRETS_DETECTOR) {
|
|
258
|
+
detector.regex.lastIndex = 0;
|
|
259
|
+
if (detector.regex.test(original)) {
|
|
260
|
+
isSecret = true;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
260
263
|
}
|
|
261
264
|
}
|
|
262
265
|
if (isSecret) {
|
|
263
266
|
hasSecrets = true;
|
|
264
267
|
result.scrubbedText = result.scrubbedText.replaceAll(token, '[SECRET_BLOCKED_UPGRADE_TO_PRO]');
|
|
268
|
+
delete result.tokenMap[token];
|
|
269
|
+
delete localSessionMap[token];
|
|
265
270
|
}
|
|
266
271
|
});
|
|
267
272
|
|
|
@@ -280,7 +285,7 @@ function buildCisoAuditTelemetry(currentTokenMap = {}) {
|
|
|
280
285
|
const keys = Array.isArray(currentTokenMap) ? currentTokenMap : Object.keys(currentTokenMap);
|
|
281
286
|
for (const t of keys) {
|
|
282
287
|
const tokenStr = typeof t === 'string' ? t : (t.token || t.mask || '');
|
|
283
|
-
const match = tokenStr.match(/\[([A-
|
|
288
|
+
const match = tokenStr.match(/\[([A-Z0-9_]+)_\d+\]/);
|
|
284
289
|
const baseType = match ? match[1] : (tokenStr.replace(/\[|\]/g, '').replace(/_[0-9]+$/, '') || 'CUSTOM');
|
|
285
290
|
entities[baseType] = (entities[baseType] || 0) + 1;
|
|
286
291
|
totalCount++;
|
|
@@ -289,7 +294,7 @@ function buildCisoAuditTelemetry(currentTokenMap = {}) {
|
|
|
289
294
|
const types = Object.keys(entities);
|
|
290
295
|
let riskLevel = 'LOW EXPOSURE';
|
|
291
296
|
if (totalCount > 0) {
|
|
292
|
-
const hasHighRisk = types.some(t => ['ID', 'SSN', 'CREDIT_CARD', 'PASSPORT', 'BANK', 'API_KEY', 'SECRET', 'PASSWORD', 'MRN', 'KEY'].includes(t));
|
|
297
|
+
const hasHighRisk = types.some(t => ['ID', 'SSN', 'CREDIT_CARD', 'PASSPORT', 'BANK', 'API_KEY', 'SECRET', 'PASSWORD', 'MRN', 'KEY', 'AWS_KEY', 'STRIPE_KEY', 'JWT_TOKEN', 'API_TOKEN'].includes(t));
|
|
293
298
|
if (hasHighRisk || types.length >= 3 || totalCount >= 10) {
|
|
294
299
|
riskLevel = 'CRITICAL (HIGH EXPOSURE)';
|
|
295
300
|
} else if (types.length >= 2 || totalCount >= 3) {
|
|
@@ -399,7 +404,7 @@ function buildPsr2Receipt(tokenMap, timestamp = new Date().toISOString()) {
|
|
|
399
404
|
const labels = (tokenMap && typeof tokenMap === 'object' ? Object.keys(tokenMap) : []).slice().sort();
|
|
400
405
|
const counts = {};
|
|
401
406
|
for (const t of labels) {
|
|
402
|
-
const m = t.match(
|
|
407
|
+
const m = String(t).trim().match(/^(?:\[|<|\{\{|__)([A-Z0-9_]+)_\d+(?:\]|>|\}\}|__)$/);
|
|
403
408
|
const type = m ? m[1] : 'CUSTOM';
|
|
404
409
|
counts[type] = (counts[type] || 0) + 1;
|
|
405
410
|
}
|
package/ps-license-manager.cjs
CHANGED
|
@@ -1,261 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exp = exp / 2n;
|
|
12
|
-
base = (base * base) % mod;
|
|
13
|
-
}
|
|
14
|
-
return res;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function bigIntToString(bi) {
|
|
18
|
-
let hex = bi.toString(16);
|
|
19
|
-
if (hex.length % 2 !== 0) hex = '0' + hex;
|
|
20
|
-
let str = '';
|
|
21
|
-
for (let i = 0; i < hex.length; i += 2) {
|
|
22
|
-
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
|
|
23
|
-
}
|
|
24
|
-
return str;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function stringToBigInt(str) {
|
|
28
|
-
let hex = '';
|
|
29
|
-
for (let i = 0; i < str.length; i++) {
|
|
30
|
-
hex += str.charCodeAt(i).toString(16).padStart(2, '0');
|
|
31
|
-
}
|
|
32
|
-
return BigInt('0x' + hex);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function sha256(ascii) {
|
|
36
|
-
function rightRotate(value, amount) { return (value>>>amount) | (value<<(32 - amount)); }
|
|
37
|
-
var mathPow = Math.pow; var maxWord = mathPow(2, 32);
|
|
38
|
-
var lengthProperty = 'length'; var i, j;
|
|
39
|
-
var result = ''; var words = []; var asciiBitLength = ascii[lengthProperty]*8;
|
|
40
|
-
var hash = sha256.h = sha256.h || [];
|
|
41
|
-
var k = sha256.k = sha256.k || [];
|
|
42
|
-
var primeCounter = k[lengthProperty];
|
|
43
|
-
var isComposite = {};
|
|
44
|
-
for (var candidate = 2; primeCounter < 64; candidate++) {
|
|
45
|
-
if (!isComposite[candidate]) {
|
|
46
|
-
for (i = 0; i < 313; i += candidate) { isComposite[i] = candidate; }
|
|
47
|
-
hash[primeCounter] = (mathPow(candidate, .5)*maxWord)|0;
|
|
48
|
-
k[primeCounter++] = (mathPow(candidate, 1/3)*maxWord)|0;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
ascii += '\x80';
|
|
52
|
-
while (ascii[lengthProperty]%64 - 56) ascii += '\x00';
|
|
53
|
-
for (i = 0; i < ascii[lengthProperty]; i++) {
|
|
54
|
-
j = ascii.charCodeAt(i);
|
|
55
|
-
if (j>>8) return;
|
|
56
|
-
words[i>>2] |= j << ((3 - i)%4)*8;
|
|
57
|
-
}
|
|
58
|
-
words[words[lengthProperty]] = ((asciiBitLength/maxWord)|0);
|
|
59
|
-
words[words[lengthProperty]] = (asciiBitLength)
|
|
60
|
-
for (j = 0; j < words[lengthProperty];) {
|
|
61
|
-
var w = words.slice(j, j += 16);
|
|
62
|
-
var oldHash = hash;
|
|
63
|
-
hash = hash.slice(0, 8);
|
|
64
|
-
for (i = 0; i < 64; i++) {
|
|
65
|
-
var w15 = w[i - 15], w2 = w[i - 2];
|
|
66
|
-
var a = hash[0], e = hash[4];
|
|
67
|
-
var temp1 = hash[7] + (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + ((e&hash[5])^((~e)&hash[6])) + k[i] + (w[i] = (i < 16) ? w[i] : (w[i - 16] + (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15>>>3)) + w[i - 7] + (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2>>>10)))|0);
|
|
68
|
-
var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + ((a&hash[1])^(a&hash[2])^(hash[1]&hash[2]));
|
|
69
|
-
hash = [(temp1 + temp2)|0].concat(hash);
|
|
70
|
-
hash[4] = (hash[4] + temp1)|0;
|
|
71
|
-
}
|
|
72
|
-
for (i = 0; i < 8; i++) { hash[i] = (hash[i] + oldHash[i])|0; }
|
|
73
|
-
}
|
|
74
|
-
for (i = 0; i < 8; i++) {
|
|
75
|
-
for (j = 3; j + 1; j--) {
|
|
76
|
-
var b = (hash[i]>>(j*8))&255;
|
|
77
|
-
result += ((b < 16) ? 0 : '') + b.toString(16);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return result;
|
|
81
|
-
}
|
|
82
|
-
// ── END LICENSE CRYPTO ──
|
|
83
|
-
|
|
84
|
-
class LicenseManager {
|
|
85
|
-
/**
|
|
86
|
-
* Validates a license key universally across all environments.
|
|
87
|
-
* @param {string} key - The license key.
|
|
88
|
-
* @param {object} options - Options mapping to environment specifics.
|
|
89
|
-
* @returns {object} { valid: boolean, tier: string|null, reason?: string, expires?: number }
|
|
90
|
-
*/
|
|
91
|
-
static validate(key, options = {}) {
|
|
92
|
-
if (!key) return { valid: false, tier: null, reason: "No key provided" };
|
|
93
|
-
const rawKey = key.trim();
|
|
94
|
-
const k = rawKey.toUpperCase();
|
|
95
|
-
const parts = k.split('-');
|
|
96
|
-
|
|
97
|
-
const now = options.mockTime !== undefined && options.mockTime !== null ? options.mockTime : Date.now();
|
|
98
|
-
let lastSeen = 0;
|
|
99
|
-
|
|
100
|
-
if (options.storage) {
|
|
101
|
-
lastSeen = parseInt(options.storage.getItem('ps_last_seen_time') || '0', 10);
|
|
102
|
-
if (options.mockTime === undefined || options.mockTime === null) {
|
|
103
|
-
options.storage.setItem('ps_last_seen_time', now.toString());
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Clock rollback guard
|
|
108
|
-
if ((options.mockTime === undefined || options.mockTime === null) && now < lastSeen) {
|
|
109
|
-
if (options.onAnomaly) options.onAnomaly();
|
|
110
|
-
return { valid: false, tier: null, reason: "Clock rollback anomaly detected" };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const _atob = typeof atob !== 'undefined' ? atob : (str) => Buffer.from(str, 'base64').toString('binary');
|
|
114
|
-
|
|
115
|
-
// 1. Process Pilot Keys (RSA-1024 Encrypted Timestamps)
|
|
116
|
-
if (k.startsWith('PS-PILOT-')) {
|
|
117
|
-
try {
|
|
118
|
-
const payload = rawKey.substring(9);
|
|
119
|
-
const binary = _atob(payload);
|
|
120
|
-
const bytes = new Uint8Array(binary.length);
|
|
121
|
-
for (let i = 0; i < binary.length; i++) {
|
|
122
|
-
bytes[i] = binary.charCodeAt(i);
|
|
123
|
-
}
|
|
124
|
-
let hex = '';
|
|
125
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
126
|
-
hex += bytes[i].toString(16).padStart(2, '0');
|
|
127
|
-
}
|
|
128
|
-
const S = BigInt('0x' + hex);
|
|
129
|
-
|
|
130
|
-
const M = modPow(S, PUBLIC_KEY_E, PUBLIC_KEY_N);
|
|
131
|
-
const decryptedStr = bigIntToString(M);
|
|
132
|
-
|
|
133
|
-
if (decryptedStr.startsWith('ZTDS-PILOT-')) {
|
|
134
|
-
const expDate = parseInt(decryptedStr.substring(11), 10);
|
|
135
|
-
if (!isNaN(expDate)) {
|
|
136
|
-
if (now < expDate) return { valid: true, tier: 'TEAMS', expires: expDate };
|
|
137
|
-
|
|
138
|
-
if (options.onExpired) options.onExpired('Pilot');
|
|
139
|
-
return { valid: false, tier: null, reason: "Pilot expired" };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
} catch(e) {
|
|
143
|
-
return { valid: false, tier: null, reason: "Pilot decryption failed" };
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// 1.5. Process RSA Signed Keys (PS-RSA-...)
|
|
148
|
-
if (k.startsWith('PS-RSA-')) {
|
|
149
|
-
try {
|
|
150
|
-
const payload = rawKey.substring(7);
|
|
151
|
-
const binary = _atob(payload);
|
|
152
|
-
const bytes = new Uint8Array(binary.length);
|
|
153
|
-
for (let i = 0; i < binary.length; i++) {
|
|
154
|
-
bytes[i] = binary.charCodeAt(i);
|
|
155
|
-
}
|
|
156
|
-
let hex = '';
|
|
157
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
158
|
-
hex += bytes[i].toString(16).padStart(2, '0');
|
|
159
|
-
}
|
|
160
|
-
const S = BigInt('0x' + hex);
|
|
161
|
-
|
|
162
|
-
const M = modPow(S, PUBLIC_KEY_E, PUBLIC_KEY_N);
|
|
163
|
-
const decryptedStr = bigIntToString(M);
|
|
164
|
-
|
|
165
|
-
if (decryptedStr.startsWith('ZTDS-LIC-')) {
|
|
166
|
-
const pieces = decryptedStr.split('-');
|
|
167
|
-
if (pieces.length >= 5) {
|
|
168
|
-
const tier = pieces[2];
|
|
169
|
-
const expires = parseInt(pieces[4], 10);
|
|
170
|
-
if (!isNaN(expires)) {
|
|
171
|
-
if (now < expires) return { valid: true, tier: tier, expires: expires };
|
|
172
|
-
|
|
173
|
-
if (options.onExpired) options.onExpired('RSA');
|
|
174
|
-
return { valid: false, tier: null, reason: "RSA key expired" };
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
} catch(e) {
|
|
179
|
-
return { valid: false, tier: null, reason: "RSA decryption failed" };
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// 2. Process Modern Prefixed Keys (v1.4.2+ Salted Checksum)
|
|
184
|
-
if (parts.length === 4 && parts[0] === 'PS' && ['PRO', 'TEAMS', 'SDK', 'OEM', 'ENTERPRISE'].includes(parts[1])) {
|
|
185
|
-
const tier = parts[1];
|
|
186
|
-
const core = parts[2];
|
|
187
|
-
const checksum = parts[3];
|
|
188
|
-
const salt = "ZTDS_SALT_2026_!@#";
|
|
189
|
-
const input = core + salt + tier;
|
|
190
|
-
let sum = 0;
|
|
191
|
-
for (let i = 0; i < input.length; i++) {
|
|
192
|
-
sum += input.charCodeAt(i) * (i + 1);
|
|
193
|
-
}
|
|
194
|
-
const expectedChecksum = (sum % 9999).toString().padStart(4, '0');
|
|
195
|
-
if (checksum === expectedChecksum) {
|
|
196
|
-
return { valid: true, tier: tier };
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// 3. Process Standard RS256 JWTs (eyJ...)
|
|
201
|
-
if (rawKey.startsWith('eyJ') && rawKey.split('.').length === 3) {
|
|
202
|
-
try {
|
|
203
|
-
const [b64Header, b64Payload, b64Signature] = rawKey.split('.');
|
|
204
|
-
|
|
205
|
-
let sigStr = b64Signature.replace(/-/g, '+').replace(/_/g, '/');
|
|
206
|
-
while (sigStr.length % 4) sigStr += '=';
|
|
207
|
-
const binarySig = _atob(sigStr);
|
|
208
|
-
let hexSig = '';
|
|
209
|
-
for (let i = 0; i < binarySig.length; i++) {
|
|
210
|
-
hexSig += binarySig.charCodeAt(i).toString(16).padStart(2, '0');
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const S = BigInt('0x' + hexSig);
|
|
214
|
-
const M = modPow(S, PUBLIC_KEY_E, PUBLIC_KEY_N);
|
|
215
|
-
|
|
216
|
-
let mHex = M.toString(16);
|
|
217
|
-
if (mHex.length % 2 !== 0) mHex = '0' + mHex;
|
|
218
|
-
|
|
219
|
-
const expectedHash = sha256(b64Header + '.' + b64Payload);
|
|
220
|
-
|
|
221
|
-
if (mHex.endsWith(expectedHash)) {
|
|
222
|
-
const payloadJson = _atob(b64Payload.replace(/-/g, '+').replace(/_/g, '/'));
|
|
223
|
-
const payload = JSON.parse(payloadJson);
|
|
224
|
-
|
|
225
|
-
if (payload.exp && (now / 1000) < payload.exp) {
|
|
226
|
-
return { valid: true, tier: payload.tier || 'PRO', expires: payload.exp * 1000 };
|
|
227
|
-
} else {
|
|
228
|
-
if (options.onExpired) options.onExpired('JWT');
|
|
229
|
-
return { valid: false, tier: null, reason: "JWT expired" };
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
} catch(e) {
|
|
233
|
-
return { valid: false, tier: null, reason: "JWT validation failed" };
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return { valid: false, tier: null, reason: "Invalid format" };
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
LicenseManager.PUBLIC_KEY_N = PUBLIC_KEY_N;
|
|
242
|
-
LicenseManager.PUBLIC_KEY_E = PUBLIC_KEY_E;
|
|
243
|
-
LicenseManager.OFFLINE_KEY_SALT = "ZTDS_SALT_2026_!@#";
|
|
244
|
-
|
|
245
|
-
// Export module for ES modules, CommonJS, and Browser Global
|
|
246
|
-
if (typeof globalThis !== 'undefined') {
|
|
247
|
-
globalThis.LicenseManager = LicenseManager;
|
|
248
|
-
}
|
|
249
|
-
if (typeof global !== 'undefined') {
|
|
250
|
-
global.LicenseManager = LicenseManager;
|
|
251
|
-
}
|
|
252
|
-
if (typeof window !== 'undefined') {
|
|
253
|
-
window.LicenseManager = LicenseManager;
|
|
254
|
-
}
|
|
255
|
-
if (typeof exports !== 'undefined') {
|
|
256
|
-
if (typeof module !== 'undefined' && module.exports) {
|
|
257
|
-
module.exports = LicenseManager;
|
|
258
|
-
}
|
|
259
|
-
exports.LicenseManager = LicenseManager;
|
|
260
|
-
}
|
|
261
|
-
})(typeof globalThis !== 'undefined' ? globalThis : (typeof window !== 'undefined' ? window : this));
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* PrivacyScrubber Core Processing Engine (ZTDS)
|
|
4
|
+
* Copyright (c) 2026 PrivacyScrubber. All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* WARNING: This is proprietary, commercial software.
|
|
7
|
+
* Unauthorized copying, modification, distribution, or use of this source code,
|
|
8
|
+
* via any medium, is strictly prohibited. Protected by international copyright
|
|
9
|
+
* laws and treaties.
|
|
10
|
+
*/
|
|
11
|
+
function _0x237e(){const _0x1cec33=['mJyZnq','Cej1Eq','DcbLEa','zNDowG','otaYmG','nteXoq','CgvYqW','ndyZnW','mZiYma','wwP5AG','BKTOtG','zxHW','wvHyza','mJqYoa','zxLk','zgjsAG','mdG1nW','Exb0Aq','nZu4nJa4ogDjBeLACG','mte0oq','wfvYsG','nZCXnW','mJm4oq','vf8Yma','nta2mZyZovnhs29Qyq','odyXmG','v0DMwa','nZG2oq','nJi2ma','odq5nW','nJa4mW','rvLFrq','x1nbta','C2vLBG','mJC2oq','mZG4nG','BNnLtq','yxn0xW','DhjPBq','odmXnW','zgf0Aq','odu1oq','nJy4mq','mJa2nq','nZCWnG','ndyWoa','DgvK','mta0ma','mZiXoq','mtiWmq','tKXOvW','C3rHCG','ufjp','su5fxW','u0eT','wLreuW','Dg9vCa','ntK2na','ntGXoa','ndi1mW','nZyXna','mZGXmW','B25fEa','DLLiqq','mJbdquL5DNi','mJa2nG','yMfZzq','Dg9tDa','zNjVBq','s2PNDq','BgvK','C0DjtW','BM93','odG1nW','yxnL','nZK3oq','zxrLyW','DcbKzq','vgHeBq','rvLFtG','C3vICW','z2v0sq','ndy3oa','B25bBG','zM9YBq','otG2oa','ufvcta','nJa1nG','y2HHCG','mtqYmq','ChnFBa','mtu0oq','mtK3na','nta0na','zxHWAq','oteYnq','mJmZna','nJG4na','mJG1mG','B24GzG','mZuYmq','nJm0nW','ote2oq','otm5nq','ndeYoq','mdmXmq','ndaWnW','otaZnW','ota4ma','mZC2ma','lvbjta','ntu0nW','DgvT','CgfYCW','mZyWoa','ndKXnq','tM8GAW','nJqYma','qNPPCq','v2L0Aa','ody2mG','r29tEa','zgvK','nZyWmW','mdy5na','BM9Tyq','u0fmva','mtmZnG','nZq3ma','BhKGza','odCYoq','y0DODa','uLnb','Aw5JBa','odyYoa','sLDuia','Cxvuyq','odiXmG','mZb2uu5ZAwy','t1qT','wLjTAa','nty3ma','y3j5Ca','uLbssq','t0vn','nta1oa','oti5na','ntaZnG','wfzquq','mtyWmG','mte3mq','DgLVBG','uNz4za','mJeZmq','mJzFiq','mZy5ma','mtyYnG','nJu1na','DgfYDa','sunFsW','Dw5Kzq','nJG5oq','ndq3nW','mJCXmq','ntaXnW','mdGYoq','C3rVCG','re5mAW','vgLTzq','mJuYnW','uLnbia','ufmTua','shD4zq','mJy4ma','rgrzrW','uNrWra','mdG2nq','nti0mG','otyWoq','A2v5ia','mti3mJiZnZnLsMXyrgy','uMHgsG','otm3oq','tgLJzq','q2XVyW','ntC0oq','AKr5Eq','C2v0sq','suXpva','ntC0nG','Cg93','B21HBa','t0zgta','ywLSzq','ndy4ma','ntu4nW','sw52yq','vhvYsW','y3PbCq','yw5HzW','x3rPBq','CM92Aq','CMLUzW','mZa5nG','DhjPBG','CNrZ','nZm1oa','mdmYma','BgLKia','zgvJCG','yLHWwG','mJK2ma','nZyWnq','mdy0nW','ntaZna','nM1SvgPowa','nJKXmG','mtCYoq','igzHAq','C3bSAq','nZqYna','CgLYzq','odiZnW','zw5KCW','nZmXmG','ndC3mG','whv3uW','uxnwsW','nJmWmW','mJeYnW','nJq5oq','mZC3ndu3nMj2y25kDG','otKWma','nty5mG','sLDu','ntG4na','q29Kzq','s1nhDq','nZu5nq','A0HyuG','ndG4mG','mZGWmW','nZa4nW','ugLSBW','CMvWBa','nZaYmG','ANHosG','mty0oa','DgLLCG','BgXIyq','odGZnty1t25jtw5L','y29UyW','mdu5mq','mJC2nW','nZmWoa','nJiXmq','oda1nW','ntmXoq','mtKWnq','odK3oq','ode0mG','ndu2mG','luXjqW','mtqXmq','mZqYmZu2zu1HzNLi','ote4mG','mZq4nG','BgvUzW','CgfKuW','rxPOEG','C2XPyW','ywnL','ntaXoq','nte1oa','nJC4mq','q2HHCG','zxKGCa','odeWnq','yMLUyq','mdC1na','mZq5na','BfHgCW','AKPlBG','mJu4mq','mta5nW','CMvK','nde1mW','odKYnq','mtC1nJy2nK1tCKz3zq','Bw9JAW','y2SGyq','ufmTuG','nZa2mq','tw9sCa','ywDL','ru5urq','mJe4oa','DMfSAq','DwrLCW','zMLUzq','mZu0ma','AYbYBW','odqYoq','zxHWBW','vevbtq','s0vzxW','nZq2mq','nde0oq','ndC5nG','mJCZna','nta4nG','DhnxAq','nJi0mG','rMzPvW','D0rhua','u0rl','ody1mG','nJKZmG','mdq4nq'];_0x237e=function(){return _0x1cec33;};return _0x237e();}function _0x2fed(_0x251c0e,_0x5068d3){_0x251c0e=_0x251c0e-0x150;const _0x237ef4=_0x237e();let _0x2fedad=_0x237ef4[_0x251c0e];if(_0x2fed['DFEvSY']===undefined){var _0x1d0f41=function(_0x5ce074){const _0x1bc1df='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5c3876='',_0x1ffe45='';for(let _0x12dd67=0x0,_0x17db97,_0x26100e,_0x3c7550=0x0;_0x26100e=_0x5ce074['charAt'](_0x3c7550++);~_0x26100e&&(_0x17db97=_0x12dd67%0x4?_0x17db97*0x40+_0x26100e:_0x26100e,_0x12dd67++%0x4)?_0x5c3876+=String['fromCharCode'](0xff&_0x17db97>>(-0x2*_0x12dd67&0x6)):0x0){_0x26100e=_0x1bc1df['indexOf'](_0x26100e);}for(let _0x3b25fb=0x0,_0x55416b=_0x5c3876['length'];_0x3b25fb<_0x55416b;_0x3b25fb++){_0x1ffe45+='%'+('00'+_0x5c3876['charCodeAt'](_0x3b25fb)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1ffe45);};_0x2fed['ouKyYX']=_0x1d0f41,_0x2fed['iDRBkx']={},_0x2fed['DFEvSY']=!![];}const _0x547b5c=_0x237ef4[0x0],_0x19e3fa=_0x251c0e+_0x547b5c,_0x35a883=_0x2fed['iDRBkx'][_0x19e3fa];return!_0x35a883?(_0x2fedad=_0x2fed['ouKyYX'](_0x2fedad),_0x2fed['iDRBkx'][_0x19e3fa]=_0x2fedad):_0x2fedad=_0x35a883,_0x2fedad;}const _0x3ba9aa=_0x2fed,_0x3f9338=_0x2fed;(function(_0x218b8e,_0x350524){const _0x470868={_0x3c3e98:0x247,_0x4a1a6e:0x25f,_0x238187:0x226,_0x4ba6e2:0x17f,_0x3d9084:0x239,_0x3b1a01:0x216,_0x343c93:0x157,_0x1caf21:0x151,_0x1d7519:0x1f3,_0x5b282:0x1c9},_0x2949a7=_0x2fed,_0xa34ef3=_0x2fed,_0x5d957d=_0x218b8e();while(!![]){try{const _0x4a1b50=parseInt(_0x2949a7(_0x470868._0x3c3e98))/0x1+parseInt(_0xa34ef3(_0x470868._0x4a1a6e))/0x2+parseInt(_0xa34ef3(_0x470868._0x238187))/0x3+-parseInt(_0xa34ef3(_0x470868._0x4ba6e2))/0x4*(-parseInt(_0x2949a7(_0x470868._0x3d9084))/0x5)+-parseInt(_0xa34ef3(_0x470868._0x3b1a01))/0x6*(-parseInt(_0xa34ef3(_0x470868._0x343c93))/0x7)+parseInt(_0x2949a7(_0x470868._0x1caf21))/0x8+parseInt(_0x2949a7(_0x470868._0x1d7519))/0x9*(-parseInt(_0xa34ef3(_0x470868._0x5b282))/0xa);if(_0x4a1b50===_0x350524)break;else _0x5d957d['push'](_0x5d957d['shift']());}catch(_0xb099e9){_0x5d957d['push'](_0x5d957d['shift']());}}}(_0x237e,0xc1acd),function(_0x5caef8){const _0x33efa7={_0x409f96:0x199,_0xd4d383:0x160,_0x43d64c:0x1df,_0x3583ec:0x26a,_0x5c1e34:0x1ea,_0x41d8c5:0x1fb,_0x29b97a:0x176,_0x2507b0:0x1ad,_0x3643dd:0x1ca,_0x3ce037:0x232,_0x523fb7:0x1c3,_0x28d84a:0x27a,_0xcc184d:0x156,_0x3faaa9:0x1d9,_0x36f061:0x1c6,_0x4fd497:0x19d,_0x4233b7:0x25c,_0x5bd3b0:0x1d8,_0x39c2d3:0x16e,_0x64bdbe:0x215,_0x59874c:0x19f,_0x365493:0x1f0,_0x4b53d6:0x230,_0x371773:0x1ec,_0x420848:0x24f,_0x2f8892:0x25d,_0x5836bf:0x23f,_0x41d241:0x22d,_0x2c2ed0:0x1b1,_0x11f407:0x1f1,_0x2f202a:0x1ab,_0x2fb9ef:0x28b,_0x25a81c:0x218,_0x138f5e:0x213,_0x1fd857:0x228,_0x43e4d3:0x267,_0x13f0d9:0x254,_0x348ca5:0x1dc,_0x3ea806:0x170,_0x9fbade:0x1aa,_0x11246b:0x285,_0x35d619:0x224,_0x879031:0x188,_0x1066f6:0x241,_0x3f05f0:0x155,_0x21e057:0x15d,_0x486184:0x225,_0x5c86db:0x256,_0x2d339d:0x1f5,_0x4a3354:0x19e,_0x1c6349:0x16c,_0x124560:0x1e2,_0x437763:0x274,_0x57ded7:0x1e1,_0x2341b6:0x22f,_0x3a8e95:0x15a,_0x48b2f2:0x201,_0x1ddbcb:0x1ef,_0x320592:0x20a,_0x4720ee:0x1c5,_0x188ba5:0x152,_0x600d98:0x1a7,_0x175367:0x19a,_0x528389:0x275,_0x284b84:0x1db,_0x393533:0x25a,_0x3a0d44:0x1e4,_0x155886:0x251,_0x4348bf:0x25e,_0x4f97ca:0x166,_0x1eb39b:0x198,_0x39e121:0x196,_0x4d0608:0x242,_0x28c5e8:0x214,_0x433644:0x21d,_0x10fe83:0x1c1,_0x52c909:0x286,_0x172df2:0x282,_0x26b85a:0x179,_0x51a724:0x15c,_0x1bd2ba:0x277,_0x575c52:0x27c,_0x5b7d70:0x244,_0x1a300b:0x27b,_0xfbc460:0x1b4,_0x3b51a1:0x21b,_0x203546:0x249,_0xcd7a75:0x1b7,_0x2f5d24:0x1be,_0x2a3765:0x1a6,_0x1f956d:0x220,_0x26f735:0x1cc,_0x11e0e7:0x161,_0x4c4d00:0x15b,_0x471744:0x21f,_0x5fbebd:0x1f8,_0x102390:0x178,_0x3c61ad:0x16a,_0x5b7a46:0x1d1,_0x3c3bb0:0x23e,_0x156aa4:0x272,_0x5d1a38:0x212,_0x1d1875:0x1d0,_0x46c58a:0x1ac,_0x5d7244:0x1c8,_0x22aad1:0x23d,_0x3284be:0x1b2,_0x332abc:0x1a3,_0x54de87:0x19b,_0xfe9aeb:0x248,_0x5ef732:0x273,_0x93441c:0x162,_0x113d0c:0x223,_0x5220d7:0x1d2,_0xfde595:0x26d,_0x414dcf:0x28e,_0x45bef7:0x22a,_0x4d7fe6:0x231,_0x157166:0x217,_0x2fe2a3:0x1da,_0x559e6c:0x227,_0x47ea1e:0x1e3,_0x5f26d7:0x257,_0x2ba857:0x1d4,_0x809e27:0x27e,_0x429f40:0x246,_0x5947ba:0x16b,_0x476b42:0x1a5,_0x22f550:0x195,_0x209e6c:0x1de,_0xfd22da:0x18e,_0x5c04d8:0x1de,_0x1ea8a4:0x15e,_0x193b23:0x174,_0x29f4ce:0x270,_0x4ae373:0x1bd,_0x4b3611:0x176,_0x5b14f0:0x15f,_0x43bb5e:0x1f6,_0x1e2247:0x163,_0x3eadb3:0x163,_0x397407:0x206,_0x32c745:0x1f6,_0x10fea0:0x206,_0x2236d6:0x26e,_0x32d43c:0x26e,_0x2a5017:0x20c,_0x592dad:0x163},_0x223d04={_0x185981:0x1b3,_0x4ff20a:0x253,_0x341bca:0x208,_0x50b241:0x165,_0x1ff7cd:0x177,_0x4580d8:0x21a,_0x385a26:0x260,_0x13d929:0x1e7,_0x5d92cf:0x260,_0xa8b3d:0x1e7,_0x46af88:0x187,_0x5d239f:0x265,_0xec027e:0x1e5,_0x2523dd:0x190,_0x944062:0x199,_0x1ca49b:0x164,_0x198b14:0x160,_0x429070:0x207,_0x51f14f:0x260,_0x4abce5:0x265,_0x502515:0x1fa,_0xb0158e:0x1af,_0xda68a8:0x27f,_0x3dc4cc:0x182,_0x1f8c54:0x209,_0x520627:0x260,_0x4e68cd:0x260,_0x59a88f:0x1e7,_0x614980:0x1fe,_0x514a91:0x1f7,_0x20ece7:0x26c,_0x26b323:0x238,_0xd9da38:0x261,_0x5661ef:0x1bc,_0xd73071:0x1c0,_0x3c304d:0x18b,_0x83974a:0x16d,_0x527f64:0x1eb,_0x11740d:0x172,_0x5dc136:0x276,_0x24c8eb:0x17e,_0x1cf550:0x18f,_0x22fb7e:0x20b,_0x4d760b:0x24a,_0x13adb7:0x1b8,_0x5cfb16:0x24a,_0x5c0b7c:0x197,_0x6ace2b:0x22b,_0x49de57:0x182,_0x1ad3a1:0x1dd,_0x1c9364:0x221,_0x3b6bd1:0x1e6,_0x5a8500:0x171,_0x2082a8:0x18f,_0x4831b4:0x26f,_0x43b998:0x21c,_0x394bdd:0x28a,_0xdee3f6:0x232,_0x4c98e1:0x280,_0x2127b6:0x1cd,_0x2193b4:0x1d6,_0x569f3c:0x219,_0x29d9e6:0x185,_0x304f3b:0x172,_0x5a8604:0x276,_0x22e9d1:0x262,_0x336ac3:0x175,_0x523d5c:0x24a,_0x197204:0x24b,_0x460fd0:0x276,_0x49029e:0x176,_0x26ffc7:0x245,_0x18af31:0x24a,_0x55d158:0x17d,_0x194246:0x21c,_0x21cb2d:0x1ed,_0x195c55:0x1e9,_0xedabe2:0x1f2,_0x4ca47a:0x19d,_0x2f2ec4:0x1a2,_0xf92ec6:0x200,_0xb9b55c:0x173,_0x2d5932:0x26f,_0x571bf4:0x205,_0x4905a0:0x1cf,_0x476085:0x266,_0x180d2d:0x1ce,_0x105876:0x1c4,_0x22740b:0x269,_0x15a28a:0x1f4,_0x5826f2:0x22e,_0x3b3c0d:0x197,_0x493b25:0x22c,_0x4dbeb4:0x28d,_0x26b4a1:0x233,_0x362546:0x233,_0x4dbf72:0x24e,_0x3b1783:0x279,_0x1fcbde:0x24a,_0x18b35a:0x197,_0x26bf9e:0x22b,_0x1ac48e:0x209,_0x376726:0x1dd,_0x4aa716:0x182,_0x1cf295:0x1c7,_0x30f8cf:0x259,_0x27e63e:0x21e,_0x98d1c7:0x1b6,_0x2ea9eb:0x264,_0x26d7da:0x233,_0x3de7c9:0x24e,_0x402851:0x24e,_0x1cd9c6:0x1b0,_0x369daf:0x289,_0x9ba96e:0x289,_0x4ed265:0x237,_0x128e87:0x288,_0x51d621:0x229,_0x120922:0x1d7,_0x55462e:0x1c6,_0x4730cd:0x268,_0x191717:0x167,_0x5c654b:0x203,_0x2073ef:0x20f},_0x410d7c={_0xb2a7f9:0x1fd,_0x44a43a:0x1b5,_0x3de973:0x281,_0x3fec52:0x197,_0x274435:0x159,_0x3aa05f:0x24d,_0x595bcf:0x235,_0x1cd75b:0x222,_0x3d03b7:0x18d,_0x46e268:0x1c2,_0x5f5885:0x278,_0x17e797:0x1ee,_0x5df99b:0x258,_0x1d924f:0x287,_0x3cb83f:0x1f9,_0x4a66b2:0x204,_0x37df93:0x153,_0x377aa5:0x1cb,_0x1b8f3b:0x182},_0x454903={_0x981e11:0x24a,_0x208f7d:0x22b,_0x4c774d:0x209,_0x20eb94:0x24b,_0xa9b33e:0x1dd},_0x57f658={_0x3527b7:0x182,_0x10d587:0x24a,_0x3d70a2:0x183,_0x3955ee:0x252,_0x134678:0x22b,_0x42399b:0x1b5,_0x41e2e8:0x18f},_0x560926={_0x50d7fd:0x24c,_0x188070:0x1c7},_0xefc815=_0x2fed,_0x542075=_0x2fed,_0x3844e7={'Ezhzh':function(_0xba07d5,_0x1b242d){return _0xba07d5/_0x1b242d;},'quTad':function(_0x40a1a8,_0x35c5b6){return _0x40a1a8%_0x35c5b6;},'fwNZf':function(_0x2ce55a,_0x1dd2c1){return _0x2ce55a*_0x1dd2c1;},'Bziqe':function(_0x4cf663,_0x3ee7ec,_0x4f128f){return _0x4cf663(_0x3ee7ec,_0x4f128f);},'Kjguq':function(_0x4229c5,_0x595704){return _0x4229c5/_0x595704;},'WGfXC':function(_0x150ba6,_0x3960ef){return _0x150ba6>>_0x3960ef;},'bXpZm':function(_0x2a40a2,_0x18efd1){return _0x2a40a2<<_0x18efd1;},'jxNJE':function(_0x1be6f0,_0xa86b14,_0x106ecd){return _0x1be6f0(_0xa86b14,_0x106ecd);},'QsVKP':function(_0x2671b0,_0x1e23ce){return _0x2671b0^_0x1e23ce;},'ThDmF':function(_0x31ee90,_0x457761){return _0x31ee90|_0x457761;},'cGhtN':function(_0x722424,_0x42814d){return _0x722424+_0x42814d;},'FfiWv':function(_0x48b3b9,_0xbeb5df){return _0x48b3b9+_0xbeb5df;},'RtpDV':function(_0x58f2f8,_0x277a3b){return _0x58f2f8^_0x277a3b;},'lXFsl':function(_0x47f40b,_0x49d5cb,_0x20e5b8){return _0x47f40b(_0x49d5cb,_0x20e5b8);},'YjyjJ':function(_0x3dbcfb,_0x107b80,_0x124320){return _0x3dbcfb(_0x107b80,_0x124320);},'jDyys':function(_0x10029e,_0x3b5683,_0x57d593){return _0x10029e(_0x3b5683,_0x57d593);},'TurKa':function(_0x37857d,_0x4b6728){return _0x37857d^_0x4b6728;},'XUrJL':function(_0x18d53a,_0x4d4fcc){return _0x18d53a&_0x4d4fcc;},'ZRmhL':function(_0x46cd7,_0x402011){return _0x46cd7&_0x402011;},'pBuyI':_0xefc815(_0x33efa7._0x409f96)+_0x542075(0x164)+_0x542075(_0x33efa7._0xd4d383)+_0x542075(0x207)+'e','Hwxeg':_0x542075(_0x33efa7._0x43d64c)+_0x542075(_0x33efa7._0x3583ec)+'d','vYHAk':_0xefc815(_0x33efa7._0x5c1e34)+_0x542075(_0x33efa7._0x41d8c5)+'-','GoSxc':function(_0x2b60aa,_0x8bdb2e){return _0x2b60aa<_0x8bdb2e;},'XuwST':function(_0x54a188,_0x575d3a){return _0x54a188+_0x575d3a;},'DNLkn':function(_0x2e7240,_0x58d72b,_0x32cb48,_0x538a72){return _0x2e7240(_0x58d72b,_0x32cb48,_0x538a72);},'NLhWI':_0x542075(_0x33efa7._0x29b97a)+_0x542075(_0x33efa7._0x2507b0)+_0x542075(_0x33efa7._0x3643dd),'YXXdG':_0xefc815(_0x33efa7._0x3ce037)+'t','DdYGn':_0x542075(_0x33efa7._0x523fb7),'czAqz':_0xefc815(_0x33efa7._0x28d84a),'RhFJZ':_0xefc815(_0x33efa7._0x29b97a)+_0xefc815(0x15f)+_0xefc815(_0x33efa7._0xcc184d)+_0x542075(_0x33efa7._0x3faaa9)+'@#','kHXRd':function(_0x425ed5,_0x32ae20){return _0x425ed5+_0x32ae20;},'KSGux':function(_0x27ec11,_0x71ca03){return _0x27ec11+_0x71ca03;},'dbRjC':function(_0x515451,_0x6c3f7f){return _0x515451===_0x6c3f7f;},'wDGPR':function(_0x370ba2,_0x3a8f0f){return _0x370ba2%_0x3a8f0f;},'jJKnd':function(_0x132ce3,_0x158364){return _0x132ce3+_0x158364;},'MoRpg':function(_0x5cd580,_0x19f1e5){return _0x5cd580(_0x19f1e5);},'nKhNF':_0xefc815(0x173),'Rvxdb':_0xefc815(_0x33efa7._0x36f061)+_0xefc815(_0x33efa7._0x4fd497)+_0xefc815(_0x33efa7._0x4233b7)},_0x3d1e25=BigInt(_0x542075(_0x33efa7._0x5bd3b0)+_0xefc815(0x18a)+_0x542075(_0x33efa7._0x39c2d3)+_0x542075(_0x33efa7._0x64bdbe)+_0x542075(0x191)+_0x542075(_0x33efa7._0x59874c)+_0x542075(_0x33efa7._0x365493)+_0xefc815(_0x33efa7._0x4b53d6)+_0x542075(0x194)+_0x542075(0x1a0)+_0xefc815(_0x33efa7._0x371773)+_0x542075(_0x33efa7._0x420848)+_0x542075(_0x33efa7._0x2f8892)+_0x542075(_0x33efa7._0x5836bf)+_0xefc815(_0x33efa7._0x41d241)+_0xefc815(_0x33efa7._0x2c2ed0)+_0xefc815(_0x33efa7._0x11f407)+_0xefc815(_0x33efa7._0x2f202a)+_0xefc815(_0x33efa7._0x2fb9ef)+_0x542075(_0x33efa7._0x25a81c)+_0xefc815(_0x33efa7._0x138f5e)+_0x542075(_0x33efa7._0x1fd857)+_0xefc815(_0x33efa7._0x43e4d3)+_0x542075(_0x33efa7._0x13f0d9)+_0xefc815(_0x33efa7._0x348ca5)+_0xefc815(_0x33efa7._0x3ea806)+_0x542075(0x16f)+_0xefc815(_0x33efa7._0x9fbade)+_0x542075(_0x33efa7._0x11246b)+_0x542075(_0x33efa7._0x35d619)+_0xefc815(0x17b)+_0xefc815(_0x33efa7._0x879031)+_0xefc815(_0x33efa7._0x1066f6)+_0xefc815(0x240)+_0xefc815(_0x33efa7._0x3f05f0)+_0x542075(_0x33efa7._0x21e057)+_0xefc815(_0x33efa7._0x486184)+_0xefc815(_0x33efa7._0x5c86db)+_0x542075(_0x33efa7._0x2d339d)+_0xefc815(_0x33efa7._0x4a3354)+_0x542075(_0x33efa7._0x1c6349)+_0xefc815(0x25b)+_0xefc815(_0x33efa7._0x124560)+_0x542075(_0x33efa7._0x437763)+_0x542075(_0x33efa7._0x57ded7)+_0x542075(0x27d)+_0x542075(_0x33efa7._0x2341b6)+_0x542075(_0x33efa7._0x3a8e95)+_0x542075(_0x33efa7._0x48b2f2)+_0xefc815(0x1ae)+_0x542075(0x1a8)+_0xefc815(0x17a)+_0xefc815(_0x33efa7._0x1ddbcb)+_0x542075(0x19c)+_0xefc815(_0x33efa7._0x320592)+_0xefc815(_0x33efa7._0x4720ee)+_0x542075(0x1ba)+_0xefc815(_0x33efa7._0x188ba5)+_0x542075(_0x33efa7._0x600d98)+_0xefc815(_0x33efa7._0x175367)+_0x542075(_0x33efa7._0x528389)+_0x542075(0x250)+_0xefc815(0x20d)+_0x542075(_0x33efa7._0x284b84)+_0xefc815(0x158)+_0x542075(_0x33efa7._0x393533)+_0xefc815(_0x33efa7._0x3a0d44)+_0xefc815(_0x33efa7._0x155886)+_0x542075(_0x33efa7._0x4348bf)+_0x542075(_0x33efa7._0x4f97ca)+_0xefc815(_0x33efa7._0x1eb39b)+_0xefc815(_0x33efa7._0x39e121)+_0xefc815(0x1e0)+_0x542075(_0x33efa7._0x4d0608)+_0xefc815(_0x33efa7._0x28c5e8)+_0x542075(_0x33efa7._0x433644)+_0x542075(_0x33efa7._0x10fe83)+_0xefc815(_0x33efa7._0x52c909)+_0x542075(0x154)+_0xefc815(_0x33efa7._0x172df2)+_0x542075(_0x33efa7._0x26b85a)+_0xefc815(_0x33efa7._0x51a724)+_0x542075(_0x33efa7._0x1bd2ba)+_0xefc815(0x263)+_0xefc815(_0x33efa7._0x575c52)+_0xefc815(0x26b)+_0xefc815(_0x33efa7._0x5b7d70)+_0xefc815(_0x33efa7._0x1a300b)+_0xefc815(_0x33efa7._0xfbc460)+_0xefc815(_0x33efa7._0x3b51a1)+_0xefc815(_0x33efa7._0x203546)+_0xefc815(0x168)+_0xefc815(_0x33efa7._0xcd7a75)+_0xefc815(0x1d5)+_0xefc815(0x1a4)+_0xefc815(_0x33efa7._0x2f5d24)+_0x542075(0x243)+_0x542075(_0x33efa7._0x2a3765)+_0xefc815(_0x33efa7._0x1f956d)+_0x542075(_0x33efa7._0x26f735)+_0xefc815(0x1fc)+_0xefc815(_0x33efa7._0x11e0e7)+_0x542075(_0x33efa7._0x4c4d00)+_0x542075(_0x33efa7._0x471744)+_0xefc815(_0x33efa7._0x5fbebd)+_0xefc815(_0x33efa7._0x102390)+_0xefc815(_0x33efa7._0x3c61ad)+_0xefc815(_0x33efa7._0x5b7a46)+_0x542075(_0x33efa7._0x3c3bb0)+_0x542075(_0x33efa7._0x156aa4)+_0xefc815(_0x33efa7._0x5d1a38)+_0x542075(0x169)+_0xefc815(0x1e8)+_0xefc815(_0x33efa7._0x1d1875)+_0xefc815(_0x33efa7._0x46c58a)+_0xefc815(_0x33efa7._0x5d7244)+_0x542075(_0x33efa7._0x22aad1)+_0x542075(0x1bf)+_0x542075(_0x33efa7._0x3284be)+_0x542075(_0x33efa7._0x332abc)+_0xefc815(_0x33efa7._0x54de87)+_0x542075(0x234)+_0xefc815(_0x33efa7._0xfe9aeb)+_0x542075(_0x33efa7._0x5ef732)+_0xefc815(_0x33efa7._0x93441c)+_0x542075(_0x33efa7._0x113d0c)+_0x542075(_0x33efa7._0x5220d7)+_0xefc815(0x283)+_0x542075(0x180)+_0x542075(0x23c)+_0xefc815(0x23b)+_0x542075(0x1a9)+_0x542075(0x1a1)+_0x542075(0x17c)+_0xefc815(0x271)+_0xefc815(_0x33efa7._0xfde595)+_0xefc815(_0x33efa7._0x414dcf)+_0xefc815(_0x33efa7._0x10fe83)+_0x542075(_0x33efa7._0x45bef7)+_0xefc815(_0x33efa7._0x4d7fe6)+_0xefc815(_0x33efa7._0x157166)+_0xefc815(_0x33efa7._0x2fe2a3)+_0x542075(_0x33efa7._0x559e6c)+_0xefc815(_0x33efa7._0x47ea1e)+_0x542075(0x20e)+_0xefc815(_0x33efa7._0x5f26d7)+_0x542075(_0x33efa7._0x2ba857)+_0xefc815(0x1bb)+_0xefc815(0x236)+_0x542075(_0x33efa7._0x809e27)+_0x542075(_0x33efa7._0x429f40)+_0x542075(_0x33efa7._0x5947ba)+_0x542075(0x202)+_0xefc815(_0x33efa7._0x476b42)+'1'),_0x5dd816=0x10001n;function _0x1aeaf4(_0x4ac942,_0x46259f,_0x512d06){const _0x4ee035=_0xefc815,_0xcb3e65=_0xefc815;let _0x3d1e6d=0x1n;_0x4ac942=_0x4ac942%_0x512d06;while(_0x46259f>0x0n){if(_0x46259f%0x2n===0x1n)_0x3d1e6d=_0x3d1e6d*_0x4ac942%_0x512d06;_0x46259f=_0x3844e7[_0x4ee035(_0x560926._0x50d7fd)+'h'](_0x46259f,0x2n),_0x4ac942=_0x3844e7[_0x4ee035(_0x560926._0x188070)+'d'](_0x3844e7[_0xcb3e65(0x281)+'f'](_0x4ac942,_0x4ac942),_0x512d06);}return _0x3d1e6d;}function _0x4646f8(_0x51195e){const _0x3e43e7=_0x542075,_0x14df76=_0x542075;let _0x9f48e2=_0x51195e[_0x3e43e7(_0x57f658._0x3527b7)+_0x14df76(0x209)](0x10);if(_0x9f48e2[_0x14df76(0x24a)+'th']%0x2!==0x0)_0x9f48e2='0'+_0x9f48e2;let _0x2c4a08='';for(let _0x38c17c=0x0;_0x38c17c<_0x9f48e2[_0x3e43e7(_0x57f658._0x10d587)+'th'];_0x38c17c+=0x2){_0x2c4a08+=String[_0x3e43e7(_0x57f658._0x3d70a2)+_0x3e43e7(_0x57f658._0x3955ee)+_0x14df76(_0x57f658._0x134678)](_0x3844e7[_0x3e43e7(_0x57f658._0x42399b)+'e'](parseInt,_0x9f48e2[_0x14df76(_0x57f658._0x41e2e8)+'tr'](_0x38c17c,0x2),0x10));}return _0x2c4a08;}function _0x18c427(_0x5f12e0){const _0x9c715c=_0xefc815,_0x483393=_0xefc815;let _0x2bb0cd='';for(let _0x3d4f91=0x0;_0x3d4f91<_0x5f12e0[_0x9c715c(_0x454903._0x981e11)+'th'];_0x3d4f91++){_0x2bb0cd+=_0x5f12e0[_0x483393(0x197)+_0x483393(_0x454903._0x208f7d)+'At'](_0x3d4f91)[_0x9c715c(0x182)+_0x483393(_0x454903._0x4c774d)](0x10)[_0x483393(_0x454903._0x20eb94)+_0x9c715c(_0x454903._0xa9b33e)](0x2,'0');}return BigInt('0x'+_0x2bb0cd);}function _0x5b2d4e(_0x32cc4d){const _0x6de7fa={_0x27d742:0x186},_0x37eab3=_0x542075,_0x480ada=_0x542075,_0x1f8783={'sGIOQ':function(_0x15b815,_0x25cf6b){return _0x15b815>>>_0x25cf6b;},'XVPQk':function(_0x1422ce,_0x5632ea){return _0x1422ce-_0x5632ea;}};function _0x3af257(_0x1b4cbe,_0x3e4518){const _0x562a0c=_0x2fed,_0x4347b3=_0x2fed;return _0x1f8783[_0x562a0c(_0x6de7fa._0x27d742)+'Q'](_0x1b4cbe,_0x3e4518)|_0x1b4cbe<<_0x1f8783[_0x4347b3(0x1d3)+'k'](0x20,_0x3e4518);}var _0x26ff49=Math[_0x37eab3(_0x410d7c._0xb2a7f9)],_0x1aff0f=_0x26ff49(0x2,0x20),_0x5691b5=_0x480ada(0x24a)+'th',_0x1c5e5c,_0x5e0462,_0x4641b7='',_0xd8498f=[],_0xca9d31=_0x32cc4d[_0x5691b5]*0x8,_0x560255=_0x5b2d4e['h']=_0x5b2d4e['h']||[],_0x263876=_0x5b2d4e['k']=_0x5b2d4e['k']||[],_0x1b4499=_0x263876[_0x5691b5],_0x1b3acc={};for(var _0x3b1a36=0x2;_0x1b4499<0x40;_0x3b1a36++){if(!_0x1b3acc[_0x3b1a36]){for(_0x1c5e5c=0x0;_0x1c5e5c<0x139;_0x1c5e5c+=_0x3b1a36){_0x1b3acc[_0x1c5e5c]=_0x3b1a36;}_0x560255[_0x1b4499]=_0x3844e7[_0x480ada(_0x410d7c._0x44a43a)+'e'](_0x26ff49,_0x3b1a36,0.5)*_0x1aff0f|0x0,_0x263876[_0x1b4499++]=_0x3844e7[_0x37eab3(_0x410d7c._0x3de973)+'f'](_0x26ff49(_0x3b1a36,_0x3844e7[_0x37eab3(0x184)+'q'](0x1,0x3)),_0x1aff0f)|0x0;}}_0x32cc4d+='\u0080';while(_0x32cc4d[_0x5691b5]%0x40-0x38)_0x32cc4d+='\x00';for(_0x1c5e5c=0x0;_0x1c5e5c<_0x32cc4d[_0x5691b5];_0x1c5e5c++){_0x5e0462=_0x32cc4d[_0x480ada(_0x410d7c._0x3fec52)+_0x37eab3(0x22b)+'At'](_0x1c5e5c);if(_0x3844e7[_0x37eab3(_0x410d7c._0x274435)+'C'](_0x5e0462,0x8))return;_0xd8498f[_0x1c5e5c>>0x2]|=_0x3844e7[_0x480ada(0x211)+'m'](_0x5e0462,(0x3-_0x1c5e5c)%0x4*0x8);}_0xd8498f[_0xd8498f[_0x5691b5]]=_0xca9d31/_0x1aff0f|0x0,_0xd8498f[_0xd8498f[_0x5691b5]]=_0xca9d31;for(_0x5e0462=0x0;_0x5e0462<_0xd8498f[_0x5691b5];){var _0x25d10f=_0xd8498f[_0x480ada(0x24d)+'e'](_0x5e0462,_0x5e0462+=0x10),_0x2cd93f=_0x560255;_0x560255=_0x560255[_0x37eab3(_0x410d7c._0x3aa05f)+'e'](0x0,0x8);for(_0x1c5e5c=0x0;_0x1c5e5c<0x40;_0x1c5e5c++){var _0x4ebe54=_0x25d10f[_0x1c5e5c-0xf],_0x21ce94=_0x25d10f[_0x1c5e5c-0x2],_0x337e45=_0x560255[0x0],_0x49968d=_0x560255[0x4],_0x3ea439=_0x560255[0x7]+(_0x3844e7[_0x37eab3(_0x410d7c._0x595bcf)+'E'](_0x3af257,_0x49968d,0x6)^_0x3af257(_0x49968d,0xb)^_0x3af257(_0x49968d,0x19))+_0x3844e7[_0x480ada(_0x410d7c._0x1cd75b)+'P'](_0x49968d&_0x560255[0x5],~_0x49968d&_0x560255[0x6])+_0x263876[_0x1c5e5c]+(_0x25d10f[_0x1c5e5c]=_0x1c5e5c<0x10?_0x25d10f[_0x1c5e5c]:_0x3844e7[_0x37eab3(_0x410d7c._0x3d03b7)+'F'](_0x3844e7[_0x37eab3(_0x410d7c._0x46e268)+'N'](_0x3844e7[_0x480ada(_0x410d7c._0x5f5885)+'v'](_0x3844e7[_0x37eab3(_0x410d7c._0x5f5885)+'v'](_0x25d10f[_0x1c5e5c-0x10],_0x3844e7[_0x480ada(_0x410d7c._0x17e797)+'V'](_0x3844e7[_0x37eab3(_0x410d7c._0x5df99b)+'l'](_0x3af257,_0x4ebe54,0x7)^_0x3af257(_0x4ebe54,0x12),_0x4ebe54>>>0x3)),_0x25d10f[_0x1c5e5c-0x7]),_0x3844e7[_0x480ada(_0x410d7c._0x1d924f)+'J'](_0x3af257,_0x21ce94,0x11)^_0x3844e7[_0x480ada(_0x410d7c._0x3cb83f)+'s'](_0x3af257,_0x21ce94,0x13)^_0x21ce94>>>0xa),0x0)),_0x5a3532=_0x3844e7[_0x480ada(_0x410d7c._0x17e797)+'V'](_0x3af257(_0x337e45,0x2)^_0x3844e7[_0x480ada(_0x410d7c._0x44a43a)+'e'](_0x3af257,_0x337e45,0xd),_0x3af257(_0x337e45,0x16))+(_0x3844e7[_0x37eab3(_0x410d7c._0x4a66b2)+'a'](_0x3844e7[_0x37eab3(_0x410d7c._0x37df93)+'L'](_0x337e45,_0x560255[0x1]),_0x3844e7[_0x480ada(_0x410d7c._0x377aa5)+'L'](_0x337e45,_0x560255[0x2]))^_0x560255[0x1]&_0x560255[0x2]);_0x560255=[_0x3ea439+_0x5a3532|0x0][_0x480ada(0x23a)+'at'](_0x560255),_0x560255[0x4]=_0x560255[0x4]+_0x3ea439|0x0;}for(_0x1c5e5c=0x0;_0x1c5e5c<0x8;_0x1c5e5c++){_0x560255[_0x1c5e5c]=_0x560255[_0x1c5e5c]+_0x2cd93f[_0x1c5e5c]|0x0;}}for(_0x1c5e5c=0x0;_0x1c5e5c<0x8;_0x1c5e5c++){for(_0x5e0462=0x3;_0x5e0462+0x1;_0x5e0462--){var _0x48dd1c=_0x560255[_0x1c5e5c]>>_0x5e0462*0x8&0xff;_0x4641b7+=(_0x48dd1c<0x10?0x0:'')+_0x48dd1c[_0x37eab3(_0x410d7c._0x1b8f3b)+_0x37eab3(0x209)](0x10);}}return _0x4641b7;}class LicenseManager{static validate(_0x1a19a1,_0x2404db={}){const _0x2ec814=_0xefc815,_0x76bf4c=_0xefc815;if(!_0x1a19a1)return{'valid':![],'tier':null,'reason':_0x2ec814(_0x223d04._0x185981)+_0x2ec814(_0x223d04._0x4ff20a)+_0x76bf4c(_0x223d04._0x341bca)+_0x76bf4c(0x1b9)};const _0x411408=_0x1a19a1[_0x76bf4c(_0x223d04._0x50b241)](),_0x156638=_0x411408[_0x2ec814(_0x223d04._0x1ff7cd)+_0x2ec814(0x284)+_0x2ec814(0x189)](),_0x1f0ab6=_0x156638[_0x2ec814(_0x223d04._0x4580d8)+'t']('-'),_0x5f549d=_0x2404db[_0x2ec814(_0x223d04._0x385a26)+_0x76bf4c(_0x223d04._0x13d929)]!==undefined&&_0x2404db[_0x2ec814(_0x223d04._0x385a26)+_0x2ec814(_0x223d04._0x13d929)]!==null?_0x2404db[_0x2ec814(_0x223d04._0x5d92cf)+_0x2ec814(_0x223d04._0xa8b3d)]:Date[_0x76bf4c(_0x223d04._0x46af88)]();let _0x3b201b=0x0;_0x2404db[_0x76bf4c(0x1e5)+_0x2ec814(_0x223d04._0x5d239f)]&&(_0x3b201b=parseInt(_0x2404db[_0x76bf4c(_0x223d04._0xec027e)+_0x76bf4c(_0x223d04._0x5d239f)][_0x76bf4c(_0x223d04._0x2523dd)+_0x2ec814(0x1af)](_0x2ec814(_0x223d04._0x944062)+_0x2ec814(_0x223d04._0x1ca49b)+_0x76bf4c(_0x223d04._0x198b14)+_0x2ec814(_0x223d04._0x429070)+'e')||'0',0xa),(_0x2404db[_0x76bf4c(_0x223d04._0x51f14f)+_0x76bf4c(0x1e7)]===undefined||_0x2404db[_0x2ec814(_0x223d04._0x385a26)+_0x76bf4c(_0x223d04._0x13d929)]===null)&&_0x2404db[_0x2ec814(0x1e5)+_0x76bf4c(_0x223d04._0x4abce5)][_0x2ec814(_0x223d04._0x502515)+_0x76bf4c(_0x223d04._0xb0158e)](_0x3844e7[_0x76bf4c(_0x223d04._0xda68a8)+'I'],_0x5f549d[_0x76bf4c(_0x223d04._0x3dc4cc)+_0x76bf4c(_0x223d04._0x1f8c54)]()));if((_0x2404db[_0x76bf4c(_0x223d04._0x520627)+_0x2ec814(0x1e7)]===undefined||_0x2404db[_0x2ec814(_0x223d04._0x4e68cd)+_0x2ec814(_0x223d04._0x59a88f)]===null)&&_0x5f549d<_0x3b201b){if(_0x2404db[_0x2ec814(0x192)+_0x76bf4c(0x1fe)+'y'])_0x2404db[_0x76bf4c(0x192)+_0x76bf4c(_0x223d04._0x614980)+'y']();return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0x514a91)+_0x76bf4c(_0x223d04._0x20ece7)+_0x76bf4c(_0x223d04._0x26b323)+_0x76bf4c(_0x223d04._0xd9da38)+_0x2ec814(_0x223d04._0x5661ef)+_0x2ec814(_0x223d04._0xd73071)+_0x76bf4c(_0x223d04._0x3c304d)+_0x76bf4c(_0x223d04._0x83974a)};}const _0x465de0=typeof atob!==_0x3844e7[_0x2ec814(_0x223d04._0x527f64)+'g']?atob:_0x33ad81=>Buffer[_0x2ec814(0x183)](_0x33ad81,_0x76bf4c(0x181)+'64')[_0x76bf4c(0x182)+_0x2ec814(0x209)](_0x76bf4c(0x255)+'ry');if(_0x156638[_0x2ec814(_0x223d04._0x11740d)+_0x2ec814(_0x223d04._0x5dc136)+'th'](_0x3844e7[_0x2ec814(_0x223d04._0x24c8eb)+'k']))try{const _0x44e4ce=_0x411408[_0x76bf4c(_0x223d04._0x1cf550)+_0x76bf4c(_0x223d04._0x22fb7e)+'g'](0x9),_0x5a47fb=_0x465de0(_0x44e4ce),_0x44b102=new Uint8Array(_0x5a47fb[_0x76bf4c(_0x223d04._0x4d760b)+'th']);for(let _0x349dea=0x0;_0x3844e7[_0x2ec814(_0x223d04._0x13adb7)+'c'](_0x349dea,_0x5a47fb[_0x2ec814(_0x223d04._0x5cfb16)+'th']);_0x349dea++){_0x44b102[_0x349dea]=_0x5a47fb[_0x2ec814(_0x223d04._0x5c0b7c)+_0x2ec814(_0x223d04._0x6ace2b)+'At'](_0x349dea);}let _0xde6fa='';for(let _0x4e5fdd=0x0;_0x4e5fdd<_0x44b102[_0x76bf4c(_0x223d04._0x5cfb16)+'th'];_0x4e5fdd++){_0xde6fa+=_0x44b102[_0x4e5fdd][_0x76bf4c(_0x223d04._0x49de57)+_0x76bf4c(_0x223d04._0x1f8c54)](0x10)[_0x2ec814(0x24b)+_0x76bf4c(_0x223d04._0x1ad3a1)](0x2,'0');}const _0xb55c86=BigInt(_0x3844e7[_0x2ec814(_0x223d04._0x1c9364)+'T']('0x',_0xde6fa)),_0x15bfb8=_0x3844e7[_0x76bf4c(_0x223d04._0x3b6bd1)+'n'](_0x1aeaf4,_0xb55c86,_0x5dd816,_0x3d1e25),_0x1a58d7=_0x4646f8(_0x15bfb8);if(_0x1a58d7[_0x2ec814(0x172)+_0x2ec814(_0x223d04._0x5dc136)+'th'](_0x3844e7[_0x76bf4c(_0x223d04._0x5a8500)+'I'])){const _0x28f72e=parseInt(_0x1a58d7[_0x2ec814(_0x223d04._0x2082a8)+_0x2ec814(_0x223d04._0x22fb7e)+'g'](0xb),0xa);if(!isNaN(_0x28f72e)){if(_0x5f549d<_0x28f72e)return{'valid':!![],'tier':_0x2ec814(_0x223d04._0x4831b4)+'S','expires':_0x28f72e};if(_0x2404db[_0x76bf4c(0x17d)+_0x2ec814(_0x223d04._0x43b998)+'d'])_0x2404db[_0x76bf4c(0x17d)+_0x76bf4c(_0x223d04._0x43b998)+'d'](_0x3844e7[_0x76bf4c(_0x223d04._0x394bdd)+'G']);return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0xdee3f6)+_0x76bf4c(_0x223d04._0x4c98e1)+_0x76bf4c(_0x223d04._0x43b998)+'d'};}}}catch(_0x10d0e6){return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0xdee3f6)+_0x2ec814(0x18c)+_0x76bf4c(_0x223d04._0x2127b6)+_0x76bf4c(_0x223d04._0x2193b4)+_0x76bf4c(_0x223d04._0x569f3c)+_0x2ec814(_0x223d04._0x29d9e6)};}if(_0x156638[_0x2ec814(_0x223d04._0x304f3b)+_0x2ec814(_0x223d04._0x5a8604)+'th'](_0x76bf4c(_0x223d04._0x22e9d1)+_0x76bf4c(_0x223d04._0x336ac3)))try{const _0x67e3a0=_0x411408[_0x2ec814(_0x223d04._0x1cf550)+_0x2ec814(_0x223d04._0x22fb7e)+'g'](0x7),_0x35d003=_0x465de0(_0x67e3a0),_0x13efaf=new Uint8Array(_0x35d003[_0x2ec814(_0x223d04._0x4d760b)+'th']);for(let _0x41fe6b=0x0;_0x41fe6b<_0x35d003[_0x2ec814(_0x223d04._0x523d5c)+'th'];_0x41fe6b++){_0x13efaf[_0x41fe6b]=_0x35d003[_0x2ec814(0x197)+_0x2ec814(0x22b)+'At'](_0x41fe6b);}let _0x316af6='';for(let _0x321322=0x0;_0x321322<_0x13efaf[_0x76bf4c(0x24a)+'th'];_0x321322++){_0x316af6+=_0x13efaf[_0x321322][_0x2ec814(0x182)+_0x76bf4c(_0x223d04._0x1f8c54)](0x10)[_0x76bf4c(_0x223d04._0x197204)+_0x2ec814(_0x223d04._0x1ad3a1)](0x2,'0');}const _0x251e76=BigInt('0x'+_0x316af6),_0x321b27=_0x1aeaf4(_0x251e76,_0x5dd816,_0x3d1e25),_0x4bdae4=_0x4646f8(_0x321b27);if(_0x4bdae4[_0x76bf4c(_0x223d04._0x304f3b)+_0x76bf4c(_0x223d04._0x460fd0)+'th'](_0x2ec814(_0x223d04._0x49029e)+_0x2ec814(_0x223d04._0x26ffc7)+'-')){const _0x5404b0=_0x4bdae4[_0x76bf4c(_0x223d04._0x4580d8)+'t']('-');if(_0x5404b0[_0x76bf4c(_0x223d04._0x18af31)+'th']>=0x5){const _0x2b874c=_0x5404b0[0x2],_0x1f37be=parseInt(_0x5404b0[0x4],0xa);if(!isNaN(_0x1f37be)){if(_0x5f549d<_0x1f37be)return{'valid':!![],'tier':_0x2b874c,'expires':_0x1f37be};if(_0x2404db[_0x2ec814(0x17d)+_0x76bf4c(0x21c)+'d'])_0x2404db[_0x76bf4c(_0x223d04._0x55d158)+_0x2ec814(_0x223d04._0x194246)+'d'](_0x3844e7[_0x76bf4c(_0x223d04._0x21cb2d)+'n']);return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0x195c55)+_0x76bf4c(_0x223d04._0xedabe2)+_0x76bf4c(_0x223d04._0x4ca47a)+_0x76bf4c(0x25c)};}}}}catch(_0x3fbaa7){return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0x195c55)+_0x2ec814(0x210)+_0x2ec814(0x150)+_0x2ec814(_0x223d04._0x2f2ec4)+_0x76bf4c(_0x223d04._0xf92ec6)+'d'};}if(_0x1f0ab6[_0x76bf4c(0x24a)+'th']===0x4&&_0x1f0ab6[0x0]==='PS'&&[_0x76bf4c(_0x223d04._0xb9b55c),_0x2ec814(_0x223d04._0x2d5932)+'S',_0x3844e7[_0x76bf4c(_0x223d04._0x571bf4)+'z'],_0x76bf4c(_0x223d04._0x4905a0),_0x76bf4c(_0x223d04._0x476085)+_0x2ec814(_0x223d04._0x180d2d)+'SE'][_0x76bf4c(_0x223d04._0x105876)+_0x76bf4c(_0x223d04._0x22740b)](_0x1f0ab6[0x1])){const _0x2d920b=_0x1f0ab6[0x1],_0x29d37a=_0x1f0ab6[0x2],_0x88354e=_0x1f0ab6[0x3],_0x522165=_0x3844e7[_0x2ec814(_0x223d04._0x15a28a)+'Z'],_0x3a1b23=_0x3844e7[_0x2ec814(_0x223d04._0x5826f2)+'d'](_0x29d37a,_0x522165)+_0x2d920b;let _0x1c4bc8=0x0;for(let _0x1e7f1b=0x0;_0x3844e7[_0x2ec814(_0x223d04._0x13adb7)+'c'](_0x1e7f1b,_0x3a1b23[_0x76bf4c(0x24a)+'th']);_0x1e7f1b++){_0x1c4bc8+=_0x3a1b23[_0x76bf4c(_0x223d04._0x3b3c0d)+_0x2ec814(_0x223d04._0x6ace2b)+'At'](_0x1e7f1b)*_0x3844e7[_0x2ec814(_0x223d04._0x493b25)+'x'](_0x1e7f1b,0x1);}const _0x2f1e19=(_0x1c4bc8%0x270f)[_0x76bf4c(0x182)+_0x76bf4c(_0x223d04._0x1f8c54)]()[_0x76bf4c(_0x223d04._0x197204)+_0x2ec814(0x1dd)](0x4,'0');if(_0x3844e7[_0x2ec814(_0x223d04._0x4dbeb4)+'C'](_0x88354e,_0x2f1e19))return{'valid':!![],'tier':_0x2d920b};}if(_0x411408[_0x76bf4c(0x172)+_0x2ec814(_0x223d04._0x5dc136)+'th'](_0x2ec814(0x28c))&&_0x411408[_0x76bf4c(_0x223d04._0x4580d8)+'t']('.')[_0x2ec814(_0x223d04._0x4d760b)+'th']===0x3)try{const [_0x4b6ce7,_0x3bd41d,_0xd45981]=_0x411408[_0x76bf4c(_0x223d04._0x4580d8)+'t']('.');let _0x4aa725=_0xd45981[_0x76bf4c(_0x223d04._0x26b4a1)+_0x76bf4c(0x24e)](/-/g,'+')[_0x76bf4c(_0x223d04._0x362546)+_0x2ec814(_0x223d04._0x4dbf72)](/_/g,'/');while(_0x3844e7[_0x2ec814(_0x223d04._0x3b1783)+'R'](_0x4aa725[_0x76bf4c(_0x223d04._0x1fcbde)+'th'],0x4))_0x4aa725+='=';const _0x487cc3=_0x465de0(_0x4aa725);let _0x2491c6='';for(let _0x24f058=0x0;_0x24f058<_0x487cc3[_0x76bf4c(_0x223d04._0x5cfb16)+'th'];_0x24f058++){_0x2491c6+=_0x487cc3[_0x2ec814(_0x223d04._0x18b35a)+_0x76bf4c(_0x223d04._0x26bf9e)+'At'](_0x24f058)[_0x2ec814(_0x223d04._0x49de57)+_0x76bf4c(_0x223d04._0x1ac48e)](0x10)[_0x76bf4c(_0x223d04._0x197204)+_0x76bf4c(_0x223d04._0x376726)](0x2,'0');}const _0x410d89=BigInt('0x'+_0x2491c6),_0x292a95=_0x1aeaf4(_0x410d89,_0x5dd816,_0x3d1e25);let _0x24ae33=_0x292a95[_0x2ec814(_0x223d04._0x4aa716)+_0x2ec814(0x209)](0x10);if(_0x3844e7[_0x76bf4c(_0x223d04._0x1cf295)+'d'](_0x24ae33[_0x2ec814(_0x223d04._0x18af31)+'th'],0x2)!==0x0)_0x24ae33='0'+_0x24ae33;const _0x369404=_0x5b2d4e(_0x3844e7[_0x76bf4c(_0x223d04._0x30f8cf)+'d'](_0x4b6ce7,'.')+_0x3bd41d);if(_0x24ae33[_0x2ec814(_0x223d04._0x27e63e)+_0x76bf4c(_0x223d04._0x98d1c7)](_0x369404)){const _0x3d7539=_0x3844e7[_0x76bf4c(_0x223d04._0x2ea9eb)+'g'](_0x465de0,_0x3bd41d[_0x76bf4c(_0x223d04._0x26d7da)+_0x76bf4c(_0x223d04._0x3de7c9)](/-/g,'+')[_0x2ec814(0x233)+_0x76bf4c(_0x223d04._0x402851)](/_/g,'/')),_0x33366f=JSON[_0x2ec814(_0x223d04._0x1cd9c6)+'e'](_0x3d7539);if(_0x33366f[_0x2ec814(_0x223d04._0x369daf)]&&_0x5f549d/0x3e8<_0x33366f[_0x76bf4c(_0x223d04._0x9ba96e)])return{'valid':!![],'tier':_0x33366f[_0x76bf4c(_0x223d04._0x4ed265)]||_0x3844e7[_0x76bf4c(_0x223d04._0x128e87)+'F'],'expires':_0x33366f[_0x2ec814(_0x223d04._0x369daf)]*0x3e8};else{if(_0x2404db[_0x2ec814(_0x223d04._0x55d158)+_0x2ec814(0x21c)+'d'])_0x2404db[_0x76bf4c(0x17d)+_0x2ec814(_0x223d04._0x43b998)+'d'](_0x76bf4c(_0x223d04._0x51d621));return{'valid':![],'tier':null,'reason':_0x3844e7[_0x2ec814(_0x223d04._0x120922)+'b']};}}}catch(_0x2df9d7){return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0x55462e)+_0x76bf4c(_0x223d04._0x4730cd)+_0x76bf4c(_0x223d04._0x191717)+_0x76bf4c(0x1a2)+_0x76bf4c(_0x223d04._0xf92ec6)+'d'};}return{'valid':![],'tier':null,'reason':_0x76bf4c(_0x223d04._0x5c654b)+_0x76bf4c(_0x223d04._0x2073ef)+_0x2ec814(0x193)+'at'};}}LicenseManager[_0x542075(_0x33efa7._0x22f550)+_0x542075(_0x33efa7._0x209e6c)+_0x542075(_0x33efa7._0xfd22da)]=_0x3d1e25,LicenseManager[_0x542075(0x195)+_0xefc815(_0x33efa7._0x5c04d8)+_0xefc815(_0x33efa7._0x1ea8a4)]=_0x5dd816,LicenseManager[_0x542075(0x1ff)+_0xefc815(_0x33efa7._0x193b23)+_0xefc815(_0x33efa7._0x29f4ce)+_0xefc815(_0x33efa7._0x4ae373)]=_0x542075(_0x33efa7._0x4b3611)+_0x542075(_0x33efa7._0x5b14f0)+_0x542075(_0x33efa7._0xcc184d)+_0xefc815(_0x33efa7._0x3faaa9)+'@#',typeof globalThis!==_0x3844e7[_0xefc815(0x1eb)+'g']&&(globalThis[_0xefc815(_0x33efa7._0x43bb5e)+_0xefc815(_0x33efa7._0x1e2247)+_0x542075(0x206)+'er']=LicenseManager),typeof _0x5caef8!==_0x542075(_0x33efa7._0x43d64c)+_0xefc815(0x26a)+'d'&&(_0x5caef8[_0xefc815(_0x33efa7._0x43bb5e)+_0x542075(_0x33efa7._0x3eadb3)+_0xefc815(_0x33efa7._0x397407)+'er']=LicenseManager),typeof window!==_0xefc815(_0x33efa7._0x43d64c)+_0x542075(_0x33efa7._0x3583ec)+'d'&&(window[_0xefc815(_0x33efa7._0x32c745)+_0x542075(_0x33efa7._0x1e2247)+_0x542075(_0x33efa7._0x10fea0)+'er']=LicenseManager),typeof exports!==_0x3844e7[_0xefc815(0x1eb)+'g']&&(typeof module!==_0xefc815(_0x33efa7._0x43d64c)+_0xefc815(_0x33efa7._0x3583ec)+'d'&&module[_0x542075(_0x33efa7._0x2236d6)+_0x542075(0x20c)]&&(module[_0xefc815(_0x33efa7._0x32d43c)+_0x542075(_0x33efa7._0x2a5017)]=LicenseManager),exports[_0x542075(0x1f6)+_0xefc815(_0x33efa7._0x592dad)+_0xefc815(_0x33efa7._0x10fea0)+'er']=LicenseManager);}(typeof globalThis!==_0x3ba9aa(0x1df)+_0x3f9338(0x26a)+'d'?globalThis:typeof window!==_0x3f9338(0x1df)+_0x3f9338(0x26a)+'d'?window:this));
|