@evomap/evolver 1.90.0 → 2.0.0-beta.0
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/README.md +27 -564
- package/bin/evolver-llm-proxy.js +3 -0
- package/bin/evolver-mcp.js +2 -0
- package/bin/evolver-proxy.js +3 -0
- package/bin/evolver.js +4 -0
- package/index.js +1 -3670
- package/package.json +32 -62
- package/CONTRIBUTING.md +0 -19
- package/LICENSE +0 -641
- package/README.ja-JP.md +0 -521
- package/README.ko-KR.md +0 -520
- package/README.zh-CN.md +0 -531
- package/SKILL.md +0 -365
- package/assets/cover.png +0 -0
- package/assets/gep/genes.seed.json +0 -496
- package/conformance/savings-core/constants.json +0 -30
- package/conformance/savings-core/golden-vectors.json +0 -333
- package/scripts/a2a_export.js +0 -63
- package/scripts/a2a_ingest.js +0 -79
- package/scripts/a2a_promote.js +0 -118
- package/scripts/analyze_by_skill.js +0 -121
- package/scripts/build_binaries.js +0 -479
- package/scripts/check-changelog.js +0 -166
- package/scripts/extract_log.js +0 -85
- package/scripts/generate_history.js +0 -75
- package/scripts/gep_append_event.js +0 -96
- package/scripts/gep_personality_report.js +0 -234
- package/scripts/human_report.js +0 -147
- package/scripts/recall-verify-report.js +0 -234
- package/scripts/recover_loop.js +0 -61
- package/scripts/refresh_stars_badge.js +0 -168
- package/scripts/seed-merchants.js +0 -91
- package/scripts/skill2recipes.js +0 -118
- package/scripts/suggest_version.js +0 -89
- package/scripts/validate-modules.js +0 -38
- package/scripts/validate-suite.js +0 -78
- package/src/adapters/claudeCode.js +0 -194
- package/src/adapters/codex.js +0 -216
- package/src/adapters/cursor.js +0 -91
- package/src/adapters/hookAdapter.js +0 -469
- package/src/adapters/kiro.js +0 -195
- package/src/adapters/opencode.js +0 -326
- package/src/adapters/scripts/_lockPaths.js +0 -74
- package/src/adapters/scripts/_memoryFiltering.js +0 -35
- package/src/adapters/scripts/_runtimePaths.js +0 -440
- package/src/adapters/scripts/evolver-session-end.js +0 -321
- package/src/adapters/scripts/evolver-session-start.js +0 -587
- package/src/adapters/scripts/evolver-signal-detect.js +0 -98
- package/src/adapters/scripts/evolver-task-recall.js +0 -173
- package/src/atp/atpExecute.js +0 -283
- package/src/atp/atpTaskPickup.js +0 -233
- package/src/atp/autoBuyer.js +0 -382
- package/src/atp/autoDeliver.js +0 -215
- package/src/atp/cli.js +0 -354
- package/src/atp/cliAutobuyPrompt.js +0 -154
- package/src/atp/consumerAgent.js +0 -157
- package/src/atp/defaultHandler.js +0 -69
- package/src/atp/heartbeatSignalsHandler.js +0 -254
- package/src/atp/hubClient.js +0 -317
- package/src/atp/index.js +0 -38
- package/src/atp/merchantAgent.js +0 -118
- package/src/atp/protocol.js +0 -41
- package/src/atp/questionComposer.js +0 -133
- package/src/atp/serviceHelper.js +0 -92
- package/src/canary.js +0 -13
- package/src/config.js +0 -351
- package/src/evolve/guards.js +0 -1
- package/src/evolve/pipeline/collect.js +0 -1
- package/src/evolve/pipeline/dispatch.js +0 -1
- package/src/evolve/pipeline/enrich.js +0 -1
- package/src/evolve/pipeline/hub.js +0 -1
- package/src/evolve/pipeline/select.js +0 -1
- package/src/evolve/pipeline/signals.js +0 -1
- package/src/evolve/utils.js +0 -1
- package/src/evolve.js +0 -1
- package/src/experiment/agentRunner.js +0 -229
- package/src/experiment/cli.js +0 -159
- package/src/experiment/comparison.js +0 -233
- package/src/experiment/metrics.js +0 -75
- package/src/forceUpdate.js +0 -991
- package/src/gep/a2a.js +0 -173
- package/src/gep/a2aProtocol.js +0 -1
- package/src/gep/analyzer.js +0 -35
- package/src/gep/antiAbuseTelemetry.js +0 -1
- package/src/gep/assetCallLog.js +0 -197
- package/src/gep/assetStore.js +0 -723
- package/src/gep/assets.js +0 -36
- package/src/gep/autoDistillConv.js +0 -1
- package/src/gep/autoDistillLlm.js +0 -1
- package/src/gep/bridge.js +0 -138
- package/src/gep/candidateEval.js +0 -1
- package/src/gep/candidates.js +0 -1
- package/src/gep/claimNudge.js +0 -121
- package/src/gep/cliContracts.js +0 -1190
- package/src/gep/contentHash.js +0 -1
- package/src/gep/conversationDistiller.js +0 -1
- package/src/gep/conversationSniffer.js +0 -1
- package/src/gep/crypto.js +0 -1
- package/src/gep/curriculum.js +0 -1
- package/src/gep/deviceId.js +0 -1
- package/src/gep/directoryClient.js +0 -115
- package/src/gep/envFingerprint.js +0 -1
- package/src/gep/epigenetics.js +0 -1
- package/src/gep/execBridge.js +0 -1
- package/src/gep/executionTrace.js +0 -291
- package/src/gep/explore.js +0 -1
- package/src/gep/featureFlags.js +0 -121
- package/src/gep/gitOps.js +0 -265
- package/src/gep/hash.js +0 -1
- package/src/gep/hostErrorClassifier.js +0 -34
- package/src/gep/hubFetch.js +0 -1
- package/src/gep/hubReview.js +0 -1
- package/src/gep/hubSearch.js +0 -1
- package/src/gep/hubVerify.js +0 -1
- package/src/gep/idleScheduler.js +0 -400
- package/src/gep/issueReporter.js +0 -416
- package/src/gep/learningSignals.js +0 -1
- package/src/gep/llmReview.js +0 -92
- package/src/gep/localStateAwareness.js +0 -243
- package/src/gep/mailboxTransport.js +0 -119
- package/src/gep/memoryGraph.js +0 -1
- package/src/gep/memoryGraphAdapter.js +0 -1
- package/src/gep/mutation.js +0 -1
- package/src/gep/narrativeMemory.js +0 -1
- package/src/gep/oauthLogin.js +0 -181
- package/src/gep/openPRRegistry.js +0 -1
- package/src/gep/paths.js +0 -522
- package/src/gep/personality.js +0 -1
- package/src/gep/policyCheck.js +0 -1
- package/src/gep/portable.js +0 -103
- package/src/gep/privacyClient.js +0 -235
- package/src/gep/prompt.js +0 -1
- package/src/gep/questionGenerator.js +0 -518
- package/src/gep/recallInject.js +0 -1
- package/src/gep/recallVerifier.js +0 -1
- package/src/gep/reflection.js +0 -1
- package/src/gep/sanitize.js +0 -264
- package/src/gep/savingsCore.js +0 -1
- package/src/gep/schemas/capsule.js +0 -170
- package/src/gep/schemas/gene.js +0 -154
- package/src/gep/schemas/index.js +0 -8
- package/src/gep/schemas/protocol.js +0 -51
- package/src/gep/schemas/task.js +0 -74
- package/src/gep/selector.js +0 -1
- package/src/gep/selfPR.js +0 -469
- package/src/gep/signals.js +0 -776
- package/src/gep/skill2gep.js +0 -1056
- package/src/gep/skill2gepAudit.js +0 -303
- package/src/gep/skill2recipes.js +0 -511
- package/src/gep/skillDistiller.js +0 -1
- package/src/gep/skillPublisher.js +0 -358
- package/src/gep/solidify.js +0 -1
- package/src/gep/strategy.js +0 -1
- package/src/gep/taskReceiver.js +0 -575
- package/src/gep/tokenSavings.js +0 -1
- package/src/gep/trajectoryExport.js +0 -1
- package/src/gep/validationReport.js +0 -55
- package/src/gep/validator/index.js +0 -411
- package/src/gep/validator/reporter.js +0 -210
- package/src/gep/validator/sandboxExecutor.js +0 -480
- package/src/gep/validator/stakeBootstrap.js +0 -357
- package/src/gep/workspaceKeychain.js +0 -1
- package/src/ops/cleanup.js +0 -80
- package/src/ops/commentary.js +0 -60
- package/src/ops/health_check.js +0 -104
- package/src/ops/index.js +0 -11
- package/src/ops/innovation.js +0 -67
- package/src/ops/lifecycle.js +0 -798
- package/src/ops/self_repair.js +0 -76
- package/src/ops/skills_monitor.js +0 -147
- package/src/ops/trigger.js +0 -33
- package/src/proxy/clientSettings.js +0 -405
- package/src/proxy/envelope.js +0 -59
- package/src/proxy/extensions/dmHandler.js +0 -45
- package/src/proxy/extensions/sessionHandler.js +0 -141
- package/src/proxy/extensions/skillUpdater.js +0 -64
- package/src/proxy/extensions/traceControl.js +0 -1
- package/src/proxy/index.js +0 -1395
- package/src/proxy/inject.js +0 -1
- package/src/proxy/lifecycle/manager.js +0 -1568
- package/src/proxy/mailbox/state.js +0 -207
- package/src/proxy/mailbox/store.js +0 -602
- package/src/proxy/router/cache_passthrough.js +0 -26
- package/src/proxy/router/features.js +0 -84
- package/src/proxy/router/gemini_route.js +0 -154
- package/src/proxy/router/messages_route.js +0 -535
- package/src/proxy/router/model_router.js +0 -113
- package/src/proxy/router/models_route.js +0 -52
- package/src/proxy/router/ollama_route.js +0 -103
- package/src/proxy/router/responses_route.js +0 -170
- package/src/proxy/router/vertex_route.js +0 -110
- package/src/proxy/server/http.js +0 -363
- package/src/proxy/server/routes.js +0 -558
- package/src/proxy/server/settings.js +0 -115
- package/src/proxy/sync/engine.js +0 -179
- package/src/proxy/sync/inbound.js +0 -211
- package/src/proxy/sync/outbound.js +0 -361
- package/src/proxy/task/monitor.js +0 -131
- package/src/proxy/trace/extractor.js +0 -1
- package/src/proxy/trace/usage.js +0 -1
- package/src/solo/breaker.js +0 -25
- package/src/solo/gitGuard.js +0 -65
- package/src/webui/client/clientJs/assets.js +0 -111
- package/src/webui/client/clientJs/bootstrap.js +0 -92
- package/src/webui/client/clientJs/common.js +0 -77
- package/src/webui/client/clientJs/i18n.js +0 -366
- package/src/webui/client/clientJs/index.js +0 -35
- package/src/webui/client/clientJs/interactions.js +0 -351
- package/src/webui/client/clientJs/overview.js +0 -152
- package/src/webui/client/clientJs/personality.js +0 -285
- package/src/webui/client/clientJs/pipelines.js +0 -330
- package/src/webui/client/indexHtml.js +0 -221
- package/src/webui/client/static.js +0 -23
- package/src/webui/client/stylesCss.js +0 -639
- package/src/webui/client/vendor/README.md +0 -15
- package/src/webui/client/vendor/echarts.min.js +0 -45
- package/src/webui/index.js +0 -14
- package/src/webui/observer/assets.js +0 -146
- package/src/webui/observer/index.js +0 -37
- package/src/webui/observer/interactions.js +0 -127
- package/src/webui/observer/jsonl.js +0 -75
- package/src/webui/observer/paths.js +0 -46
- package/src/webui/observer/personality.js +0 -43
- package/src/webui/observer/pipelineEvents.js +0 -58
- package/src/webui/observer/redact.js +0 -63
- package/src/webui/observer/runs.js +0 -356
- package/src/webui/observer/safety.js +0 -57
- package/src/webui/observer/skills.js +0 -70
- package/src/webui/observer/status.js +0 -71
- package/src/webui/server/http.js +0 -138
- package/src/webui/server/routes.js +0 -41
package/src/gep/sanitize.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
// Pre-publish payload sanitization.
|
|
2
|
-
// Removes sensitive tokens, local paths, emails, and env references
|
|
3
|
-
// from capsule payloads before broadcasting to the hub.
|
|
4
|
-
|
|
5
|
-
// Patterns to redact (replaced with placeholder)
|
|
6
|
-
const REDACT_PATTERNS = [
|
|
7
|
-
// API keys & tokens (generic)
|
|
8
|
-
/Bearer\s+[A-Za-z0-9\-._~+\/]+=*/g,
|
|
9
|
-
/sk-[A-Za-z0-9]{20,}/g,
|
|
10
|
-
/"?token"?[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
|
|
11
|
-
/api[_-]?key[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
|
|
12
|
-
/secret[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
|
|
13
|
-
/password[=:]\s*["']?[^\s"',;)}\]]{6,}["']?/gi,
|
|
14
|
-
// GitHub tokens (ghp_, gho_, ghu_, ghs_, github_pat_)
|
|
15
|
-
/ghp_[A-Za-z0-9]{36,}/g,
|
|
16
|
-
/gho_[A-Za-z0-9]{36,}/g,
|
|
17
|
-
/ghu_[A-Za-z0-9]{36,}/g,
|
|
18
|
-
/ghs_[A-Za-z0-9]{36,}/g,
|
|
19
|
-
/github_pat_[A-Za-z0-9_]{22,}/g,
|
|
20
|
-
// AWS access keys
|
|
21
|
-
/AKIA[0-9A-Z]{16}/g,
|
|
22
|
-
// OpenAI / Anthropic tokens
|
|
23
|
-
/sk-proj-[A-Za-z0-9\-_]{20,}/g,
|
|
24
|
-
/sk-ant-[A-Za-z0-9\-_]{20,}/g,
|
|
25
|
-
// npm tokens
|
|
26
|
-
/npm_[A-Za-z0-9]{36,}/g,
|
|
27
|
-
// Slack tokens (bot/user/app/refresh/verification)
|
|
28
|
-
/xox[baprsv]-[A-Za-z0-9-]{10,}/g,
|
|
29
|
-
// JSON Web Tokens (header.payload.signature)
|
|
30
|
-
/eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]{20,}/g,
|
|
31
|
-
// Azure storage connection strings (redact the key field only)
|
|
32
|
-
/AccountKey=[^;\s]+/gi,
|
|
33
|
-
// Azure AD client secret + App Insights instrumentation key (value only)
|
|
34
|
-
/client_secret=[A-Za-z0-9~._\-]{8,}/gi,
|
|
35
|
-
/instrumentationkey=[0-9a-fA-F-]{20,}/gi,
|
|
36
|
-
// Discord bot tokens. Three base64url segments:
|
|
37
|
-
// 1. 24+ chars starting with [MNO] (user-id snowflake, base64-encoded)
|
|
38
|
-
// 2. exactly 6 chars (timestamp)
|
|
39
|
-
// 3. 27+ chars (HMAC signature)
|
|
40
|
-
// Requiring an uppercase leading char avoids false-matching dotted
|
|
41
|
-
// lowercase identifiers (Python module paths, hostnames, etc.).
|
|
42
|
-
/\b[MNO][A-Za-z0-9_\-]{23,}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27,}\b/g,
|
|
43
|
-
// Private keys
|
|
44
|
-
/-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----[\s\S]*?-----END\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g,
|
|
45
|
-
// Basic auth in URLs (redact only credentials, keep :// and @)
|
|
46
|
-
/(?<=:\/\/)[^@\s]+:[^@\s]+(?=@)/g,
|
|
47
|
-
// Local filesystem paths
|
|
48
|
-
/\/home\/[^\s"',;)}\]]+/g,
|
|
49
|
-
/\/Users\/[^\s"',;)}\]]+/g,
|
|
50
|
-
/[A-Z]:\\[^\s"',;)}\]]+/g,
|
|
51
|
-
// Email addresses
|
|
52
|
-
/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
|
|
53
|
-
// .env file references — only when the dot-env token looks like a real
|
|
54
|
-
// path (preceded by a path separator) or carries a suffix like
|
|
55
|
-
// `.env.production`. Bare prose mentions such as "Read from `.env` file"
|
|
56
|
-
// are intentionally NOT matched: the filename itself is a convention, not
|
|
57
|
-
// a secret, and over-redacting it strips useful debugging context from
|
|
58
|
-
// capsules without protecting anything the other patterns above don't
|
|
59
|
-
// already cover (API keys / tokens inside the env file).
|
|
60
|
-
/\.env\.[a-zA-Z]+\b/g,
|
|
61
|
-
/(?<=[\\/])\.env\b/g,
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
// Post-filter allowlist: matches that the regexes above will catch but that
|
|
65
|
-
// are not actually sensitive. Each entry is tested against the captured
|
|
66
|
-
// match — if any allowlist entry matches, the match is kept as-is instead of
|
|
67
|
-
// being replaced with [REDACTED]. Keeping this as a post-filter rather than
|
|
68
|
-
// bolting more lookaheads into the patterns keeps the redaction regexes
|
|
69
|
-
// readable and the allowlist easy to audit.
|
|
70
|
-
const REDACT_ALLOWLIST = [
|
|
71
|
-
// --- CI runner paths --- (well-known, no user PII)
|
|
72
|
-
/^\/home\/runner(?:[/]|$)/, // GitHub Actions Linux
|
|
73
|
-
/^\/Users\/runner(?:[/]|$)/, // GitHub Actions macOS
|
|
74
|
-
/^\/home\/circleci(?:[/]|$)/, // CircleCI Linux
|
|
75
|
-
/^\/Users\/distiller(?:[/]|$)/, // CircleCI macOS
|
|
76
|
-
/^\/home\/vsts(?:[/]|$)/, // Azure Pipelines
|
|
77
|
-
/^\/home\/travis(?:[/]|$)/, // Travis CI
|
|
78
|
-
/^\/home\/jenkins(?:[/]|$)/, // Jenkins default
|
|
79
|
-
// --- Bot / no-reply email addresses --- (not personal addresses)
|
|
80
|
-
// Domain MUST be anchored to a well-known public code host. An open
|
|
81
|
-
// `noreply@<anything>` allowlist would leak internal corp infra domains
|
|
82
|
-
// like `noreply@internal-codename.corp` (Bugbot PR #151 Low).
|
|
83
|
-
/^(?:noreply|no-reply|donotreply|do-not-reply)@(?:github\.com|users\.noreply\.github\.com|gitlab\.com|bitbucket\.org|npmjs\.com|claude\.ai|anthropic\.com)$/i,
|
|
84
|
-
/^[0-9]+\+[a-zA-Z0-9._-]+@users\.noreply\.github\.com$/i, // GitHub commit-author noreply (full form)
|
|
85
|
-
// The ssh_target leak scanner uses `[a-zA-Z0-9_.-]+` (no `+`) for the
|
|
86
|
-
// email local part, so `8275028+user@users.noreply.github.com` is
|
|
87
|
-
// captured as just `user@users.noreply.github.com` — the full-form
|
|
88
|
-
// anchor above can't match. Allowlist any local part on this domain
|
|
89
|
-
// since the domain itself is by design non-personal (Bugbot PR #151
|
|
90
|
-
// round 2 Medium).
|
|
91
|
-
/^[a-zA-Z0-9_.-]+@users\.noreply\.github\.com$/i,
|
|
92
|
-
/^git@github\.com$/i, // SSH alias, not a real mailbox
|
|
93
|
-
/^git@gitlab\.com$/i,
|
|
94
|
-
/^git@bitbucket\.org$/i,
|
|
95
|
-
];
|
|
96
|
-
|
|
97
|
-
function _isAllowlisted(match) {
|
|
98
|
-
for (let i = 0; i < REDACT_ALLOWLIST.length; i++) {
|
|
99
|
-
if (REDACT_ALLOWLIST[i].test(match)) return true;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const REDACTED = '[REDACTED]';
|
|
105
|
-
|
|
106
|
-
function redactString(str) {
|
|
107
|
-
if (typeof str !== 'string') return str;
|
|
108
|
-
let result = str;
|
|
109
|
-
for (const pattern of REDACT_PATTERNS) {
|
|
110
|
-
// Reset lastIndex for global regexes
|
|
111
|
-
pattern.lastIndex = 0;
|
|
112
|
-
result = result.replace(pattern, (match) => (_isAllowlisted(match) ? match : REDACTED));
|
|
113
|
-
}
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Deep-clone and sanitize a capsule payload.
|
|
119
|
-
* Returns a new object with sensitive values redacted.
|
|
120
|
-
* Does NOT modify the original.
|
|
121
|
-
*/
|
|
122
|
-
function sanitizePayload(capsule) {
|
|
123
|
-
if (!capsule || typeof capsule !== 'object') return capsule;
|
|
124
|
-
return sanitizePayloadValue(capsule);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function sanitizePayloadValue(value) {
|
|
128
|
-
if (typeof value === 'string') return redactString(value);
|
|
129
|
-
if (!value || typeof value !== 'object') return value;
|
|
130
|
-
if (Array.isArray(value)) return value.map(sanitizePayloadValue);
|
|
131
|
-
const out = {};
|
|
132
|
-
for (const key of Object.keys(value)) {
|
|
133
|
-
const cleanKey = redactString(String(key)) || REDACTED;
|
|
134
|
-
out[uniqueObjectKey(out, cleanKey)] = sanitizePayloadValue(value[key]);
|
|
135
|
-
}
|
|
136
|
-
return out;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function uniqueObjectKey(target, key) {
|
|
140
|
-
if (!Object.prototype.hasOwnProperty.call(target, key)) return key;
|
|
141
|
-
let i = 2;
|
|
142
|
-
while (Object.prototype.hasOwnProperty.call(target, key + '_' + i)) i++;
|
|
143
|
-
return key + '_' + i;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// --- Leak scanning (detection without destructive replacement) ---
|
|
147
|
-
|
|
148
|
-
const LEAK_SCANNERS = [
|
|
149
|
-
// API keys & tokens
|
|
150
|
-
{ type: 'api_key', pattern: /sk-[A-Za-z0-9]{20,}/g, suggest: 'process.env.OPENAI_API_KEY' },
|
|
151
|
-
{ type: 'api_key', pattern: /sk-proj-[A-Za-z0-9\-_]{20,}/g, suggest: 'process.env.OPENAI_API_KEY' },
|
|
152
|
-
{ type: 'api_key', pattern: /sk-ant-[A-Za-z0-9\-_]{20,}/g, suggest: 'process.env.ANTHROPIC_API_KEY' },
|
|
153
|
-
{ type: 'api_key', pattern: /AKIA[0-9A-Z]{16}/g, suggest: 'process.env.AWS_ACCESS_KEY_ID' },
|
|
154
|
-
{ type: 'github_token', pattern: /ghp_[A-Za-z0-9]{36,}/g, suggest: 'process.env.GITHUB_TOKEN' },
|
|
155
|
-
{ type: 'github_token', pattern: /github_pat_[A-Za-z0-9_]{22,}/g, suggest: 'process.env.GITHUB_TOKEN' },
|
|
156
|
-
{ type: 'npm_token', pattern: /npm_[A-Za-z0-9]{36,}/g, suggest: 'process.env.NPM_TOKEN' },
|
|
157
|
-
{ type: 'slack_token', pattern: /xox[baprsv]-[A-Za-z0-9-]{10,}/g, suggest: 'process.env.SLACK_TOKEN' },
|
|
158
|
-
{ type: 'jwt', pattern: /eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]{20,}/g, suggest: 'process.env.JWT' },
|
|
159
|
-
{ type: 'azure_key', pattern: /AccountKey=[^;\s]+/gi, suggest: 'process.env.AZURE_STORAGE_KEY' },
|
|
160
|
-
{ type: 'azure_client_secret', pattern: /client_secret=[A-Za-z0-9~._\-]{8,}/gi, suggest: 'process.env.AZURE_CLIENT_SECRET' },
|
|
161
|
-
{ type: 'azure_instrumentation_key', pattern: /instrumentationkey=[0-9a-fA-F-]{20,}/gi, suggest: 'process.env.APPINSIGHTS_INSTRUMENTATIONKEY' },
|
|
162
|
-
{ type: 'discord_token', pattern: /\b[MNO][A-Za-z0-9_\-]{23,}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27,}\b/g, suggest: 'process.env.DISCORD_TOKEN' },
|
|
163
|
-
{ type: 'bearer_token', pattern: /Bearer\s+[A-Za-z0-9\-._~+\/]{20,}=*/g, suggest: 'process.env.AUTH_TOKEN' },
|
|
164
|
-
{ type: 'proxy_token', pattern: /"?token"?[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi, suggest: 'proxy token (ephemeral, stored in settings.json)' },
|
|
165
|
-
{ type: 'private_key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g, suggest: 'process.env.PRIVATE_KEY_PATH' },
|
|
166
|
-
// Database connection strings with credentials
|
|
167
|
-
{ type: 'db_url', pattern: /(?:mongodb|postgres|postgresql|mysql|redis|amqp):\/\/[^\s"',;)}\]]{10,}/gi, suggest: 'process.env.DATABASE_URL' },
|
|
168
|
-
// Local filesystem paths with usernames
|
|
169
|
-
{ type: 'local_path', pattern: /\/home\/[a-zA-Z0-9_.-]+\//g, suggest: 'process.env.HOME' },
|
|
170
|
-
{ type: 'local_path', pattern: /\/Users\/[a-zA-Z0-9_.-]+\//g, suggest: 'process.env.HOME' },
|
|
171
|
-
{ type: 'local_path', pattern: /[A-Z]:\\Users\\[a-zA-Z0-9_.-]+\\/g, suggest: 'process.env.USERPROFILE' },
|
|
172
|
-
// Internal IP addresses
|
|
173
|
-
{ type: 'internal_ip', pattern: /\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3})(?::\d{2,5})?\b/g, suggest: 'process.env.SERVICE_HOST' },
|
|
174
|
-
// SSH connection strings
|
|
175
|
-
{ type: 'ssh_target', pattern: /[a-zA-Z0-9_.-]+@(?:(?:\d{1,3}\.){3}\d{1,3}|[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, suggest: 'process.env.SSH_HOST' },
|
|
176
|
-
// Generic password/secret assignments
|
|
177
|
-
{ type: 'password', pattern: /password[=:]\s*["']?[^\s"',;)}\]]{6,}["']?/gi, suggest: 'process.env.PASSWORD' },
|
|
178
|
-
{ type: 'secret', pattern: /secret[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi, suggest: 'process.env.SECRET' },
|
|
179
|
-
// Basic auth in URLs
|
|
180
|
-
{ type: 'basic_auth', pattern: /:\/\/[^@\s:]+:[^@\s]+@/g, suggest: 'process.env.SERVICE_URL' },
|
|
181
|
-
];
|
|
182
|
-
|
|
183
|
-
const ENV_SCAN_SKIP_KEYS = new Set([
|
|
184
|
-
'PATH', 'HOME', 'SHELL', 'TERM', 'LANG', 'USER', 'LOGNAME',
|
|
185
|
-
'PWD', 'OLDPWD', 'SHLVL', 'HOSTNAME', 'DISPLAY', 'EDITOR',
|
|
186
|
-
'PAGER', 'LESS', 'LS_COLORS', 'COLORTERM', 'TERM_PROGRAM',
|
|
187
|
-
'XDG_SESSION_ID', 'XDG_RUNTIME_DIR', 'DBUS_SESSION_BUS_ADDRESS',
|
|
188
|
-
'SSH_AUTH_SOCK', 'SSH_AGENT_PID', '_',
|
|
189
|
-
// Public CI identity — GitHub Actions sets these to usernames / org names,
|
|
190
|
-
// never secrets. Without skipping them, detectEnvValueLeaks flags any content
|
|
191
|
-
// that merely contains the actor's username (e.g. a commit-author noreply
|
|
192
|
-
// email) as an env-value leak: a false positive that fails only under CI.
|
|
193
|
-
'GITHUB_ACTOR', 'GITHUB_TRIGGERING_ACTOR', 'GITHUB_REPOSITORY_OWNER',
|
|
194
|
-
]);
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Scan content for potential sensitive information leaks.
|
|
198
|
-
* Returns structured results with suggested env var replacements.
|
|
199
|
-
* Does NOT modify the content.
|
|
200
|
-
*/
|
|
201
|
-
function scanForLeaks(content) {
|
|
202
|
-
if (typeof content !== 'string' || !content) return { found: false, leaks: [] };
|
|
203
|
-
const leaks = [];
|
|
204
|
-
const seen = new Set();
|
|
205
|
-
for (const scanner of LEAK_SCANNERS) {
|
|
206
|
-
scanner.pattern.lastIndex = 0;
|
|
207
|
-
let match;
|
|
208
|
-
while ((match = scanner.pattern.exec(content)) !== null) {
|
|
209
|
-
const val = match[0];
|
|
210
|
-
// Apply the same allowlist the redactor uses, otherwise selfPR's
|
|
211
|
-
// fullLeakCheck would block a self-PR over /home/runner/ paths or
|
|
212
|
-
// noreply@github.com — exactly the false positives the allowlist
|
|
213
|
-
// was introduced to fix (Bugbot PR #151 Medium: contradiction
|
|
214
|
-
// between redactString saying "safe" and scanForLeaks saying
|
|
215
|
-
// "leak").
|
|
216
|
-
if (_isAllowlisted(val)) continue;
|
|
217
|
-
const key = scanner.type + ':' + val;
|
|
218
|
-
if (seen.has(key)) continue;
|
|
219
|
-
seen.add(key);
|
|
220
|
-
leaks.push({ type: scanner.type, value: val.length > 60 ? val.slice(0, 57) + '...' : val, suggestion: scanner.suggest });
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return { found: leaks.length > 0, leaks };
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Reverse-detect: check if any current process.env values (length >= 8)
|
|
228
|
-
* appear verbatim in the content. If so, the env var's actual value
|
|
229
|
-
* has been hardcoded -- it should be replaced with the env var reference.
|
|
230
|
-
*/
|
|
231
|
-
function detectEnvValueLeaks(content) {
|
|
232
|
-
if (typeof content !== 'string' || !content) return [];
|
|
233
|
-
const leaks = [];
|
|
234
|
-
for (const [key, val] of Object.entries(process.env)) {
|
|
235
|
-
if (!val || val.length < 8) continue;
|
|
236
|
-
if (ENV_SCAN_SKIP_KEYS.has(key)) continue;
|
|
237
|
-
// Filesystem paths and URLs are not secrets, and CI tooling exports dozens
|
|
238
|
-
// of env vars whose value is the repo checkout path — the runner
|
|
239
|
-
// (GITHUB_WORKSPACE, RUNNER_WORKSPACE) and, when tests run via `npm test`,
|
|
240
|
-
// npm itself (INIT_CWD, npm_config_local_prefix, npm_package_json, PWD).
|
|
241
|
-
// Reverse-flagging them is a false positive whenever capsule content
|
|
242
|
-
// legitimately references the build path: it blocks self-PRs and fails only
|
|
243
|
-
// under CI. Genuine sensitive paths in content are still caught by the
|
|
244
|
-
// local_path pattern scanner, and credentialed URLs by db_url / basic_auth.
|
|
245
|
-
if (/^(\/|[A-Za-z]:\\|[a-z][a-z0-9+.-]*:\/\/)/i.test(val)) continue;
|
|
246
|
-
if (content.includes(val)) {
|
|
247
|
-
leaks.push({ type: 'env_value_leak', envKey: key, value: val.length > 60 ? val.slice(0, 57) + '...' : val, suggestion: 'process.env.' + key });
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return leaks;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Full leak check: pattern-based scan + env value reverse detection.
|
|
255
|
-
* Returns combined results.
|
|
256
|
-
*/
|
|
257
|
-
function fullLeakCheck(content) {
|
|
258
|
-
const scan = scanForLeaks(content);
|
|
259
|
-
const envLeaks = detectEnvValueLeaks(content);
|
|
260
|
-
const allLeaks = scan.leaks.concat(envLeaks);
|
|
261
|
-
return { found: allLeaks.length > 0, leaks: allLeaks };
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
module.exports = { sanitizePayload, redactString, scanForLeaks, detectEnvValueLeaks, fullLeakCheck };
|
package/src/gep/savingsCore.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const _0x4a43fc=_0x3270;(function(_0x4c1a72,_0x2087b3){const _0x31ee97=_0x3270,_0x448c4e=_0x4c1a72();while(!![]){try{const _0xaa2d6f=parseInt(_0x31ee97(0x264,'\x73\x72\x50\x68'))/(0x1176+0x1d48*0x1+-0x2ebd)*(-parseInt(_0x31ee97(0x267,'\x41\x62\x36\x59'))/(-0x2*0x835+0x919+-0x19*-0x4b))+-parseInt(_0x31ee97(0x1f4,'\x70\x36\x75\x56'))/(-0xb7d+0x1c0b*-0x1+0x278b)+parseInt(_0x31ee97(0x261,'\x42\x4f\x48\x49'))/(0xb78*-0x2+0x1a22+-0x32e)*(parseInt(_0x31ee97(0x244,'\x6a\x50\x78\x6b'))/(0x5*-0x17b+0x1949+-0x11dd))+-parseInt(_0x31ee97(0x263,'\x25\x6e\x73\x57'))/(-0x26da*0x1+-0x400*-0x4+0x18*0xf4)*(-parseInt(_0x31ee97(0x255,'\x4a\x57\x35\x75'))/(-0xff0+0x10d1+-0x6d*0x2))+parseInt(_0x31ee97(0x27a,'\x33\x5b\x57\x6e'))/(0x3*0xbed+-0x5*0x588+-0x817)*(parseInt(_0x31ee97(0x249,'\x6e\x40\x32\x4e'))/(0x1875*0x1+-0x1abd+0x1*0x251))+parseInt(_0x31ee97(0x225,'\x5e\x33\x28\x5d'))/(0x210+-0x246d+0x2267)+-parseInt(_0x31ee97(0x274,'\x21\x46\x67\x6c'))/(-0x1730+0x10ef*0x1+0x64c)*(parseInt(_0x31ee97(0x1fa,'\x4a\x57\x35\x75'))/(-0x741*0x3+-0x1745+0x2d14));if(_0xaa2d6f===_0x2087b3)break;else _0x448c4e['push'](_0x448c4e['shift']());}catch(_0x512194){_0x448c4e['push'](_0x448c4e['shift']());}}}(_0x5660,0x4582c+0xc446b+0x4b47c*-0x2));const _0x228b8e=(function(){const _0x580dbd=_0x3270,_0x2bc267={'\x6a\x54\x6a\x70\x6a':function(_0x2cd0ae,_0x157963){return _0x2cd0ae*_0x157963;},'\x59\x74\x74\x6c\x70':function(_0x5d783d,_0x11365c){return _0x5d783d===_0x11365c;},'\x77\x42\x50\x46\x76':function(_0x37b230,_0x459b84){return _0x37b230(_0x459b84);},'\x79\x67\x65\x76\x56':_0x580dbd(0x22f,'\x48\x36\x68\x70')};let _0x498b31=!![];return function(_0x531f0b,_0x24cee6){const _0x4a510e=_0x580dbd;if(_0x2bc267[_0x4a510e(0x22c,'\x70\x36\x75\x56')]!==_0x2bc267[_0x4a510e(0x238,'\x36\x51\x65\x34')]){const _0x251345=_0x1c4e4b[_0x4a510e(0x260,'\x62\x79\x44\x74')+_0x4a510e(0x23e,'\x33\x40\x38\x56')+_0x4a510e(0x1fd,'\x72\x6c\x32\x38')][_0x2960ba];_0x1f6474+=_0x2bc267['\x6a\x54\x6a\x70\x6a'](_0x2bc267['\x59\x74\x74\x6c\x70'](_0x251345,_0x3a17f6)?-0x11b*-0x14+0xf55+-0x87*0x47:_0x251345,_0x2bc267['\x77\x42\x50\x46\x76'](_0x412cd7,_0x29f6d3));}else{const _0x2a7390=_0x498b31?function(){const _0x23e110=_0x4a510e;if(_0x24cee6){const _0x179cac=_0x24cee6[_0x23e110(0x211,'\x6e\x40\x32\x4e')](_0x531f0b,arguments);return _0x24cee6=null,_0x179cac;}}:function(){};return _0x498b31=![],_0x2a7390;}};}()),_0x1f2d8d=_0x228b8e(this,function(){const _0x5d2760=_0x3270,_0x4fcf73={};_0x4fcf73[_0x5d2760(0x232,'\x32\x74\x48\x40')]=_0x5d2760(0x235,'\x4d\x59\x77\x52')+_0x5d2760(0x25c,'\x48\x36\x68\x70');const _0x57b78e=_0x4fcf73;return _0x1f2d8d[_0x5d2760(0x229,'\x70\x65\x2a\x44')]()[_0x5d2760(0x24c,'\x48\x31\x57\x54')](_0x5d2760(0x24e,'\x4e\x51\x76\x50')+_0x5d2760(0x239,'\x50\x29\x68\x61'))[_0x5d2760(0x25a,'\x28\x4b\x69\x33')]()[_0x5d2760(0x21f,'\x32\x74\x48\x40')+_0x5d2760(0x279,'\x66\x77\x6a\x30')](_0x1f2d8d)[_0x5d2760(0x22d,'\x33\x5b\x57\x6e')](_0x57b78e[_0x5d2760(0x25d,'\x36\x51\x65\x34')]);});function _0x3270(_0x1ec50e,_0x49ade5){_0x1ec50e=_0x1ec50e-(0x5c9+-0xa89+0x154*0x5);const _0x54304b=_0x5660();let _0x48ae7c=_0x54304b[_0x1ec50e];if(_0x3270['\x50\x59\x72\x65\x46\x65']===undefined){var _0x4a970d=function(_0x6e4de){const _0x3e2ebd='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x4fdc35='',_0x87ee0d='',_0x99d6c7=_0x4fdc35+_0x4a970d,_0x4f3130=(''+function(){return 0x1*0x241+-0x1f2f+0x1cee;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(0x1939+0x17d9+-0x3111);for(let _0x508cb2=0x1baf*-0x1+0x1494*0x1+0x71b,_0x2a54d7,_0x2064fd,_0x519b2a=-0x373*0x8+-0x266+0x1dfe*0x1;_0x2064fd=_0x6e4de['\x63\x68\x61\x72\x41\x74'](_0x519b2a++);~_0x2064fd&&(_0x2a54d7=_0x508cb2%(0x4f*-0x26+0x1d2c*0x1+-0xc2*0x17)?_0x2a54d7*(-0x929*0x1+-0x2b9+-0xc22*-0x1)+_0x2064fd:_0x2064fd,_0x508cb2++%(0x1c68+0x4e5+-0x2149))?_0x4fdc35+=_0x4f3130||_0x99d6c7['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x519b2a+(-0x5e2+-0x49d*-0x1+0x14f))-(0x10ed*-0x1+-0x53*-0x6b+-0x11ba)!==-0x1*0x1573+0x1*0x2425+-0xeb2?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0xea0+-0x79*0x3+0x110a&_0x2a54d7>>(-(-0x52c*0x1+-0xd5a+0x8*0x251)*_0x508cb2&0xa32+0x62b*0x1+-0x1*0x1057)):_0x508cb2:-0xe6d*-0x2+0xa2e*-0x1+-0x12ac){_0x2064fd=_0x3e2ebd['\x69\x6e\x64\x65\x78\x4f\x66'](_0x2064fd);}for(let _0x3e4640=-0x1*0x13e+0x1899+-0x175b,_0x39697c=_0x4fdc35['\x6c\x65\x6e\x67\x74\x68'];_0x3e4640<_0x39697c;_0x3e4640++){_0x87ee0d+='\x25'+('\x30\x30'+_0x4fdc35['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x3e4640)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x420+0x1a8a+0x2*-0xb2d))['\x73\x6c\x69\x63\x65'](-(0x7*-0x4ee+-0x1*-0x4ca+0x1dba));}return decodeURIComponent(_0x87ee0d);};const _0x3f8c6a=function(_0x567718,_0x4899f2){let _0x55dd2a=[],_0x9be3df=-0x1155+-0x1f*-0xb3+0x8*-0x8b,_0x22cb5b,_0x4e04d6='';_0x567718=_0x4a970d(_0x567718);let _0x4c5b39;for(_0x4c5b39=-0x637*-0x5+0xdb2+-0x2cc5;_0x4c5b39<-0x251*-0x9+-0x20cc+0xcf3;_0x4c5b39++){_0x55dd2a[_0x4c5b39]=_0x4c5b39;}for(_0x4c5b39=-0x86*-0x34+0xde9+-0x1*0x2921;_0x4c5b39<-0x4*-0x45a+0xfbd*0x2+-0x2fe2;_0x4c5b39++){_0x9be3df=(_0x9be3df+_0x55dd2a[_0x4c5b39]+_0x4899f2['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x4c5b39%_0x4899f2['\x6c\x65\x6e\x67\x74\x68']))%(0x974+0x17*0x118+0x3*-0xb34),_0x22cb5b=_0x55dd2a[_0x4c5b39],_0x55dd2a[_0x4c5b39]=_0x55dd2a[_0x9be3df],_0x55dd2a[_0x9be3df]=_0x22cb5b;}_0x4c5b39=-0x1*-0x4e8+-0x1e*-0xc5+0x1bfe*-0x1,_0x9be3df=0x15*0x21+0x7d9*0x2+0x1267*-0x1;for(let _0x5bcc68=-0x185b+0x1d33+-0x4d8;_0x5bcc68<_0x567718['\x6c\x65\x6e\x67\x74\x68'];_0x5bcc68++){_0x4c5b39=(_0x4c5b39+(-0xb*0x131+0x2f7+0xa25))%(0x41*-0x40+-0x813+0x871*0x3),_0x9be3df=(_0x9be3df+_0x55dd2a[_0x4c5b39])%(-0x44e*-0x2+-0x636+-0x166*0x1),_0x22cb5b=_0x55dd2a[_0x4c5b39],_0x55dd2a[_0x4c5b39]=_0x55dd2a[_0x9be3df],_0x55dd2a[_0x9be3df]=_0x22cb5b,_0x4e04d6+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x567718['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5bcc68)^_0x55dd2a[(_0x55dd2a[_0x4c5b39]+_0x55dd2a[_0x9be3df])%(0x1c77+-0x65e+-0x1*0x1519)]);}return _0x4e04d6;};_0x3270['\x53\x50\x58\x69\x63\x64']=_0x3f8c6a,_0x3270['\x6c\x68\x58\x58\x42\x65']={},_0x3270['\x50\x59\x72\x65\x46\x65']=!![];}const _0x3eaa89=_0x54304b[0x1f54+-0x9*-0x3b9+0x40d5*-0x1],_0xc4225e=_0x1ec50e+_0x3eaa89,_0x416840=_0x3270['\x6c\x68\x58\x58\x42\x65'][_0xc4225e];if(!_0x416840){if(_0x3270['\x42\x46\x67\x7a\x4f\x4c']===undefined){const _0x4b6712=function(_0x49a161){this['\x66\x6e\x49\x72\x67\x77']=_0x49a161,this['\x75\x70\x4a\x73\x6a\x76']=[-0xd6b+0x1193+-0x427,-0x744+-0xb*-0x300+0xc*-0x225,-0x5ad*-0x1+0x87+-0x1*0x634],this['\x49\x4d\x42\x73\x58\x72']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x6b\x62\x57\x64\x42\x55']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x44\x50\x4c\x49\x6c\x4f']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x66\x54\x49\x6f\x69\x56']=function(){const _0x5e328a=new RegExp(this['\x6b\x62\x57\x64\x42\x55']+this['\x44\x50\x4c\x49\x6c\x4f']),_0x5b3af1=_0x5e328a['\x74\x65\x73\x74'](this['\x49\x4d\x42\x73\x58\x72']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x75\x70\x4a\x73\x6a\x76'][0x23*-0x2b+-0x292*0x1+-0x1*-0x874]:--this['\x75\x70\x4a\x73\x6a\x76'][-0x3*0x9f5+0x4d*0x5+0x1c5e];return this['\x59\x68\x71\x6a\x4f\x64'](_0x5b3af1);},_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x59\x68\x71\x6a\x4f\x64']=function(_0xbf70ba){if(!Boolean(~_0xbf70ba))return _0xbf70ba;return this['\x6b\x73\x4b\x6f\x6b\x6d'](this['\x66\x6e\x49\x72\x67\x77']);},_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6b\x73\x4b\x6f\x6b\x6d']=function(_0x1d9fb6){for(let _0x582b6e=-0x629+-0x904+0xf2d,_0x3168b5=this['\x75\x70\x4a\x73\x6a\x76']['\x6c\x65\x6e\x67\x74\x68'];_0x582b6e<_0x3168b5;_0x582b6e++){this['\x75\x70\x4a\x73\x6a\x76']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x3168b5=this['\x75\x70\x4a\x73\x6a\x76']['\x6c\x65\x6e\x67\x74\x68'];}return _0x1d9fb6(this['\x75\x70\x4a\x73\x6a\x76'][-0x1*-0x1a85+-0x1e33+0x3ae]);},(''+function(){return 0x19a4+-0x2*0x839+0x16*-0x6b;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x53a+-0x65*-0x62+0x7*-0x645)&&new _0x4b6712(_0x3270)['\x66\x54\x49\x6f\x69\x56'](),_0x3270['\x42\x46\x67\x7a\x4f\x4c']=!![];}_0x48ae7c=_0x3270['\x53\x50\x58\x69\x63\x64'](_0x48ae7c,_0x49ade5),_0x3270['\x6c\x68\x58\x58\x42\x65'][_0xc4225e]=_0x48ae7c;}else _0x48ae7c=_0x416840;return _0x48ae7c;}_0x1f2d8d();'use strict';const _0x27543e=require(_0x4a43fc(0x1f9,'\x32\x74\x48\x40')),_0x12cc6d=require(_0x27543e[_0x4a43fc(0x26c,'\x21\x46\x67\x6c')](__dirname,'\x2e\x2e','\x2e\x2e','\x63\x6f\x6e\x66\x6f\x72\x6d\x61'+_0x4a43fc(0x221,'\x67\x55\x42\x63'),_0x4a43fc(0x20e,'\x35\x25\x56\x47')+_0x4a43fc(0x25b,'\x26\x66\x41\x62'),_0x4a43fc(0x278,'\x21\x46\x67\x6c')+_0x4a43fc(0x247,'\x38\x61\x31\x6f'))),_0x55a8f4=_0x5a44b9=>Math[_0x4a43fc(0x233,'\x73\x72\x50\x68')]((_0x5a44b9+Number[_0x4a43fc(0x272,'\x6a\x50\x78\x6b')])*(0x19*0xc7+-0x18d9+0x1*0x5ce))/(-0x119c+-0x905*-0x3+0x1*-0x90f),_0x498bb7=_0x5c19bd=>Math[_0x4a43fc(0x222,'\x35\x25\x56\x47')]((_0x5c19bd+Number[_0x4a43fc(0x216,'\x72\x6e\x58\x6d')])*(0x3*-0x199+0x5*0x3de+0x1*0x1885))/(0x1657*0x1+-0x1*0x2053+0x56*0x92),_0xd0ddeb=_0x31a262=>Math[_0x4a43fc(0x223,'\x59\x38\x71\x28')](0x1*-0x2611+0x57*0x38+0x1309,Math[_0x4a43fc(0x201,'\x4d\x44\x32\x32')](Number(_0x31a262)||0xd24+0xa2b+-0xd*0x1cb));function _0x5660(){const _0x4fdff4=['\x6b\x53\x6f\x57\x57\x50\x33\x64\x56\x66\x5a\x64\x51\x66\x6d\x42\x63\x38\x6b\x5a\x57\x52\x31\x30','\x57\x37\x57\x6f\x57\x36\x42\x64\x47\x32\x53','\x57\x52\x68\x63\x52\x5a\x6a\x47\x57\x35\x56\x64\x4a\x38\x6b\x77\x57\x35\x43','\x57\x36\x68\x63\x4a\x57\x35\x72\x57\x34\x6c\x64\x53\x53\x6b\x36','\x57\x35\x30\x31\x57\x36\x52\x64\x4c\x65\x47','\x57\x36\x57\x37\x57\x36\x76\x48\x78\x71\x2f\x63\x4a\x68\x38','\x6f\x74\x74\x63\x56\x53\x6b\x6d\x57\x52\x52\x64\x4a\x77\x74\x63\x4f\x57','\x57\x36\x37\x63\x4b\x4b\x4a\x64\x4e\x4d\x58\x69\x57\x4f\x64\x63\x55\x47','\x7a\x74\x2f\x64\x4b\x6d\x6f\x57','\x62\x4a\x65\x51\x76\x78\x43','\x57\x50\x66\x79\x6a\x68\x38\x66\x70\x71','\x57\x37\x39\x6a\x57\x50\x42\x63\x4e\x74\x70\x64\x56\x58\x6d','\x6c\x43\x6b\x67\x57\x36\x46\x63\x4b\x47\x42\x63\x48\x32\x75','\x41\x4a\x74\x64\x50\x53\x6f\x59\x41\x32\x4f\x45','\x57\x4f\x37\x63\x56\x38\x6f\x71\x57\x4f\x2f\x63\x47\x57\x4f\x41','\x57\x36\x72\x56\x57\x34\x4f\x62\x6f\x53\x6f\x61\x6f\x68\x53','\x6f\x32\x74\x64\x55\x53\x6f\x69\x45\x4d\x4f\x45\x57\x51\x79','\x62\x43\x6b\x31\x77\x4e\x6d\x52\x6f\x59\x62\x54','\x79\x64\x46\x63\x53\x68\x64\x64\x51\x6d\x6f\x58','\x57\x34\x47\x38\x61\x61\x70\x63\x48\x61\x39\x4a\x57\x50\x71','\x42\x64\x2f\x64\x4c\x38\x6f\x54\x44\x4d\x75\x76\x57\x51\x65','\x67\x75\x4e\x64\x4c\x61','\x57\x52\x4f\x73\x57\x34\x4a\x64\x4a\x78\x74\x63\x50\x4c\x4b\x75\x61\x73\x66\x52\x6c\x53\x6f\x6f','\x57\x37\x30\x49\x57\x37\x72\x55\x72\x71\x2f\x63\x4e\x77\x79','\x45\x5a\x35\x2f\x57\x52\x35\x45\x57\x34\x66\x39\x57\x51\x72\x4e\x7a\x4c\x74\x64\x4b\x38\x6b\x32','\x57\x34\x4f\x33\x6d\x71\x6c\x63\x4d\x71\x6e\x39','\x42\x64\x68\x64\x4d\x53\x6f\x32\x7a\x31\x53\x6a\x57\x52\x61','\x57\x51\x68\x63\x52\x72\x62\x62\x57\x35\x4f','\x76\x4a\x79\x71\x72\x68\x74\x63\x53\x53\x6b\x6d\x57\x4f\x71','\x74\x48\x46\x64\x4a\x53\x6b\x50\x63\x61','\x7a\x31\x4a\x64\x56\x53\x6f\x76\x57\x36\x74\x63\x4e\x30\x2f\x63\x4b\x32\x34\x57\x7a\x67\x34','\x73\x49\x79\x75\x46\x33\x42\x63\x50\x38\x6b\x66\x57\x4f\x53','\x57\x51\x57\x59\x72\x6d\x6f\x33\x57\x35\x70\x64\x4e\x30\x61\x64','\x57\x34\x57\x34\x6a\x48\x4a\x63\x4c\x74\x76\x56\x57\x4f\x6d','\x46\x72\x2f\x64\x4e\x38\x6b\x46\x6b\x57','\x57\x50\x72\x2f\x57\x4f\x68\x64\x4b\x61','\x57\x52\x69\x57\x57\x4f\x68\x63\x4c\x5a\x64\x63\x4d\x77\x68\x63\x4f\x71','\x41\x31\x78\x63\x56\x74\x64\x64\x4b\x71','\x46\x57\x68\x63\x56\x33\x78\x64\x4b\x53\x6f\x57\x57\x34\x35\x76','\x6e\x48\x38\x50\x57\x37\x71\x77\x57\x52\x6a\x64\x73\x71','\x75\x62\x6c\x64\x4a\x6d\x6f\x31\x6a\x65\x38\x69\x74\x47','\x45\x63\x44\x4c\x6b\x43\x6f\x36\x57\x35\x35\x30\x44\x57','\x43\x6d\x6f\x52\x77\x43\x6b\x4d\x57\x35\x6c\x63\x4f\x4a\x78\x63\x4e\x53\x6f\x62\x79\x4b\x37\x64\x48\x53\x6b\x59','\x6b\x30\x4e\x64\x52\x43\x6b\x61\x72\x57','\x64\x49\x61\x56\x57\x51\x69\x71','\x42\x43\x6b\x72\x57\x36\x2f\x63\x47\x63\x4f','\x6e\x43\x6b\x6b\x6c\x53\x6f\x42\x57\x51\x79','\x57\x52\x30\x33\x42\x38\x6f\x53','\x6c\x38\x6b\x45\x57\x51\x61\x5a\x6e\x38\x6f\x32\x79\x6d\x6f\x71\x63\x38\x6f\x39\x57\x35\x74\x64\x4a\x6d\x6f\x4d','\x57\x50\x38\x4e\x57\x4f\x47\x44\x57\x50\x69','\x76\x6d\x6f\x6e\x46\x53\x6f\x6e\x78\x47','\x57\x36\x71\x5a\x57\x4f\x4a\x63\x54\x6d\x6f\x7a\x64\x61','\x6e\x5a\x47\x6d\x57\x37\x53\x5a','\x57\x52\x39\x64\x61\x33\x47\x74','\x57\x50\x74\x63\x4d\x53\x6f\x57\x57\x51\x6c\x63\x4b\x64\x75\x58\x66\x71','\x67\x4a\x61\x4e\x74\x4e\x30','\x57\x34\x4e\x63\x52\x78\x4e\x64\x56\x66\x39\x62\x57\x52\x68\x63\x48\x57','\x44\x53\x6b\x69\x42\x59\x4b\x42','\x57\x4f\x74\x63\x4b\x6d\x6f\x57\x57\x34\x31\x77','\x57\x36\x38\x39\x57\x34\x4c\x47\x71\x47','\x57\x4f\x64\x64\x4f\x43\x6b\x6b\x57\x35\x33\x64\x51\x57','\x41\x43\x6b\x70\x57\x37\x33\x63\x4b\x66\x43','\x57\x37\x5a\x63\x47\x71\x39\x35\x57\x4f\x75\x72\x57\x35\x50\x74','\x79\x6d\x6f\x77\x71\x38\x6f\x6a\x77\x71','\x46\x49\x31\x70\x73\x6d\x6b\x53\x57\x50\x4b','\x57\x37\x72\x41\x42\x4c\x72\x2f','\x57\x35\x74\x64\x4e\x38\x6b\x67\x57\x34\x70\x64\x56\x76\x34\x75','\x57\x52\x6e\x64\x57\x4f\x46\x64\x48\x62\x79','\x69\x61\x30\x52\x57\x37\x71\x76\x57\x52\x72\x65\x61\x71','\x57\x52\x56\x64\x48\x30\x7a\x61\x57\x35\x37\x64\x4e\x43\x6f\x33\x79\x57','\x57\x50\x52\x63\x4b\x6d\x6f\x57\x57\x36\x50\x45','\x57\x35\x6a\x36\x71\x65\x71\x34','\x57\x4f\x48\x51\x70\x71','\x57\x36\x35\x35\x57\x34\x65\x54\x65\x43\x6f\x43\x6d\x4d\x47','\x57\x51\x71\x37\x45\x53\x6f\x57\x57\x35\x43','\x57\x52\x70\x64\x4a\x66\x6e\x62\x57\x34\x74\x64\x4e\x38\x6f\x52\x75\x57','\x65\x74\x56\x63\x4d\x43\x6b\x51\x57\x50\x33\x64\x50\x30\x71','\x77\x47\x4b\x31\x76\x66\x53','\x6a\x43\x6b\x58\x57\x37\x47\x34\x65\x47','\x71\x66\x64\x63\x4b\x6d\x6b\x63\x57\x35\x48\x33\x44\x38\x6b\x44','\x77\x74\x68\x64\x53\x53\x6f\x55\x62\x47','\x68\x4b\x38\x43\x57\x37\x47\x2f','\x69\x76\x64\x64\x4f\x4a\x46\x63\x56\x53\x6b\x54\x57\x4f\x31\x4c\x57\x4f\x57\x30\x45\x48\x57\x6c','\x57\x52\x57\x44\x70\x72\x43\x48\x57\x4f\x2f\x63\x48\x31\x31\x67\x57\x35\x35\x6a\x57\x52\x6d','\x57\x35\x35\x4a\x78\x47','\x57\x51\x34\x35\x44\x43\x6f\x33\x57\x34\x42\x64\x4d\x31\x61\x65','\x6d\x48\x57\x63\x57\x36\x4b\x75\x57\x52\x48\x73\x71\x47','\x69\x77\x38\x4f','\x69\x71\x6d\x4f\x57\x37\x6d\x46','\x57\x37\x78\x63\x48\x71\x75','\x45\x49\x70\x64\x4e\x43\x6f\x62\x43\x4d\x65\x6a\x57\x4f\x4f','\x46\x62\x5a\x63\x52\x43\x6f\x79\x62\x33\x44\x31\x77\x47\x42\x64\x55\x38\x6b\x71\x6b\x76\x4b','\x57\x50\x62\x34\x69\x76\x4f\x62\x6c\x38\x6b\x30\x57\x51\x4b','\x46\x58\x39\x61\x66\x38\x6f\x62','\x57\x36\x46\x63\x4b\x73\x31\x53\x73\x61','\x77\x72\x46\x64\x51\x6d\x6b\x5a\x64\x4c\x7a\x41\x67\x47','\x57\x35\x53\x32\x6c\x48\x78\x63\x4e\x48\x76\x6c\x57\x4f\x79','\x57\x4f\x6a\x4b\x57\x52\x68\x64\x4e\x43\x6f\x6a\x72\x53\x6b\x64\x79\x47','\x6f\x6d\x6b\x2f\x64\x43\x6f\x4e\x57\x52\x6d','\x57\x37\x48\x66\x57\x50\x52\x63\x4a\x49\x74\x64\x55\x61','\x77\x53\x6b\x54\x57\x37\x57\x7a\x6c\x61\x70\x64\x52\x61','\x41\x58\x34\x77\x77\x75\x30','\x57\x51\x4b\x6a\x46\x38\x6f\x48\x57\x35\x74\x64\x49\x66\x61\x6c','\x76\x38\x6b\x77\x57\x34\x2f\x63\x55\x74\x47','\x57\x4f\x38\x6d\x44\x6d\x6f\x62\x57\x36\x75','\x41\x38\x6b\x53\x57\x35\x5a\x63\x50\x61\x30','\x57\x37\x42\x63\x4c\x59\x6a\x31\x57\x4f\x61\x61','\x57\x34\x56\x63\x50\x53\x6f\x78\x57\x50\x33\x63\x54\x62\x54\x74\x63\x61','\x57\x37\x2f\x63\x4d\x77\x4e\x64\x4a\x67\x71','\x45\x57\x70\x64\x4d\x6d\x6f\x4f\x7a\x32\x61','\x57\x50\x58\x53\x69\x68\x38\x32','\x68\x76\x37\x63\x4b\x38\x6b\x59','\x6d\x38\x6b\x39\x68\x43\x6f\x49\x57\x4f\x64\x64\x4b\x4e\x2f\x63\x56\x47','\x57\x51\x47\x58\x57\x50\x6c\x63\x48\x5a\x61','\x57\x51\x53\x5a\x42\x38\x6f\x4e\x57\x35\x52\x64\x54\x4c\x61\x75','\x72\x59\x33\x63\x4e\x4b\x47','\x57\x36\x38\x67\x57\x37\x42\x64\x53\x4e\x56\x64\x50\x43\x6f\x65\x57\x36\x75','\x6e\x38\x6b\x53\x6e\x38\x6b\x69\x6f\x53\x6f\x34\x7a\x6d\x6f\x36\x57\x4f\x34\x68\x6f\x49\x72\x50','\x66\x43\x6f\x42\x75\x77\x61\x49\x57\x52\x4f\x4d\x72\x57','\x45\x62\x37\x63\x51\x53\x6f\x7a\x61\x78\x50\x5a\x42\x63\x46\x64\x54\x38\x6b\x6d\x6d\x31\x53','\x77\x77\x35\x4b\x44\x67\x4a\x64\x53\x43\x6f\x79\x6e\x75\x4f','\x71\x78\x46\x63\x4c\x72\x4f','\x57\x37\x52\x64\x4e\x43\x6b\x32\x57\x37\x78\x64\x56\x33\x61\x6d\x62\x43\x6b\x63\x57\x35\x76\x4f\x57\x36\x30','\x57\x37\x56\x63\x49\x31\x4e\x64\x4d\x57','\x57\x36\x2f\x63\x52\x48\x6a\x6c\x44\x71','\x78\x73\x33\x63\x4e\x47\x78\x64\x50\x53\x6b\x41','\x57\x36\x52\x63\x49\x58\x66\x38\x57\x50\x57\x62\x57\x37\x66\x32','\x57\x4f\x50\x4e\x76\x31\x30\x58\x57\x36\x4e\x64\x4a\x57','\x57\x52\x50\x54\x6e\x32\x47\x64\x6c\x43\x6b\x34\x57\x51\x69','\x77\x72\x46\x64\x4b\x6d\x6b\x49\x65\x4b\x58\x52\x64\x47','\x57\x50\x72\x5a\x57\x4f\x2f\x64\x4a\x6d\x6f\x63\x74\x57','\x57\x51\x68\x63\x50\x73\x54\x53\x57\x34\x70\x64\x4d\x43\x6b\x6d\x57\x34\x79','\x61\x53\x6f\x75\x7a\x43\x6b\x65\x57\x50\x54\x61\x69\x43\x6f\x72','\x57\x51\x6c\x64\x4a\x75\x58\x77\x57\x34\x78\x64\x4e\x6d\x6f\x6e\x44\x57','\x57\x4f\x78\x63\x4f\x53\x6f\x50\x57\x50\x70\x63\x4a\x71','\x6f\x30\x33\x64\x55\x6d\x6b\x6d\x72\x49\x4f\x52\x46\x71','\x57\x50\x48\x64\x57\x50\x4a\x64\x56\x57\x47\x45\x57\x51\x69','\x57\x50\x6e\x65\x63\x65\x30\x36','\x57\x4f\x4c\x34\x57\x50\x42\x64\x49\x38\x6f\x70','\x6b\x43\x6f\x35\x57\x36\x31\x5a\x79\x6d\x6b\x56\x6f\x47','\x57\x37\x57\x79\x65\x5a\x4e\x63\x56\x49\x66\x44\x57\x51\x4f','\x57\x35\x6c\x63\x56\x6d\x6f\x6d\x57\x4f\x6c\x63\x52\x61\x72\x61\x77\x77\x6d\x6a\x78\x38\x6b\x6f\x67\x61','\x73\x65\x56\x63\x54\x38\x6b\x49\x57\x35\x43','\x57\x50\x74\x64\x4a\x6d\x6b\x31\x57\x35\x56\x64\x4a\x57','\x57\x4f\x4b\x4b\x57\x35\x4e\x63\x48\x43\x6f\x6e\x44\x62\x71\x4c','\x57\x51\x4a\x63\x56\x6d\x6f\x74\x57\x37\x47','\x66\x78\x7a\x70\x6d\x47','\x57\x51\x44\x72\x6b\x4b\x57\x33','\x57\x35\x4f\x30\x57\x37\x52\x64\x4a\x67\x4f','\x44\x43\x6b\x72\x65\x53\x6f\x45\x57\x35\x38\x63\x42\x38\x6b\x77','\x67\x53\x6b\x2b\x57\x52\x44\x4f\x57\x36\x57\x41\x57\x34\x68\x64\x56\x71','\x57\x52\x57\x45\x70\x4e\x62\x47\x57\x37\x46\x63\x4b\x4b\x50\x35','\x57\x51\x6d\x58\x57\x50\x37\x63\x47\x64\x68\x63\x4d\x4c\x33\x63\x4a\x71','\x6d\x53\x6b\x54\x6e\x6d\x6b\x6f\x70\x53\x6f\x35\x7a\x43\x6f\x37\x57\x51\x4b\x62\x66\x64\x6a\x72'];_0x5660=function(){return _0x4fdff4;};return _0x5660();}function _0x23143d(_0x26c61a,_0x5f30cc){const _0x3e32db=_0x4a43fc,_0x524e94={'\x78\x61\x69\x52\x70':function(_0x5cab44,_0x5bd2f4){return _0x5cab44(_0x5bd2f4);},'\x76\x4f\x4d\x44\x5a':function(_0x17a9a4,_0x152972){return _0x17a9a4(_0x152972);},'\x46\x71\x63\x54\x4e':function(_0x5db8f8,_0x41ccd){return _0x5db8f8-_0x41ccd;},'\x52\x52\x78\x72\x53':function(_0x33a975,_0x1db886){return _0x33a975/_0x1db886;},'\x4e\x55\x66\x73\x51':function(_0x3b464f,_0x46c8d2){return _0x3b464f(_0x46c8d2);}},_0x41019b=_0x524e94[_0x3e32db(0x20d,'\x36\x65\x35\x26')](_0xd0ddeb,_0x26c61a),_0xb1626b=_0x524e94[_0x3e32db(0x253,'\x36\x51\x65\x34')](_0xd0ddeb,_0x5f30cc),_0x2385a3=Math[_0x3e32db(0x212,'\x36\x51\x65\x34')](-0x1192+-0x1a89*-0x1+-0x8f7,_0x524e94[_0x3e32db(0x218,'\x7a\x69\x62\x41')](_0x41019b,_0xb1626b)),_0x3b1848=_0x41019b>0x1590+0x1a6*-0xd+-0x22?Math['\x6d\x61\x78'](-0x2*0x34d+-0x92*0x6+0x503*0x2,_0x524e94[_0x3e32db(0x1f6,'\x6f\x68\x72\x6b')](0x2031+0x9be*0x4+-0x4728,_0x524e94[_0x3e32db(0x1fc,'\x25\x6e\x73\x57')](_0xb1626b,_0x41019b))):-0x11b*0xb+0x53a*0x4+-0x8bf;return{'\x74\x6f\x6b\x65\x6e\x73\x5f\x73\x61\x76\x65\x64':_0x2385a3,'\x73\x61\x76\x69\x6e\x67\x73\x5f\x70\x63\x74':_0x524e94[_0x3e32db(0x231,'\x73\x72\x50\x68')](_0x55a8f4,_0x3b1848*(0x67a*-0x6+0x1ed8+-0x21a*-0x4))};}function _0x553ca4(_0x38f022){const _0x32c8db=_0x4a43fc,_0x3dd392={'\x66\x70\x49\x6f\x6b':function(_0x36039e,_0x6cd053){return _0x36039e(_0x6cd053);},'\x50\x67\x64\x58\x57':function(_0x1486f9,_0x3f74a7){return _0x1486f9(_0x3f74a7);},'\x54\x55\x69\x61\x65':function(_0x137dd4,_0x166759){return _0x137dd4*_0x166759;},'\x64\x54\x51\x66\x48':function(_0xa49e1f,_0x2f0279){return _0xa49e1f-_0x2f0279;},'\x5a\x48\x46\x71\x73':function(_0x53938e,_0x1a171e){return _0x53938e/_0x1a171e;}},_0x5c7ddd=_0x3dd392[_0x32c8db(0x205,'\x43\x47\x71\x61')](Number,_0x38f022)||0x20b*-0xf+-0x1*0x377+0x221c;return _0x5c7ddd>=-0x54*-0x67+-0x20a1+0x12a*-0x1?_0x3dd392[_0x32c8db(0x1ec,'\x70\x65\x2a\x44')](_0x55a8f4,_0x3dd392[_0x32c8db(0x25e,'\x33\x40\x38\x56')](_0x3dd392[_0x32c8db(0x1fe,'\x35\x25\x56\x47')](-0x3f3*0x7+-0x536+-0x2bd*-0xc,_0x3dd392[_0x32c8db(0x1ff,'\x36\x51\x65\x34')](0x1bc*0x13+0x58f*0x1+-0x2682,_0x5c7ddd)),0x1*0x223a+0x10c3*-0x2+0x1*-0x50)):0x1*0x304+-0x11ed*-0x2+-0x26de;}function _0x182b80(_0x3d22e4){const _0x276b49=_0x4a43fc,_0x1adf58={'\x53\x54\x79\x79\x47':function(_0x426075,_0x228cc1){return _0x426075!==_0x228cc1;},'\x61\x68\x61\x49\x61':function(_0x1373d2,_0x5b36e0){return _0x1373d2(_0x5b36e0);},'\x4f\x43\x51\x50\x5a':function(_0x3040ce,_0x3f7462){return _0x3040ce(_0x3f7462);},'\x45\x56\x49\x46\x58':function(_0x116e36,_0x1044ef){return _0x116e36!=_0x1044ef;}};let _0x285228=0x1*-0x1bd+0x2*0xa81+-0x1345,_0x417265=-0x1711+-0x57a+0x1c8b;for(const _0x219653 of _0x3d22e4||[]){let _0x27f759;if(_0x1adf58['\x53\x54\x79\x79\x47'](_0x219653[_0x276b49(0x22a,'\x35\x70\x5d\x6d')+_0x276b49(0x26e,'\x36\x51\x65\x34')],undefined)&&_0x1adf58[_0x276b49(0x268,'\x33\x40\x38\x56')](_0x219653[_0x276b49(0x24d,'\x41\x62\x36\x59')+_0x276b49(0x237,'\x21\x46\x67\x6c')],null))_0x27f759=_0x1adf58[_0x276b49(0x258,'\x6e\x46\x31\x61')](_0xd0ddeb,_0x219653[_0x276b49(0x1ee,'\x67\x50\x79\x38')+_0x276b49(0x276,'\x72\x72\x52\x46')]);else{const _0x2e8c6d=_0x12cc6d[_0x276b49(0x262,'\x67\x50\x79\x38')+_0x276b49(0x269,'\x43\x47\x71\x61')+_0x276b49(0x1f0,'\x72\x72\x52\x46')][_0x219653['\x74\x79\x70\x65']];if(_0x2e8c6d===undefined)continue;_0x27f759=_0x2e8c6d;}const _0x100523=_0x1adf58[_0x276b49(0x204,'\x26\x66\x41\x62')](_0xd0ddeb,_0x1adf58[_0x276b49(0x1ef,'\x38\x61\x31\x6f')](_0x219653[_0x276b49(0x206,'\x4d\x59\x77\x52')],null)?_0x219653[_0x276b49(0x1e7,'\x70\x65\x2a\x44')]:-0x2052*-0x1+-0x2*0xe66+-0x385);_0x285228+=_0x27f759*_0x100523,_0x417265+=_0x100523;}const _0x1fc492={};return _0x1fc492[_0x276b49(0x26b,'\x51\x74\x41\x24')+_0x276b49(0x213,'\x25\x74\x61\x45')+'\x65\x64']=_0x285228,_0x1fc492[_0x276b49(0x27b,'\x43\x47\x71\x61')+'\x65\x6e\x74\x73']=_0x417265,_0x1fc492;}function _0x521426(_0x42bdcc){const _0xed6103=_0x4a43fc,_0x75456f={};_0x75456f[_0xed6103(0x210,'\x26\x66\x41\x62')]=function(_0x5a6261,_0x52e771){return _0x5a6261||_0x52e771;},_0x75456f[_0xed6103(0x246,'\x73\x31\x44\x29')]=function(_0x54184a,_0x2a6d90){return _0x54184a*_0x2a6d90;},_0x75456f['\x46\x79\x6b\x67\x68']=function(_0x1db772,_0x4ef635){return _0x1db772===_0x4ef635;};const _0x38e763=_0x75456f;let _0x3ca2a1=-0x15e0+0x730+0xeb0;for(const [_0x265176,_0x10735a]of Object[_0xed6103(0x27d,'\x35\x70\x5d\x6d')](_0x38e763[_0xed6103(0x21b,'\x67\x55\x42\x63')](_0x42bdcc,{}))){const _0x18ce8e=_0x12cc6d[_0xed6103(0x23c,'\x32\x74\x48\x40')+_0xed6103(0x240,'\x48\x4d\x73\x34')+_0xed6103(0x234,'\x59\x38\x71\x28')][_0x265176];_0x3ca2a1+=_0x38e763[_0xed6103(0x217,'\x48\x36\x68\x70')](_0x38e763['\x46\x79\x6b\x67\x68'](_0x18ce8e,undefined)?-0x223f+-0x1*0x4e1+0x2720:_0x18ce8e,_0xd0ddeb(_0x10735a));}return _0x3ca2a1;}function _0x1eefe6(_0x1130a4,_0x3770b0){const _0x606ab3=_0x4a43fc,_0x45b560={'\x66\x52\x61\x41\x4c':function(_0xae2c4e,_0x658dbc){return _0xae2c4e(_0x658dbc);},'\x6f\x46\x4a\x78\x4a':function(_0xfd8d7f,_0x2a66e8){return _0xfd8d7f>_0x2a66e8;},'\x74\x67\x50\x48\x77':_0x606ab3(0x1f1,'\x35\x25\x56\x47')+_0x606ab3(0x1f3,'\x6c\x37\x25\x51')+'\x72\x61\x64\x69\x75\x73','\x42\x71\x48\x50\x77':'\x65\x73\x74\x69\x6d\x61\x74\x65'+_0x606ab3(0x230,'\x32\x74\x48\x40')+'\x74','\x61\x6e\x77\x68\x6b':function(_0x5a1d8e,_0x3cbcc8){return _0x5a1d8e+_0x3cbcc8;},'\x77\x42\x4a\x68\x50':function(_0x476936,_0x3575f8){return _0x476936*_0x3575f8;},'\x70\x6a\x61\x74\x4f':function(_0x34427d,_0x5ba390){return _0x34427d===_0x5ba390;},'\x63\x67\x47\x52\x5a':_0x606ab3(0x251,'\x5e\x33\x28\x5d')+'\x65'},_0x487311=_0x12cc6d['\x72\x65\x75\x73\x65\x5f\x65\x73'+_0x606ab3(0x26f,'\x33\x5b\x57\x6e')],_0x21cd89=_0x45b560['\x66\x52\x61\x41\x4c'](Number,_0x1130a4),_0x39d488=Number[_0x606ab3(0x219,'\x6e\x46\x31\x61')](_0x21cd89)&&_0x45b560[_0x606ab3(0x21a,'\x50\x29\x68\x61')](_0x21cd89,0xf*-0x9e+-0x131f+0x1c61*0x1),_0x4305af=_0x39d488?_0x45b560[_0x606ab3(0x1e5,'\x41\x62\x36\x59')]:_0x45b560[_0x606ab3(0x1fb,'\x77\x30\x44\x6b')],_0x1b6d23=_0x39d488?_0x21cd89:_0x487311[_0x606ab3(0x1e9,'\x48\x36\x68\x70')+'\x63\x68\x61\x6e\x67\x65\x64\x5f'+_0x606ab3(0x228,'\x73\x31\x44\x29')],_0x3e77c5=Math[_0x606ab3(0x21e,'\x6e\x40\x32\x4e')](_0x45b560[_0x606ab3(0x207,'\x76\x68\x4e\x35')](_0x487311[_0x606ab3(0x266,'\x41\x62\x36\x59')+_0x606ab3(0x273,'\x25\x74\x61\x45')+'\x6e\x73'],_0x45b560[_0x606ab3(0x259,'\x4d\x59\x77\x52')](_0x1b6d23,_0x487311[_0x606ab3(0x24f,'\x6c\x23\x25\x78')+_0x606ab3(0x22b,'\x48\x31\x57\x54')+_0x606ab3(0x271,'\x21\x46\x67\x6c')])),_0x487311[_0x606ab3(0x208,'\x59\x38\x71\x28')+_0x606ab3(0x220,'\x35\x25\x56\x47')+'\x73']),_0x4942a4=Math[_0x606ab3(0x265,'\x33\x40\x38\x56')](_0x45b560[_0x606ab3(0x203,'\x45\x64\x49\x70')](_0x3770b0,_0x45b560[_0x606ab3(0x227,'\x6c\x37\x25\x51')])?_0x3e77c5*_0x487311['\x72\x65\x66\x65\x72\x65\x6e\x63'+'\x65\x5f\x73\x61\x76\x69\x6e\x67'+_0x606ab3(0x24a,'\x36\x51\x65\x34')+'\x6e']:_0x3e77c5),_0x16d4e1={};return _0x16d4e1[_0x606ab3(0x24b,'\x70\x65\x2a\x44')+_0x606ab3(0x245,'\x51\x74\x41\x24')]=_0x4942a4,_0x16d4e1[_0x606ab3(0x1f5,'\x5e\x33\x28\x5d')]=_0x4305af,_0x16d4e1;}function _0x11819d(_0x5dcb9e,_0x59556a){const _0x5d7833=_0x4a43fc,_0x5b1d80={'\x6e\x6e\x78\x75\x6e':function(_0x10c79d,_0x3725de){return _0x10c79d(_0x3725de);},'\x79\x75\x66\x70\x6e':function(_0x2db32d,_0x232bf7){return _0x2db32d>_0x232bf7;},'\x63\x66\x72\x79\x58':function(_0x31c6ba,_0xe6cc7a){return _0x31c6ba/_0xe6cc7a;},'\x4f\x4b\x77\x77\x6a':function(_0x3932e3,_0x4df556){return _0x3932e3+_0x4df556;}},_0x1cb589=_0x5b1d80[_0x5d7833(0x23b,'\x67\x50\x79\x38')](_0xd0ddeb,_0x5dcb9e),_0x409e69=_0x5b1d80[_0x5d7833(0x26d,'\x4d\x44\x32\x32')](_0xd0ddeb,_0x59556a);return _0x5b1d80[_0x5d7833(0x20b,'\x42\x4f\x48\x49')](_0x1cb589+_0x409e69,0x2f*-0x62+-0x12b*0x21+0x3889*0x1)?_0x5b1d80[_0x5d7833(0x254,'\x48\x31\x57\x54')](_0x55a8f4,_0x5b1d80['\x63\x66\x72\x79\x58'](_0x1cb589,_0x5b1d80['\x4f\x4b\x77\x77\x6a'](_0x1cb589,_0x409e69))*(-0x180f+-0x2097+0x390a)):-0x210f+-0x503*-0x3+-0x3*-0x602;}function _0x2a6b6c(_0x3648a2){const _0x2be2ab=_0x4a43fc,_0x18979c={'\x66\x49\x45\x76\x54':function(_0x5c976e,_0x32b099){return _0x5c976e(_0x32b099);},'\x64\x76\x49\x6f\x66':function(_0x2aee00,_0x334b2c){return _0x2aee00*_0x334b2c;},'\x6c\x76\x4d\x68\x61':function(_0x50a235,_0x30769b){return _0x50a235/_0x30769b;}};return _0x18979c[_0x2be2ab(0x209,'\x25\x6e\x73\x57')](_0x55a8f4,_0x18979c['\x64\x76\x49\x6f\x66'](_0x18979c['\x6c\x76\x4d\x68\x61'](_0xd0ddeb(_0x3648a2),-0x93e33+0x572c7+-0x11eec*-0x11),_0x12cc6d[_0x2be2ab(0x224,'\x21\x46\x67\x6c')+_0x2be2ab(0x26a,'\x72\x6e\x58\x6d')+'\x5f\x62\x6c\x65\x6e\x64\x65\x64']));}function _0x500745(_0x253321,_0x302aae){const _0x8ed41b=_0x4a43fc,_0xcd7d7c={'\x74\x52\x46\x4a\x43':function(_0x1b9021,_0x500ac2){return _0x1b9021(_0x500ac2);},'\x4a\x65\x45\x56\x50':function(_0x5dddd5,_0x53c4e5){return _0x5dddd5*_0x53c4e5;},'\x4e\x4d\x6a\x55\x42':function(_0x1830b4,_0xce4487){return _0x1830b4===_0xce4487;}},_0x191206=_0x12cc6d[_0x8ed41b(0x1e4,'\x21\x46\x67\x6c')+_0x8ed41b(0x1ea,'\x32\x74\x48\x40')+_0x8ed41b(0x200,'\x6a\x50\x78\x6b')+_0x8ed41b(0x25f,'\x4e\x51\x76\x50')+'\x73'][_0x253321];return _0xcd7d7c[_0x8ed41b(0x1f7,'\x73\x72\x50\x68')](_0x498bb7,_0xcd7d7c['\x4a\x65\x45\x56\x50'](_0xcd7d7c[_0x8ed41b(0x1f8,'\x70\x36\x75\x56')](_0xd0ddeb,_0x302aae)/(0x1b2f3a+-0x2f*0x2c5c+0x21*-0x1d56),_0xcd7d7c[_0x8ed41b(0x250,'\x6a\x50\x78\x6b')](_0x191206,undefined)?0x9*0x374+0xe9c+-0x2db0:_0x191206));}const _0x2f65de={};_0x2f65de[_0x4a43fc(0x256,'\x35\x70\x5d\x6d')+_0x4a43fc(0x202,'\x51\x74\x41\x24')+_0x4a43fc(0x23d,'\x72\x72\x52\x46')]=_0x12cc6d[_0x4a43fc(0x275,'\x39\x24\x58\x29')+_0x4a43fc(0x1ed,'\x48\x31\x57\x54')],_0x2f65de['\x43\x4f\x4e\x53\x54\x41\x4e\x54'+'\x53']=_0x12cc6d,_0x2f65de[_0x4a43fc(0x20f,'\x6c\x23\x25\x78')+_0x4a43fc(0x252,'\x36\x65\x35\x26')]=_0x23143d,_0x2f65de[_0x4a43fc(0x248,'\x59\x38\x71\x28')+_0x4a43fc(0x20a,'\x2a\x37\x76\x45')]=_0x553ca4,_0x2f65de[_0x4a43fc(0x215,'\x6c\x23\x25\x78')+_0x4a43fc(0x243,'\x38\x61\x31\x6f')]=_0x182b80,_0x2f65de[_0x4a43fc(0x1f2,'\x50\x29\x68\x61')+_0x4a43fc(0x277,'\x35\x70\x5d\x6d')+'\x74\x65']=_0x521426,_0x2f65de[_0x4a43fc(0x23a,'\x70\x36\x75\x56')+_0x4a43fc(0x214,'\x32\x74\x48\x40')]=_0x1eefe6,_0x2f65de[_0x4a43fc(0x1e6,'\x48\x36\x68\x70')+'\x63\x74']=_0x11819d,_0x2f65de[_0x4a43fc(0x226,'\x36\x51\x65\x34')]=_0x2a6b6c,_0x2f65de[_0x4a43fc(0x1eb,'\x35\x70\x5d\x6d')+_0x4a43fc(0x236,'\x51\x74\x41\x24')]=_0x500745,module['\x65\x78\x70\x6f\x72\x74\x73']=_0x2f65de;
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// Capsule Schema — single source of truth for the Capsule object shape.
|
|
5
|
-
// All modules that create or consume Capsule objects should use
|
|
6
|
-
// createCapsule() and validateCapsule() rather than assuming field presence.
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
|
-
|
|
9
|
-
const { SCHEMA_VERSION } = require('../contentHash');
|
|
10
|
-
|
|
11
|
-
const VALID_OUTCOME_STATUSES = ['success', 'failed'];
|
|
12
|
-
const VALID_SOURCE_TYPES = ['generated', 'reused', 'reference', 'user_authored'];
|
|
13
|
-
const VALID_VISIBILITIES = ['private', 'unlisted', 'public'];
|
|
14
|
-
const VALID_COST_TIERS = ['cheap', 'standard', 'premium'];
|
|
15
|
-
|
|
16
|
-
const CAPSULE_DEFAULTS = {
|
|
17
|
-
type: 'Capsule',
|
|
18
|
-
id: null,
|
|
19
|
-
schema_version: SCHEMA_VERSION,
|
|
20
|
-
trigger: [],
|
|
21
|
-
gene: null,
|
|
22
|
-
summary: '',
|
|
23
|
-
confidence: 0,
|
|
24
|
-
blast_radius: { files: 0, lines: 0 },
|
|
25
|
-
outcome: { status: 'failed', score: 0 },
|
|
26
|
-
success_streak: 0,
|
|
27
|
-
success_reason: null,
|
|
28
|
-
gene_library_version: null,
|
|
29
|
-
env_fingerprint: null,
|
|
30
|
-
source_type: null,
|
|
31
|
-
reused_asset_id: null,
|
|
32
|
-
// Real measured token cost of deriving this capsule (input+output), captured
|
|
33
|
-
// from the proxy trace meter at solidify time. null when the proxy was
|
|
34
|
-
// inactive or usage was unobserved (consumers fall back to an estimate).
|
|
35
|
-
// Shape: { input_tokens, output_tokens, total_tokens, basis:'measured' }.
|
|
36
|
-
derivation_tokens: null,
|
|
37
|
-
a2a: { eligible_to_broadcast: false },
|
|
38
|
-
content: null,
|
|
39
|
-
diff: null,
|
|
40
|
-
strategy: [],
|
|
41
|
-
execution_trace: [],
|
|
42
|
-
asset_id: null,
|
|
43
|
-
// Spec 1.8.0 §Appendix C user-authored fields. All default to null
|
|
44
|
-
// so a generated capsule emits the same on-wire shape it always has;
|
|
45
|
-
// /capsule save in evox sets these explicitly.
|
|
46
|
-
visibility: null,
|
|
47
|
-
scope: null,
|
|
48
|
-
cost_tier: null,
|
|
49
|
-
pack_of: null,
|
|
50
|
-
author: null,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// createCapsule: merge partial with defaults and normalize array/object fields.
|
|
54
|
-
// Safe to call with a fully-formed Capsule (idempotent).
|
|
55
|
-
function createCapsule(partial) {
|
|
56
|
-
const c = Object.assign({}, CAPSULE_DEFAULTS, partial);
|
|
57
|
-
|
|
58
|
-
// Fresh array copies — never hold references to CAPSULE_DEFAULTS arrays.
|
|
59
|
-
c.trigger = Array.isArray(c.trigger) ? c.trigger.slice() : [];
|
|
60
|
-
c.strategy = Array.isArray(c.strategy) ? c.strategy.slice() : [];
|
|
61
|
-
c.execution_trace = Array.isArray(c.execution_trace) ? c.execution_trace.slice() : [];
|
|
62
|
-
|
|
63
|
-
// Normalize blast_radius
|
|
64
|
-
if (!c.blast_radius || typeof c.blast_radius !== 'object') {
|
|
65
|
-
c.blast_radius = { files: 0, lines: 0 };
|
|
66
|
-
} else {
|
|
67
|
-
c.blast_radius = Object.assign({ files: 0, lines: 0 }, c.blast_radius);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Normalize outcome
|
|
71
|
-
if (!c.outcome || typeof c.outcome !== 'object') {
|
|
72
|
-
c.outcome = { status: 'failed', score: 0 };
|
|
73
|
-
} else {
|
|
74
|
-
c.outcome = Object.assign({ status: 'failed', score: 0 }, c.outcome);
|
|
75
|
-
if (!VALID_OUTCOME_STATUSES.includes(c.outcome.status)) {
|
|
76
|
-
c.outcome.status = 'failed';
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Normalize a2a
|
|
81
|
-
if (!c.a2a || typeof c.a2a !== 'object') {
|
|
82
|
-
c.a2a = { eligible_to_broadcast: false };
|
|
83
|
-
} else {
|
|
84
|
-
c.a2a = Object.assign({ eligible_to_broadcast: false }, c.a2a);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Normalize derivation_tokens (optional measured-cost object). Coerce a
|
|
88
|
-
// malformed value to null so it never trips downstream schema validation.
|
|
89
|
-
if (c.derivation_tokens != null) {
|
|
90
|
-
const d = c.derivation_tokens;
|
|
91
|
-
if (typeof d !== 'object' || Array.isArray(d)) {
|
|
92
|
-
c.derivation_tokens = null;
|
|
93
|
-
} else {
|
|
94
|
-
const inp = Number(d.input_tokens);
|
|
95
|
-
const out = Number(d.output_tokens);
|
|
96
|
-
const tot = Number(d.total_tokens);
|
|
97
|
-
const safeInp = Number.isFinite(inp) && inp >= 0 ? inp : 0;
|
|
98
|
-
const safeOut = Number.isFinite(out) && out >= 0 ? out : 0;
|
|
99
|
-
c.derivation_tokens = {
|
|
100
|
-
input_tokens: safeInp,
|
|
101
|
-
output_tokens: safeOut,
|
|
102
|
-
total_tokens: Number.isFinite(tot) && tot >= 0 ? tot : safeInp + safeOut,
|
|
103
|
-
basis: typeof d.basis === 'string' ? d.basis : 'measured',
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Normalize string fields
|
|
109
|
-
if (typeof c.summary !== 'string') c.summary = '';
|
|
110
|
-
if (typeof c.schema_version !== 'string') c.schema_version = SCHEMA_VERSION;
|
|
111
|
-
if (typeof c.confidence !== 'number') c.confidence = 0;
|
|
112
|
-
|
|
113
|
-
// Normalize spec 1.8.0 §Appendix C fields. Schema declares
|
|
114
|
-
// additionalProperties:false so any unrecognized value here would
|
|
115
|
-
// fail validation downstream — coerce malformed inputs to null
|
|
116
|
-
// rather than letting them propagate.
|
|
117
|
-
if (c.visibility != null && !VALID_VISIBILITIES.includes(c.visibility)) {
|
|
118
|
-
c.visibility = null;
|
|
119
|
-
}
|
|
120
|
-
if (c.scope != null && !Array.isArray(c.scope)) {
|
|
121
|
-
c.scope = null;
|
|
122
|
-
} else if (Array.isArray(c.scope)) {
|
|
123
|
-
c.scope = c.scope.slice();
|
|
124
|
-
}
|
|
125
|
-
if (c.cost_tier != null && !VALID_COST_TIERS.includes(c.cost_tier)) {
|
|
126
|
-
c.cost_tier = null;
|
|
127
|
-
}
|
|
128
|
-
if (c.pack_of != null && !Array.isArray(c.pack_of)) {
|
|
129
|
-
c.pack_of = null;
|
|
130
|
-
} else if (Array.isArray(c.pack_of)) {
|
|
131
|
-
c.pack_of = c.pack_of.slice();
|
|
132
|
-
}
|
|
133
|
-
// author: schema requires both `handle` and `evox_install_id` when
|
|
134
|
-
// the field is present. A partial pair (e.g. handle without
|
|
135
|
-
// install_id) would fail schema validation, so drop it.
|
|
136
|
-
if (c.author != null) {
|
|
137
|
-
if (typeof c.author !== 'object' || !c.author.handle || !c.author.evox_install_id) {
|
|
138
|
-
c.author = null;
|
|
139
|
-
} else {
|
|
140
|
-
c.author = { handle: c.author.handle, evox_install_id: c.author.evox_install_id };
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return c;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// validateCapsule: throw if required fields are missing or malformed.
|
|
148
|
-
// Use before broadcasting/publishing a Capsule to the Hub or writing to disk.
|
|
149
|
-
function validateCapsule(c) {
|
|
150
|
-
if (!c || typeof c !== 'object') throw new Error('Capsule must be an object');
|
|
151
|
-
if (c.type !== 'Capsule') throw new Error('Capsule.type must be "Capsule", got: ' + c.type);
|
|
152
|
-
if (!c.id || typeof c.id !== 'string') throw new Error('Capsule.id is required and must be a string');
|
|
153
|
-
if (!c.outcome || typeof c.outcome !== 'object')
|
|
154
|
-
throw new Error('Capsule.outcome must be an object');
|
|
155
|
-
if (!VALID_OUTCOME_STATUSES.includes(c.outcome.status))
|
|
156
|
-
throw new Error('Capsule.outcome.status must be one of: ' + VALID_OUTCOME_STATUSES.join(', ') + ', got: ' + c.outcome.status);
|
|
157
|
-
if (!Array.isArray(c.trigger)) throw new Error('Capsule.trigger must be an array');
|
|
158
|
-
if (!Array.isArray(c.execution_trace)) throw new Error('Capsule.execution_trace must be an array');
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
module.exports = {
|
|
163
|
-
createCapsule,
|
|
164
|
-
validateCapsule,
|
|
165
|
-
CAPSULE_DEFAULTS,
|
|
166
|
-
VALID_OUTCOME_STATUSES,
|
|
167
|
-
VALID_SOURCE_TYPES,
|
|
168
|
-
VALID_VISIBILITIES,
|
|
169
|
-
VALID_COST_TIERS,
|
|
170
|
-
};
|