@evomap/evolver 1.89.9 → 1.89.11

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.
Files changed (71) hide show
  1. package/README.ja-JP.md +1 -1
  2. package/README.ko-KR.md +1 -1
  3. package/README.md +2 -1
  4. package/README.zh-CN.md +1 -1
  5. package/assets/cover.png +0 -0
  6. package/index.js +5 -3
  7. package/package.json +1 -1
  8. package/src/adapters/scripts/evolver-session-end.js +18 -37
  9. package/src/atp/atpExecute.js +27 -71
  10. package/src/atp/serviceHelper.js +28 -36
  11. package/src/config.js +17 -0
  12. package/src/evolve/guards.js +1 -1
  13. package/src/evolve/pipeline/collect.js +1 -1
  14. package/src/evolve/pipeline/dispatch.js +1 -1
  15. package/src/evolve/pipeline/enrich.js +1 -1
  16. package/src/evolve/pipeline/hub.js +1 -1
  17. package/src/evolve/pipeline/select.js +1 -1
  18. package/src/evolve/pipeline/signals.js +1 -1
  19. package/src/evolve/utils.js +1 -1
  20. package/src/evolve.js +1 -1
  21. package/src/gep/a2aProtocol.js +1 -1
  22. package/src/gep/antiAbuseTelemetry.js +1 -1
  23. package/src/gep/autoDistillConv.js +1 -1
  24. package/src/gep/autoDistillLlm.js +1 -1
  25. package/src/gep/candidateEval.js +1 -1
  26. package/src/gep/candidates.js +1 -1
  27. package/src/gep/contentHash.js +1 -1
  28. package/src/gep/conversationSniffer.js +1 -1
  29. package/src/gep/crypto.js +1 -1
  30. package/src/gep/curriculum.js +1 -1
  31. package/src/gep/deviceId.js +1 -1
  32. package/src/gep/envFingerprint.js +1 -1
  33. package/src/gep/epigenetics.js +1 -1
  34. package/src/gep/execBridge.js +1 -1
  35. package/src/gep/explore.js +1 -1
  36. package/src/gep/hash.js +1 -1
  37. package/src/gep/hubFetch.js +1 -1
  38. package/src/gep/hubReview.js +1 -1
  39. package/src/gep/hubSearch.js +1 -1
  40. package/src/gep/hubVerify.js +1 -1
  41. package/src/gep/learningSignals.js +1 -1
  42. package/src/gep/memoryGraph.js +1 -1
  43. package/src/gep/memoryGraphAdapter.js +1 -1
  44. package/src/gep/mutation.js +1 -1
  45. package/src/gep/narrativeMemory.js +1 -1
  46. package/src/gep/oauthLogin.js +9 -3
  47. package/src/gep/openPRRegistry.js +1 -1
  48. package/src/gep/personality.js +1 -1
  49. package/src/gep/policyCheck.js +1 -1
  50. package/src/gep/privacyClient.js +10 -9
  51. package/src/gep/prompt.js +1 -1
  52. package/src/gep/recallInject.js +1 -1
  53. package/src/gep/recallVerifier.js +1 -1
  54. package/src/gep/reflection.js +1 -1
  55. package/src/gep/savingsCore.js +1 -1
  56. package/src/gep/selector.js +1 -1
  57. package/src/gep/signals.js +85 -17
  58. package/src/gep/skillDistiller.js +1 -1
  59. package/src/gep/solidify.js +1 -1
  60. package/src/gep/strategy.js +1 -1
  61. package/src/gep/tokenSavings.js +1 -1
  62. package/src/gep/workspaceKeychain.js +1 -1
  63. package/src/proxy/extensions/traceControl.js +1 -1
  64. package/src/proxy/index.js +369 -20
  65. package/src/proxy/inject.js +1 -1
  66. package/src/proxy/router/models_route.js +52 -0
  67. package/src/proxy/router/ollama_route.js +103 -0
  68. package/src/proxy/router/vertex_route.js +110 -0
  69. package/src/proxy/server/routes.js +30 -7
  70. package/src/proxy/trace/extractor.js +1 -1
  71. package/src/proxy/trace/usage.js +1 -1
@@ -8,6 +8,9 @@ const { buildMessagesHandler, canonicalizeForBedrock, supportsAdaptiveThinking }
8
8
  const { ensureEnvelope } = require('./envelope');
9
9
  const { buildResponsesHandler, buildChatCompletionsHandler } = require('./router/responses_route');
10
10
  const { buildGeminiHandler } = require('./router/gemini_route');
11
+ const { buildModelsHandler } = require('./router/models_route');
12
+ const { buildOllamaHandler } = require('./router/ollama_route');
13
+ const { buildVertexHandler } = require('./router/vertex_route');
11
14
  const { SyncEngine } = require('./sync/engine');
12
15
  const { LifecycleManager } = require('./lifecycle/manager');
13
16
  const { TaskMonitor } = require('./task/monitor');
@@ -16,6 +19,7 @@ const { DmHandler } = require('./extensions/dmHandler');
16
19
  const { SessionHandler } = require('./extensions/sessionHandler');
17
20
  const { TraceControl } = require('./extensions/traceControl');
18
21
  const { backfillProxyTraceUploads } = require('./trace/extractor');
22
+ const { hubFetch } = require('../gep/hubFetch');
19
23
 
20
24
  const TRACE_BACKFILL_DRAIN_MAX_PASSES = 8;
21
25
  const TRACE_BACKFILL_STARTUP_DRAIN_MAX_MS = 250;
@@ -26,6 +30,7 @@ function _defaultDataDir() { return getEvomapPath('mailbox'); }
26
30
 
27
31
  const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';
28
32
  const DEFAULT_GEMINI_BASE_URL = 'https://generativelanguage.googleapis.com';
33
+ const DEFAULT_OLLAMA_BASE_URL = 'http://127.0.0.1:11434';
29
34
 
30
35
  function isAllowedOpenAIHostname(hostname) {
31
36
  const h = String(hostname || '').toLowerCase();
@@ -74,6 +79,24 @@ function makeGeminiGatewayError(err, fallbackStatus = 502) {
74
79
  return out;
75
80
  }
76
81
 
82
+ function makeOllamaGatewayError(err, fallbackStatus = 502) {
83
+ const name = err && err.name ? String(err.name) : '';
84
+ const isTimeout = name === 'TimeoutError' || name === 'AbortError';
85
+ const out = new Error(isTimeout ? 'ollama upstream timed out' : 'ollama upstream request failed');
86
+ out.statusCode = isTimeout ? 504 : fallbackStatus;
87
+ out.cause = err;
88
+ return out;
89
+ }
90
+
91
+ function makeVertexGatewayError(err, fallbackStatus = 502) {
92
+ const name = err && err.name ? String(err.name) : '';
93
+ const isTimeout = name === 'TimeoutError' || name === 'AbortError';
94
+ const out = new Error(isTimeout ? 'vertex upstream timed out' : 'vertex upstream request failed');
95
+ out.statusCode = isTimeout ? 504 : fallbackStatus;
96
+ out.cause = err;
97
+ return out;
98
+ }
99
+
77
100
  // The hub serves asset signal-search as `GET /a2a/assets/search` with query
78
101
  // params (signals, status, limit, fields, domain); `signals`/`fields` are
79
102
  // comma-separated lists. The proxy's public contract stays `POST /asset/search`
@@ -120,6 +143,33 @@ function planAssetSearch(body = {}) {
120
143
  return { path: '/a2a/assets/search', query: buildAssetSearchQuery(body) };
121
144
  }
122
145
 
146
+ // Asset-search client-side relief. The hub meters /a2a/assets/search per client
147
+ // IP, so an entire proxy fleet sharing one egress (plus the operator hitting it
148
+ // manually) collapses into a single bucket and 429s itself. We cache identical
149
+ // signal searches briefly, collapse concurrent duplicates into one request, and
150
+ // honour the hub's Retry-After so we stop hammering — and stop consuming the
151
+ // shared bucket — during a rate-limit window. Tunable via env for ops.
152
+ const ASSET_SEARCH_CACHE_TTL_MS = Number(process.env.EVOMAP_ASSET_SEARCH_CACHE_TTL_MS) || 30_000;
153
+ const ASSET_SEARCH_CACHE_MAX = Number(process.env.EVOMAP_ASSET_SEARCH_CACHE_MAX) || 256;
154
+ // How long a cached result may still be served as "stale" while we are in a
155
+ // rate-limit cooldown (better to return slightly-old discovery results than to
156
+ // fail the caller and fire a doomed request).
157
+ const ASSET_SEARCH_STALE_GRACE_MS = 5 * 60_000;
158
+
159
+ // Extract a retry delay (ms) from a hub 429 response: prefer the JSON body's
160
+ // ms-precision retry_after_ms (buildRateLimitBody), fall back to the RFC
161
+ // Retry-After header (seconds). Returns 0 when neither is present.
162
+ function parseRetryAfterMs(res, bodyText) {
163
+ try {
164
+ const body = bodyText ? JSON.parse(bodyText) : null;
165
+ const ms = Number(body && body.retry_after_ms);
166
+ if (Number.isFinite(ms) && ms > 0) return Math.ceil(ms);
167
+ } catch { /* body is not JSON; fall through to the header */ }
168
+ const secs = Number(res && res.headers && res.headers.get && res.headers.get('retry-after'));
169
+ if (Number.isFinite(secs) && secs > 0) return secs * 1000;
170
+ return 0;
171
+ }
172
+
123
173
  class EvoMapProxy {
124
174
  constructor(opts = {}) {
125
175
  // evolver#567: default to the canonical Hub URL (config.resolveHubUrl →
@@ -138,6 +188,7 @@ class EvoMapProxy {
138
188
  this._anthropicBaseUrl = (opts.anthropicBaseUrl || process.env.EVOMAP_ANTHROPIC_BASE_URL || 'https://api.anthropic.com').replace(/\/+$/, '');
139
189
  this._openaiBaseUrl = String(opts.openaiBaseUrl || process.env.EVOMAP_OPENAI_BASE_URL || DEFAULT_OPENAI_BASE_URL).replace(/\/+$/, '');
140
190
  this._geminiBaseUrl = String(opts.geminiBaseUrl || process.env.EVOMAP_GEMINI_BASE_URL || DEFAULT_GEMINI_BASE_URL).replace(/\/+$/, '');
191
+ this._ollamaBaseUrl = String(opts.ollamaBaseUrl || process.env.EVOMAP_OLLAMA_BASE_URL || DEFAULT_OLLAMA_BASE_URL).replace(/\/+$/, '');
141
192
  this._openaiBaseUrlTrusted = !!opts.openaiBaseUrl;
142
193
 
143
194
  this.store = null;
@@ -151,6 +202,11 @@ class EvoMapProxy {
151
202
  this.traceControl = null;
152
203
  this._traceBackfillDraining = false;
153
204
  this._started = false;
205
+
206
+ // Asset-search relief state (see ASSET_SEARCH_* constants above).
207
+ this._searchCache = new Map(); // key -> { value, expiresAt, staleUntil }
208
+ this._searchInflight = new Map(); // key -> Promise (concurrent dedup)
209
+ this._searchCooldownUntil = 0; // epoch ms; >now means hub rate-limited us
154
210
  }
155
211
 
156
212
  async start() {
@@ -225,11 +281,9 @@ class EvoMapProxy {
225
281
  assetFetch: (body) => this._proxyHttp('/a2a/fetch', this._wrapA2a('fetch', body)),
226
282
  // GET (not POST). planAssetSearch() picks signal-search vs semantic-search
227
283
  // by whether the body carries a free-text `query` or a `signals` list.
228
- assetSearch: (body) => {
229
- const plan = planAssetSearch(body);
230
- return this._proxyHttp(plan.path, null, { method: 'GET', query: plan.query });
231
- },
284
+ assetSearch: (body) => this._assetSearch(body),
232
285
  assetValidate: (body) => this._proxyHttp('/a2a/validate', this._wrapA2a('validate', body)),
286
+ assetPublish: (body) => this._assetPublish(body),
233
287
  // ATP passthrough (#460 Bug 2): merchant/consumer flows that used to call
234
288
  // hub directly via src/atp/hubClient.js must route through the proxy when
235
289
  // EVOMAP_PROXY=1 so proxy sees the transaction (for audit + offline queue).
@@ -276,6 +330,23 @@ class EvoMapProxy {
276
330
  traceStore: this.store,
277
331
  onTraceQueued: () => this.sync?.notifyNewOutbound(),
278
332
  });
333
+ const modelsHandler = buildModelsHandler({
334
+ // Models list goes straight to the native upstream (never bedrock — /v1/models is an Anthropic/OpenAI
335
+ // API concept), so call the provider methods directly rather than the EVOMAP_UPSTREAM-aware closure.
336
+ anthropicProxy: (reqPath, body, opts) => this._proxyAnthropic(reqPath, body, opts),
337
+ openAIProxy: (reqPath, body, opts) => this._proxyOpenAIResponses(reqPath, body, opts),
338
+ logger: this.logger,
339
+ });
340
+ const ollamaProxy = (reqPath, body, opts) => this._proxyOllama(reqPath, body, opts);
341
+ const ollamaTraceOpts = { logger: this.logger, traceStore: this.store, onTraceQueued: () => this.sync?.notifyNewOutbound() };
342
+ const ollamaChatHandler = buildOllamaHandler({ ollamaProxy, apiPath: '/api/chat', ...ollamaTraceOpts });
343
+ const ollamaGenerateHandler = buildOllamaHandler({ ollamaProxy, apiPath: '/api/generate', ...ollamaTraceOpts });
344
+ const vertexHandler = buildVertexHandler({
345
+ vertexProxy: (reqPath, body, opts) => this._proxyVertex(reqPath, body, opts),
346
+ logger: this.logger,
347
+ traceStore: this.store,
348
+ onTraceQueued: () => this.sync?.notifyNewOutbound(),
349
+ });
279
350
 
280
351
  const routes = buildRoutes(this.store, proxyHandlers, this.taskMonitor, {
281
352
  dmHandler: this.dmHandler,
@@ -286,6 +357,10 @@ class EvoMapProxy {
286
357
  responsesHandler,
287
358
  geminiHandler,
288
359
  chatCompletionsHandler,
360
+ modelsHandler,
361
+ ollamaChatHandler,
362
+ ollamaGenerateHandler,
363
+ vertexHandler,
289
364
  });
290
365
 
291
366
  const OUTBOUND_ROUTES = [
@@ -466,7 +541,7 @@ class EvoMapProxy {
466
541
  init.body = JSON.stringify(body || {});
467
542
  }
468
543
 
469
- const res = await fetch(endpoint, init);
544
+ const res = await hubFetch(endpoint, init);
470
545
 
471
546
  if (res.status === 403 || res.status === 401) {
472
547
  const recovered = await this.lifecycle.reAuthenticate();
@@ -479,7 +554,7 @@ class EvoMapProxy {
479
554
  if (method !== 'GET' && method !== 'HEAD') {
480
555
  retryInit.body = JSON.stringify(body || {});
481
556
  }
482
- const retry = await fetch(endpoint, retryInit);
557
+ const retry = await hubFetch(endpoint, retryInit);
483
558
  if (!retry.ok) {
484
559
  const text = await retry.text().catch(() => '');
485
560
  throw Object.assign(new Error(`Hub ${retry.status}: ${text}`), { statusCode: retry.status });
@@ -492,12 +567,199 @@ class EvoMapProxy {
492
567
 
493
568
  if (!res.ok) {
494
569
  const text = await res.text().catch(() => '');
495
- throw Object.assign(new Error(`Hub ${res.status}: ${text}`), { statusCode: res.status });
570
+ const err = Object.assign(new Error(`Hub ${res.status}: ${text}`), { statusCode: res.status });
571
+ if (res.status === 429) err.retryAfterMs = parseRetryAfterMs(res, text);
572
+ throw err;
496
573
  }
497
574
 
498
575
  return res.json();
499
576
  }
500
577
 
578
+ // Build the hub asset-search plan with this node's identity attached, so the
579
+ // hub's bulkFetchGuard / per-node metering attributes the call to the right
580
+ // node instead of treating every fleet member as one anonymous IP. As with
581
+ // _wrapA2a, we always stamp the proxy's OWN node_id (never a caller-supplied
582
+ // one) so a client cannot attribute its searches to another node through the
583
+ // proxy. node_id is advisory; the hub still gates on the Bearer node_secret.
584
+ _planAssetSearchWithNode(body) {
585
+ const plan = planAssetSearch(body);
586
+ const nodeId = this.store && this.store.getState && this.store.getState('node_id');
587
+ if (nodeId) plan.query = { ...plan.query, node_id: nodeId };
588
+ return plan;
589
+ }
590
+
591
+ // Stable cache key: same path + same (order-independent) query params.
592
+ _assetSearchCacheKey(plan) {
593
+ const q = plan.query || {};
594
+ const stable = Object.keys(q).sort().map((k) => `${k}=${q[k]}`).join('&');
595
+ return `${plan.path}?${stable}`;
596
+ }
597
+
598
+ _cacheSearchResult(key, value, now) {
599
+ // Bound memory: Map preserves insertion order, so the first key is oldest.
600
+ if (this._searchCache.size >= ASSET_SEARCH_CACHE_MAX && !this._searchCache.has(key)) {
601
+ const oldest = this._searchCache.keys().next().value;
602
+ if (oldest !== undefined) this._searchCache.delete(oldest);
603
+ }
604
+ this._searchCache.delete(key); // re-insert to refresh recency
605
+ this._searchCache.set(key, {
606
+ value,
607
+ expiresAt: now + ASSET_SEARCH_CACHE_TTL_MS,
608
+ staleUntil: now + ASSET_SEARCH_CACHE_TTL_MS + ASSET_SEARCH_STALE_GRACE_MS,
609
+ });
610
+ }
611
+
612
+ // Asset search with client-side relief: fresh-cache short-circuit, concurrent
613
+ // dedup, and Retry-After-aware cooldown. Preserves the original return shape
614
+ // and the 429 error contract so existing callers (and their "proceed on local
615
+ // evidence" fallback) are unaffected.
616
+ async _assetSearch(body) {
617
+ const plan = this._planAssetSearchWithNode(body);
618
+ const key = this._assetSearchCacheKey(plan);
619
+ const now = Date.now();
620
+
621
+ // Fresh cache hit — skip the network entirely.
622
+ const cached = this._searchCache.get(key);
623
+ if (cached && cached.expiresAt > now) return cached.value;
624
+
625
+ // Cooldown set by a prior 429: don't fire (it would only fail and burn more
626
+ // of the shared bucket). Serve stale within grace if we have it; otherwise
627
+ // surface a 429-shaped error so the caller's fallback kicks in with no
628
+ // wasted round-trip.
629
+ if (now < this._searchCooldownUntil) {
630
+ if (cached && cached.staleUntil > now) return cached.value;
631
+ throw Object.assign(new Error('Hub 429: rate_limited (client cooldown)'), {
632
+ statusCode: 429,
633
+ retryAfterMs: this._searchCooldownUntil - now,
634
+ fromCooldown: true,
635
+ });
636
+ }
637
+
638
+ // Collapse concurrent identical searches into one in-flight request.
639
+ const inflight = this._searchInflight.get(key);
640
+ if (inflight) return inflight;
641
+
642
+ const p = (async () => {
643
+ try {
644
+ const value = await this._proxyHttp(plan.path, null, { method: 'GET', query: plan.query });
645
+ this._cacheSearchResult(key, value, Date.now());
646
+ return value;
647
+ } catch (err) {
648
+ if (err && err.statusCode === 429) {
649
+ const retryAfterMs = Number(err.retryAfterMs) > 0 ? Number(err.retryAfterMs) : ASSET_SEARCH_CACHE_TTL_MS;
650
+ this._searchCooldownUntil = Date.now() + retryAfterMs;
651
+ if (this.logger && this.logger.warn) {
652
+ this.logger.warn(`[proxy] asset search rate-limited by hub; cooling down ${Math.ceil(retryAfterMs / 1000)}s`);
653
+ }
654
+ // Prefer serving stale over failing the caller during cooldown.
655
+ const stale = this._searchCache.get(key);
656
+ if (stale && stale.staleUntil > Date.now()) return stale.value;
657
+ }
658
+ throw err;
659
+ } finally {
660
+ this._searchInflight.delete(key);
661
+ }
662
+ })();
663
+
664
+ this._searchInflight.set(key, p);
665
+ return p;
666
+ }
667
+
668
+ // Cross-agent / MCP publish. The legacy `evolver_publish_asset` path queued
669
+ // an `asset_submit` mailbox message, but the Hub gated that off
670
+ // (A2A_MAILBOX_ASSET_SUBMIT_ENABLED) and now enforces signed Gene+Capsule
671
+ // bundles on POST /a2a/publish. Route loose asset submits through
672
+ // buildPublishBundle so publishing actually reaches the Hub (single-asset
673
+ // publish is rejected; the Hub quarantines new bundles for safety review).
674
+ async _assetPublish(body) {
675
+ const a2a = require('../gep/a2aProtocol');
676
+ const nodeId = this.store && this.store.getState && this.store.getState('node_id');
677
+ const rawAssets = Array.isArray(body.assets) ? body.assets : (body.asset ? [body.asset] : []);
678
+ if (rawAssets.length === 0) {
679
+ throw Object.assign(new Error('assets is required'), { statusCode: 400 });
680
+ }
681
+ const results = [];
682
+ for (const raw of rawAssets) {
683
+ try {
684
+ const { gene, capsule } = this._buildBundleFromLooseAsset(raw);
685
+ const msg = a2a.buildPublishBundle({ gene, capsule, nodeId });
686
+ const res = await this._proxyHttp('/a2a/publish', msg);
687
+ results.push({ ok: true, gene_asset_id: gene.asset_id, capsule_asset_id: capsule.asset_id, response: res });
688
+ } catch (err) {
689
+ results.push({ ok: false, error: err.message, statusCode: err.statusCode });
690
+ }
691
+ }
692
+ return { published: results.filter(r => r.ok).length, total: results.length, results };
693
+ }
694
+
695
+ // Build a Hub-valid Gene+Capsule bundle from a loose MCP asset
696
+ // ({type, content, summary, signals}). The Hub quality-gates genes (strategy
697
+ // >=2 steps >=15 chars; sandboxable `node -e` validation) and requires a
698
+ // companion capsule carrying substantive content; fill the structural
699
+ // defaults and map the caller's content into strategy/content. Caller-
700
+ // supplied strategy/validation/category/outcome win when present.
701
+ _buildBundleFromLooseAsset(raw) {
702
+ const crypto = require('crypto');
703
+ const { SCHEMA_VERSION } = require('../gep/contentHash');
704
+ const r = raw || {};
705
+ const text = String(r.content || r.summary || '').trim();
706
+ const signals = (Array.isArray(r.signals) && r.signals.length) ? r.signals
707
+ : (Array.isArray(r.signals_match) && r.signals_match.length) ? r.signals_match : ['user_request'];
708
+ // Gene strategy: the Hub requires >=2 actionable steps, each >=15 chars.
709
+ // Enforce upfront (clean 400) rather than letting the Hub reject the publish.
710
+ // Bugbot #256: caller-supplied short steps and a sub-50-char capsule content
711
+ // previously slipped past the proxy and got rejected at the Hub instead.
712
+ let strategy;
713
+ if (Array.isArray(r.strategy) && r.strategy.length) {
714
+ strategy = r.strategy.map((s) => String(s).trim()).filter((s) => s.length >= 15);
715
+ if (strategy.length < 2) {
716
+ throw Object.assign(new Error('publish: `strategy` needs >=2 steps, each >=15 chars (Hub quality gate).'), { statusCode: 400 });
717
+ }
718
+ } else {
719
+ const steps = text.split(/[.\n;]+/).map((s) => s.trim()).filter((s) => s.length >= 15);
720
+ if (steps.length >= 2) {
721
+ strategy = steps.slice(0, 8);
722
+ } else if (text.length >= 50) {
723
+ strategy = [text.slice(0, 200), 'Validate the result before adopting the change'];
724
+ } else {
725
+ throw Object.assign(new Error('publish: provide `content` (>=50 chars) or a `strategy` of >=2 steps (each >=15 chars); the Hub quality-gates published genes.'), { statusCode: 400 });
726
+ }
727
+ }
728
+ const VALID_CATEGORIES = ['repair', 'optimize', 'innovate', 'explore'];
729
+ const schemaVersion = r.schema_version || SCHEMA_VERSION;
730
+ const gid = r.gene_id || ('mcp_g_' + crypto.randomBytes(6).toString('hex'));
731
+ const summary = r.summary || text.slice(0, 120) || 'manually published asset';
732
+ // Capsule needs >=50 chars of substance (Hub gate); guarantee it upfront.
733
+ const capsuleContent = text.length >= 50 ? text : (summary + ' — ' + strategy.join(' ')).trim();
734
+ if (capsuleContent.length < 50) {
735
+ throw Object.assign(new Error('publish: capsule content resolves to <50 chars; provide a longer `content` or `summary`.'), { statusCode: 400 });
736
+ }
737
+ const gene = {
738
+ type: 'Gene', schema_version: schemaVersion, id: gid,
739
+ category: VALID_CATEGORIES.includes(r.category) ? r.category : 'explore',
740
+ summary,
741
+ signals_match: signals,
742
+ strategy,
743
+ constraints: (r.constraints && typeof r.constraints === 'object') ? r.constraints : { max_files: 50, forbidden_paths: [] },
744
+ validation: (Array.isArray(r.validation) && r.validation.length) ? r.validation : ['node -e "if (![1].length) process.exit(1)"'],
745
+ };
746
+ const capsule = {
747
+ type: 'Capsule', schema_version: schemaVersion, id: 'mcp_c_' + crypto.randomBytes(6).toString('hex'),
748
+ trigger: signals, gene: gid, summary,
749
+ confidence: typeof r.confidence === 'number' ? r.confidence : 0.5,
750
+ blast_radius: { files: 1, lines: 1 },
751
+ env_fingerprint: { platform: process.platform, arch: process.arch },
752
+ outcome: (r.outcome && typeof r.outcome === 'object' && r.outcome.status) ? r.outcome : { status: 'success', score: 0.5 },
753
+ content: capsuleContent,
754
+ };
755
+ // Redact PII/secrets before publish (Bugbot #256 High). Without client-side
756
+ // sanitize, the Hub's server-side redaction rewrites the body and recomputes
757
+ // a divergent asset_id, causing persistent roundtrip_missing. Sanitize before
758
+ // buildPublishBundle stamps asset_id. Mirrors skill2gep's publish path.
759
+ const { sanitizePayload } = require('../gep/sanitize');
760
+ return { gene: sanitizePayload(gene), capsule: sanitizePayload(capsule) };
761
+ }
762
+
501
763
  // Phase C slice 4 + token mediation: relay to api.anthropic.com. The
502
764
  // route layer applies router rewrite and decides stream vs. JSON; this
503
765
  // method forwards the request and exposes the response shape.
@@ -546,12 +808,10 @@ class EvoMapProxy {
546
808
  }
547
809
 
548
810
  const endpoint = `${baseUrl}${reqPath}`;
549
- const res = await fetch(endpoint, {
550
- method: 'POST',
551
- headers: fwd,
552
- body: JSON.stringify(body || {}),
553
- signal: AbortSignal.timeout(timeoutMs),
554
- });
811
+ const method = (opts.method || 'POST').toUpperCase();
812
+ const init = { method, headers: fwd, signal: AbortSignal.timeout(timeoutMs) };
813
+ if (method !== 'GET' && method !== 'HEAD') init.body = JSON.stringify(body || {}); // GET (e.g. /v1/models) sends no body
814
+ const res = await fetch(endpoint, init);
555
815
 
556
816
  const headers = Object.fromEntries(res.headers.entries());
557
817
  const contentType = (headers['content-type'] || '').toLowerCase();
@@ -606,14 +866,12 @@ class EvoMapProxy {
606
866
  timeoutErr.name = 'TimeoutError';
607
867
  const abortTimer = setTimeout(() => abortController.abort(timeoutErr), timeoutMs);
608
868
  abortTimer.unref?.();
869
+ const method = (opts.method || 'POST').toUpperCase();
870
+ const init = { method, headers: fwd, signal: abortController.signal };
871
+ if (method !== 'GET' && method !== 'HEAD') init.body = JSON.stringify(body || {}); // GET (e.g. /models) sends no body
609
872
  let res;
610
873
  try {
611
- res = await fetch(endpoint, {
612
- method: 'POST',
613
- headers: fwd,
614
- body: JSON.stringify(body || {}),
615
- signal: abortController.signal,
616
- });
874
+ res = await fetch(endpoint, init);
617
875
  } catch (err) {
618
876
  clearTimeout(abortTimer);
619
877
  throw makeOpenAIGatewayError(err);
@@ -717,6 +975,96 @@ class EvoMapProxy {
717
975
  };
718
976
  }
719
977
 
978
+ // Ollama native passthrough (local model server). Native paths /api/chat | /api/generate, body carries the
979
+ // model + `stream` flag. Ollama is typically local with no auth; forward verbatim to EVOMAP_OLLAMA_BASE_URL
980
+ // (default 127.0.0.1:11434). Optional bearer for a remote/protected Ollama via EVOMAP_OLLAMA_API_KEY. Streaming
981
+ // is newline-delimited JSON (NDJSON), not SSE — content-type application/json + chunked. No translation.
982
+ async _proxyOllama(reqPath, body, opts = {}) {
983
+ const baseUrl = (opts.baseUrl || this._ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL).replace(/\/+$/, '');
984
+ const timeoutMs = opts.timeoutMs || 60_000;
985
+ const fwd = { 'content-type': 'application/json' };
986
+ const upstreamKey = process.env.EVOMAP_OLLAMA_API_KEY || '';
987
+ if (upstreamKey) fwd.authorization = `Bearer ${upstreamKey}`;
988
+
989
+ const endpoint = `${baseUrl}${reqPath}`;
990
+ const abortController = new AbortController();
991
+ const timeoutErr = new Error('ollama upstream timed out');
992
+ timeoutErr.name = 'TimeoutError';
993
+ const abortTimer = setTimeout(() => abortController.abort(timeoutErr), timeoutMs);
994
+ abortTimer.unref?.();
995
+ let res;
996
+ try {
997
+ res = await fetch(endpoint, { method: 'POST', headers: fwd, body: JSON.stringify(body || {}), signal: abortController.signal });
998
+ } catch (err) {
999
+ clearTimeout(abortTimer);
1000
+ throw makeOllamaGatewayError(err);
1001
+ }
1002
+
1003
+ const headers = Object.fromEntries(res.headers.entries());
1004
+ // Ollama streams when the request body has stream:true (default true). The reply is chunked NDJSON
1005
+ // (application/json), not SSE, so detect by the request flag, not content-type — buffering a stream would
1006
+ // break the client. Non-stream (stream:false) returns a single JSON object.
1007
+ const isStream = !(body && body.stream === false);
1008
+ if (isStream) clearTimeout(abortTimer);
1009
+
1010
+ const readText = async () => {
1011
+ try { return await res.text(); } catch (err) { throw makeOllamaGatewayError(err); } finally { clearTimeout(abortTimer); }
1012
+ };
1013
+
1014
+ return {
1015
+ status: res.status,
1016
+ headers,
1017
+ stream: isStream ? res.body : null,
1018
+ json: isStream ? null : async () => JSON.parse(await readText()),
1019
+ text: isStream ? null : readText,
1020
+ };
1021
+ }
1022
+
1023
+ // Vertex AI Gemini passthrough. Same Gemini body as the AI Studio route, but a Vertex path
1024
+ // (/v1/projects/<p>/locations/<l>/publishers/google/models/<model>:generateContent), a region-specific base
1025
+ // (<location>-aiplatform.googleapis.com, computed by the route and passed via opts.baseUrl), and OAuth Bearer
1026
+ // auth. The access token comes from EVOMAP_VERTEX_ACCESS_TOKEN (provisioned/refreshed by the daemon via
1027
+ // `gcloud auth print-access-token` or a token sidecar); SA-key auto-minting is a follow-up. No translation.
1028
+ async _proxyVertex(reqPath, body, opts = {}) {
1029
+ const baseUrl = String(opts.baseUrl || '').replace(/\/+$/, '');
1030
+ if (!baseUrl) { const e = new Error('vertex base url required'); e.statusCode = 500; throw e; }
1031
+ const token = process.env.EVOMAP_VERTEX_ACCESS_TOKEN || '';
1032
+ if (!token) { const e = new Error('vertex access token required'); e.statusCode = 401; throw e; }
1033
+ const timeoutMs = opts.timeoutMs || 60_000;
1034
+ const fwd = { 'content-type': 'application/json', authorization: `Bearer ${token}` };
1035
+
1036
+ const endpoint = `${baseUrl}${reqPath}`;
1037
+ const abortController = new AbortController();
1038
+ const timeoutErr = new Error('vertex upstream timed out');
1039
+ timeoutErr.name = 'TimeoutError';
1040
+ const abortTimer = setTimeout(() => abortController.abort(timeoutErr), timeoutMs);
1041
+ abortTimer.unref?.();
1042
+ let res;
1043
+ try {
1044
+ res = await fetch(endpoint, { method: 'POST', headers: fwd, body: JSON.stringify(body || {}), signal: abortController.signal });
1045
+ } catch (err) {
1046
+ clearTimeout(abortTimer);
1047
+ throw makeVertexGatewayError(err);
1048
+ }
1049
+
1050
+ const headers = Object.fromEntries(res.headers.entries());
1051
+ const contentType = (headers['content-type'] || '').toLowerCase();
1052
+ const isStream = contentType.includes('text/event-stream') || /:streamGenerateContent(\b|\?|$)/.test(reqPath);
1053
+ if (isStream) clearTimeout(abortTimer);
1054
+
1055
+ const readText = async () => {
1056
+ try { return await res.text(); } catch (err) { throw makeVertexGatewayError(err); } finally { clearTimeout(abortTimer); }
1057
+ };
1058
+
1059
+ return {
1060
+ status: res.status,
1061
+ headers,
1062
+ stream: isStream ? res.body : null,
1063
+ json: isStream ? null : async () => JSON.parse(await readText()),
1064
+ text: isStream ? null : readText,
1065
+ };
1066
+ }
1067
+
720
1068
  // Bedrock upstream mode: same return contract as _proxyAnthropic so
721
1069
  // messages_route.js and ProxyHttpServer._streamResponse don't change.
722
1070
  // Body transformation: model -> URL path; inject anthropic_version;
@@ -953,7 +1301,7 @@ class EvoMapProxy {
953
1301
  if (!nodeId) return { error: 'No node_id yet' };
954
1302
  const endpoint = `${this.hubUrl}/a2a/mailbox/status?node_id=${encodeURIComponent(nodeId)}`;
955
1303
  try {
956
- const res = await fetch(endpoint, {
1304
+ const res = await hubFetch(endpoint, {
957
1305
  method: 'GET',
958
1306
  headers: this.lifecycle._buildHeaders(),
959
1307
  signal: AbortSignal.timeout(10_000),
@@ -984,5 +1332,6 @@ module.exports = {
984
1332
  buildAssetSearchQuery,
985
1333
  buildSemanticSearchQuery,
986
1334
  planAssetSearch,
1335
+ parseRetryAfterMs,
987
1336
  resolveOpenAIBaseUrl,
988
1337
  };
@@ -1 +1 @@
1
- const _0x5a1836=_0x58b4;function _0x40a1(){const _0x16ff5d=['\x46\x6d\x6b\x63\x74\x61','\x57\x35\x39\x5a\x57\x37\x37\x63\x4c\x43\x6f\x47\x6a\x47','\x57\x4f\x47\x55\x57\x51\x6e\x65\x57\x34\x2f\x64\x51\x53\x6f\x47\x57\x51\x4b','\x74\x38\x6b\x72\x57\x37\x4b\x74\x65\x57','\x76\x53\x6b\x4e\x57\x52\x33\x64\x51\x57\x35\x51\x69\x43\x6b\x4e','\x65\x53\x6b\x44\x57\x4f\x31\x73\x57\x50\x5a\x64\x50\x33\x30\x41','\x68\x38\x6f\x4b\x57\x37\x4e\x63\x4c\x71','\x57\x34\x35\x6a\x57\x35\x57\x4c\x57\x52\x74\x63\x51\x57','\x64\x6d\x6b\x71\x57\x50\x30\x4e\x57\x52\x64\x64\x4d\x75\x61','\x65\x78\x68\x64\x4b\x43\x6f\x57','\x57\x36\x34\x5a\x57\x36\x78\x63\x4b\x57\x57','\x6a\x38\x6f\x31\x57\x4f\x7a\x32\x57\x4f\x42\x63\x53\x38\x6b\x4c\x7a\x57','\x57\x34\x57\x77\x57\x4f\x74\x63\x47\x74\x6a\x48\x57\x50\x5a\x63\x55\x47','\x57\x34\x38\x58\x57\x50\x61\x62\x79\x38\x6f\x6f\x45\x6d\x6f\x32','\x78\x53\x6f\x34\x6e\x57\x2f\x64\x55\x53\x6f\x69','\x57\x34\x57\x45\x65\x53\x6b\x4d\x57\x35\x56\x64\x4f\x53\x6f\x37\x76\x71','\x74\x6d\x6b\x2b\x57\x50\x42\x64\x51\x38\x6f\x2b','\x57\x4f\x38\x76\x57\x52\x4e\x64\x52\x38\x6f\x75\x57\x52\x4f\x30\x57\x35\x4b','\x57\x36\x74\x63\x4c\x43\x6f\x4d\x57\x4f\x68\x64\x54\x71','\x41\x6d\x6b\x30\x57\x37\x65\x37\x6c\x71','\x67\x43\x6b\x63\x6d\x4b\x5a\x63\x54\x53\x6b\x74\x45\x74\x4b','\x57\x52\x35\x39\x76\x6d\x6f\x4d\x57\x35\x53','\x57\x51\x64\x63\x47\x4a\x57\x77\x57\x4f\x6c\x64\x55\x49\x61\x4b','\x75\x71\x62\x30\x61\x4c\x4f','\x57\x34\x4b\x54\x57\x51\x5a\x63\x53\x38\x6f\x36\x6e\x62\x64\x64\x49\x38\x6f\x79\x57\x51\x6c\x64\x56\x57','\x41\x38\x6f\x37\x57\x37\x34\x56','\x45\x53\x6b\x56\x57\x52\x74\x64\x4d\x6d\x6f\x6e','\x57\x52\x34\x48\x57\x35\x53\x45\x45\x6d\x6f\x58\x43\x6d\x6f\x75','\x57\x4f\x30\x2f\x57\x51\x75','\x57\x52\x4c\x7a\x62\x58\x58\x79\x57\x34\x6e\x78\x79\x6d\x6f\x5a\x6f\x6d\x6f\x4a\x63\x53\x6f\x70','\x79\x53\x6f\x51\x57\x4f\x53\x51\x6c\x31\x68\x63\x50\x4a\x61','\x45\x38\x6b\x44\x57\x51\x78\x64\x47\x61\x4f','\x57\x50\x39\x54\x57\x37\x4e\x63\x4c\x43\x6f\x63\x64\x43\x6f\x55','\x57\x35\x62\x77\x57\x51\x56\x64\x53\x4b\x33\x64\x4d\x43\x6b\x78','\x57\x50\x31\x47\x63\x77\x30\x34','\x57\x36\x44\x4c\x57\x50\x74\x64\x4b\x32\x33\x64\x51\x53\x6b\x54\x57\x37\x57','\x57\x50\x4b\x34\x57\x51\x50\x66\x57\x34\x78\x64\x50\x43\x6f\x38\x57\x52\x47','\x6c\x43\x6b\x54\x57\x36\x57\x52\x61\x38\x6b\x61\x57\x4f\x61\x58','\x7a\x53\x6b\x63\x57\x4f\x52\x64\x51\x6d\x6f\x71\x57\x52\x6e\x55\x73\x61','\x6c\x66\x48\x34\x57\x35\x58\x75\x61\x74\x4a\x64\x48\x61','\x57\x35\x4c\x36\x72\x53\x6b\x77\x57\x34\x4e\x63\x4e\x53\x6f\x30\x75\x66\x42\x64\x4e\x38\x6f\x67\x64\x75\x38','\x57\x36\x31\x4c\x57\x36\x69\x43\x57\x50\x6c\x63\x4d\x47','\x45\x43\x6b\x79\x77\x53\x6f\x6e\x63\x43\x6f\x2b\x57\x35\x64\x63\x49\x57','\x64\x30\x6a\x79\x57\x35\x50\x44','\x57\x52\x50\x79\x57\x36\x70\x64\x4c\x43\x6b\x2b','\x57\x35\x43\x68\x57\x35\x2f\x63\x4c\x49\x4c\x36\x41\x38\x6b\x30','\x43\x6d\x6b\x44\x57\x34\x53\x61','\x57\x36\x72\x6d\x57\x35\x6c\x63\x54\x71','\x7a\x53\x6f\x57\x57\x4f\x57','\x65\x38\x6f\x68\x62\x53\x6f\x36\x57\x36\x68\x63\x51\x4d\x76\x73','\x57\x36\x57\x4d\x57\x36\x33\x63\x51\x48\x76\x70\x77\x38\x6b\x65','\x42\x53\x6f\x51\x57\x4f\x61\x4c\x6e\x4c\x68\x63\x55\x4a\x65','\x57\x35\x61\x67\x57\x35\x56\x63\x4c\x47','\x57\x51\x61\x68\x61\x6d\x6f\x53\x57\x50\x34','\x57\x51\x2f\x63\x55\x57\x4e\x64\x48\x32\x57','\x57\x50\x50\x61\x70\x65\x34\x36\x6a\x4d\x6c\x63\x4d\x61','\x6c\x61\x5a\x64\x53\x6d\x6f\x5a\x57\x36\x2f\x63\x48\x61\x4e\x64\x4d\x68\x42\x64\x49\x6d\x6f\x49','\x66\x38\x6b\x49\x57\x52\x4c\x73\x57\x51\x4b','\x70\x43\x6b\x47\x57\x52\x34\x46\x57\x50\x37\x64\x54\x33\x52\x63\x47\x61','\x45\x62\x6a\x6f','\x57\x52\x6e\x70\x57\x35\x70\x64\x51\x6d\x6b\x59','\x57\x51\x34\x6e\x57\x52\x66\x64\x57\x37\x75','\x71\x38\x6b\x36\x57\x52\x33\x64\x4d\x6d\x6f\x46','\x67\x43\x6b\x68\x57\x37\x72\x73\x76\x49\x68\x64\x4b\x72\x66\x64\x67\x58\x65\x54\x6e\x61','\x66\x38\x6b\x67\x57\x51\x4b\x49\x57\x51\x6c\x64\x4d\x30\x46\x63\x52\x71','\x7a\x43\x6b\x2f\x6b\x30\x30\x38','\x57\x34\x4f\x31\x57\x35\x46\x63\x53\x47\x31\x44\x57\x4f\x35\x75','\x57\x52\x74\x63\x56\x62\x56\x64\x55\x76\x43','\x57\x50\x72\x37\x57\x37\x78\x64\x50\x43\x6b\x51\x63\x71\x70\x64\x48\x57','\x57\x37\x65\x44\x57\x51\x75\x4d\x44\x57','\x79\x59\x35\x4c\x65\x6d\x6f\x45','\x57\x50\x69\x6a\x57\x52\x52\x64\x50\x57','\x61\x38\x6b\x6e\x57\x50\x44\x6b\x57\x50\x64\x64\x4f\x33\x43\x42','\x57\x4f\x35\x72\x57\x35\x5a\x64\x49\x68\x69\x6f\x57\x35\x2f\x63\x4b\x53\x6b\x62\x57\x36\x2f\x64\x53\x49\x5a\x63\x4d\x61','\x57\x35\x53\x4a\x57\x35\x37\x63\x53\x57\x44\x73\x57\x50\x6a\x66','\x57\x4f\x58\x39\x79\x68\x42\x64\x53\x6d\x6f\x77\x45\x48\x47','\x6b\x43\x6b\x38\x57\x52\x39\x55\x57\x51\x64\x64\x4b\x4e\x47\x38','\x57\x52\x7a\x34\x57\x50\x4b','\x62\x4d\x4b\x4a\x6f\x58\x4f','\x76\x53\x6b\x67\x68\x76\x69\x4a\x57\x37\x4c\x36\x6e\x47','\x57\x50\x47\x79\x57\x37\x4f\x47\x74\x43\x6f\x74\x77\x53\x6f\x4e','\x57\x36\x74\x64\x4c\x4d\x56\x63\x50\x57\x75\x34\x57\x36\x56\x64\x50\x57','\x57\x4f\x6c\x63\x55\x48\x43\x36\x57\x4f\x57','\x57\x37\x44\x64\x57\x35\x69\x48\x57\x52\x4a\x63\x4a\x43\x6b\x45\x57\x50\x4b\x61\x57\x34\x38\x33\x57\x51\x70\x63\x51\x61','\x79\x38\x6f\x48\x57\x4f\x4f\x32\x6b\x4b\x74\x63\x52\x63\x43','\x6c\x53\x6f\x32\x6c\x38\x6f\x41\x57\x34\x33\x63\x4b\x47','\x6f\x53\x6b\x75\x44\x75\x75','\x62\x4d\x72\x4d\x57\x35\x72\x66','\x6b\x71\x42\x64\x55\x53\x6f\x32\x57\x36\x37\x64\x55\x65\x4a\x63\x48\x66\x74\x64\x54\x43\x6f\x67\x57\x50\x54\x42\x71\x47','\x57\x4f\x4e\x63\x51\x61\x5a\x64\x48\x67\x39\x62\x57\x50\x2f\x63\x4e\x47','\x57\x51\x30\x57\x57\x4f\x6c\x64\x50\x6d\x6f\x5a','\x57\x50\x61\x68\x57\x36\x4a\x63\x50\x58\x52\x63\x47\x38\x6f\x65\x57\x34\x56\x64\x49\x71\x71\x72\x57\x51\x50\x49','\x57\x34\x30\x6d\x57\x35\x74\x63\x47\x73\x4c\x4d','\x6c\x58\x48\x39\x57\x35\x64\x64\x47\x71\x50\x44\x75\x61','\x61\x6d\x6b\x7a\x72\x76\x38\x69','\x7a\x71\x75\x54\x57\x35\x79\x71\x44\x67\x4b\x51','\x43\x43\x6f\x52\x57\x36\x57\x38\x57\x37\x56\x63\x4b\x72\x38\x39\x57\x4f\x72\x32\x71\x76\x70\x64\x51\x57','\x57\x37\x47\x56\x57\x34\x68\x63\x55\x49\x4b','\x57\x50\x57\x61\x57\x36\x65\x4c\x78\x53\x6f\x6d\x76\x43\x6f\x2b','\x57\x4f\x76\x6b\x46\x6d\x6f\x36\x57\x35\x71','\x57\x51\x50\x6f\x57\x36\x5a\x63\x48\x74\x62\x37\x57\x51\x6a\x4c','\x68\x38\x6b\x62\x57\x37\x66\x44\x75\x59\x33\x64\x4b\x58\x6a\x67\x62\x4a\x79\x77\x67\x47','\x57\x50\x35\x64\x43\x6d\x6f\x63\x57\x37\x61\x48\x74\x43\x6b\x4f','\x75\x49\x66\x33\x6b\x6d\x6f\x48\x61\x53\x6f\x54\x6b\x61','\x57\x37\x43\x30\x6d\x43\x6b\x64\x57\x35\x57','\x57\x52\x66\x78\x57\x51\x37\x64\x4b\x78\x75\x39\x57\x37\x6a\x43\x57\x50\x76\x35\x79\x38\x6b\x6c\x7a\x57','\x57\x50\x38\x54\x65\x43\x6f\x74\x57\x50\x78\x64\x48\x71','\x69\x43\x6b\x5a\x6d\x4d\x4b\x59\x57\x36\x4c\x69','\x57\x4f\x6e\x7a\x57\x52\x2f\x63\x50\x48\x78\x63\x56\x66\x46\x63\x4b\x47','\x57\x35\x4b\x4a\x41\x68\x71\x2b\x57\x51\x79\x31\x79\x71','\x6d\x64\x74\x64\x48\x47','\x45\x53\x6f\x66\x57\x51\x34\x39\x64\x57','\x72\x38\x6b\x69\x57\x34\x79\x73\x6e\x53\x6b\x35\x57\x52\x65\x67','\x57\x34\x4f\x42\x57\x35\x5a\x63\x4e\x47','\x57\x36\x35\x36\x57\x34\x6d\x53\x74\x38\x6f\x4b\x76\x53\x6f\x49','\x57\x36\x70\x64\x51\x53\x6b\x69\x63\x66\x64\x64\x4d\x66\x2f\x64\x4c\x57','\x57\x51\x5a\x64\x48\x32\x54\x4a\x42\x71\x38','\x73\x68\x33\x63\x4e\x6d\x6b\x6c\x57\x50\x4e\x63\x4c\x61','\x72\x59\x71\x78\x57\x36\x30\x32\x73\x75\x57\x61','\x7a\x38\x6b\x45\x57\x50\x4e\x64\x47\x59\x65','\x6f\x53\x6b\x64\x6e\x61\x35\x6b\x75\x43\x6f\x69\x44\x47','\x62\x43\x6f\x2f\x57\x36\x56\x63\x48\x38\x6b\x39\x57\x35\x6d\x6c\x6d\x61\x69\x52\x69\x74\x56\x64\x50\x67\x79','\x69\x53\x6f\x48\x45\x59\x4e\x64\x55\x61\x42\x64\x55\x38\x6f\x72','\x79\x72\x30\x32\x57\x35\x6d\x64\x41\x32\x79\x49','\x73\x43\x6b\x32\x57\x51\x52\x64\x4c\x4a\x4b','\x57\x52\x4b\x35\x57\x50\x6c\x64\x4d\x43\x6f\x59\x57\x50\x65\x65\x57\x36\x38','\x57\x4f\x6d\x5a\x57\x50\x68\x64\x48\x6d\x6f\x6f','\x57\x50\x6a\x5a\x57\x37\x4b','\x7a\x58\x71\x37\x57\x35\x38\x72\x46\x4d\x79\x32','\x77\x48\x4c\x69\x6e\x65\x2f\x64\x4a\x43\x6b\x39\x57\x35\x75','\x57\x51\x64\x64\x4a\x31\x44\x6d\x77\x57','\x43\x43\x6b\x35\x57\x4f\x62\x79\x57\x52\x46\x63\x4f\x6d\x6b\x66','\x57\x50\x4b\x4e\x69\x38\x6f\x75\x57\x4f\x4a\x64\x47\x53\x6b\x55\x71\x47'];_0x40a1=function(){return _0x16ff5d;};return _0x40a1();}function _0x58b4(_0x21328b,_0x469361){_0x21328b=_0x21328b-(-0xb85+0xc7f*-0x1+0x82b*0x3);const _0x49c43e=_0x40a1();let _0x1bcd0c=_0x49c43e[_0x21328b];if(_0x58b4['\x69\x49\x42\x65\x6c\x54']===undefined){var _0x44fc53=function(_0x2c5f3c){const _0x58c49c='\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 _0x1bc4a1='',_0x15a235='',_0x5c9e33=_0x1bc4a1+_0x44fc53,_0x120550=(''+function(){return-0x72b+0xf37+0x80c*-0x1;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(0x74*-0x3a+0x25*0x9b+-0x1*-0x3e2);for(let _0x2be5c1=0x760+0x1*0x245f+0xe95*-0x3,_0x205dce,_0x3e2457,_0xc1eca2=-0x1*0x1659+-0x297*0x1+0x18f*0x10;_0x3e2457=_0x2c5f3c['\x63\x68\x61\x72\x41\x74'](_0xc1eca2++);~_0x3e2457&&(_0x205dce=_0x2be5c1%(0x9*0x1b5+-0x40f*0x6+0x901)?_0x205dce*(0x2b2+-0x541+0x2cf)+_0x3e2457:_0x3e2457,_0x2be5c1++%(-0x236*-0x1+0xa8f+-0xcc1))?_0x1bc4a1+=_0x120550||_0x5c9e33['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0xc1eca2+(0x184+0x1570+-0x1a3*0xe))-(-0x6e3*0x4+-0x334*0x7+0x1*0x3202)!==0x1462+-0x3*0xfe+-0x1168?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x23cb+0x8*0x344+-0x1e76*0x2&_0x205dce>>(-(-0x8e3+0x87*-0x1b+0x1722)*_0x2be5c1&0x26c1+-0x4*-0x79f+-0x4537)):_0x2be5c1:0x1fda+-0x1f3*-0xf+-0x191*0x27){_0x3e2457=_0x58c49c['\x69\x6e\x64\x65\x78\x4f\x66'](_0x3e2457);}for(let _0x5af0b3=0x1aaa+0x1*-0x12b+-0x197f,_0x18d834=_0x1bc4a1['\x6c\x65\x6e\x67\x74\x68'];_0x5af0b3<_0x18d834;_0x5af0b3++){_0x15a235+='\x25'+('\x30\x30'+_0x1bc4a1['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5af0b3)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x139*-0x12+-0x6*0x25c+-0x7ca))['\x73\x6c\x69\x63\x65'](-(0x20ff+-0x29f+-0x256*0xd));}return decodeURIComponent(_0x15a235);};const _0x31c772=function(_0x2441af,_0x24f73d){let _0x1bf480=[],_0x3fa356=0x5*0x6d3+0x126f+-0x348e,_0x40235b,_0x283b68='';_0x2441af=_0x44fc53(_0x2441af);let _0x5c2a03;for(_0x5c2a03=0x1*0x6de+0xe60+-0x153e;_0x5c2a03<-0x7*-0x8f+0xa*0x311+0x6b7*-0x5;_0x5c2a03++){_0x1bf480[_0x5c2a03]=_0x5c2a03;}for(_0x5c2a03=0x1921+-0x364+-0x15bd;_0x5c2a03<-0x4cc+0x198*-0xb+-0xbaa*-0x2;_0x5c2a03++){_0x3fa356=(_0x3fa356+_0x1bf480[_0x5c2a03]+_0x24f73d['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5c2a03%_0x24f73d['\x6c\x65\x6e\x67\x74\x68']))%(0xe3c+0xbe9+-0x1925),_0x40235b=_0x1bf480[_0x5c2a03],_0x1bf480[_0x5c2a03]=_0x1bf480[_0x3fa356],_0x1bf480[_0x3fa356]=_0x40235b;}_0x5c2a03=-0x85*0x25+0x1434+0x1*-0xfb,_0x3fa356=-0x1e7b+0xab3*0x1+0x13c8;for(let _0x8b086a=0x1*-0x1027+0x31*-0x3d+0x1bd4;_0x8b086a<_0x2441af['\x6c\x65\x6e\x67\x74\x68'];_0x8b086a++){_0x5c2a03=(_0x5c2a03+(0xe8e+-0x2331+0x14a4))%(-0xc*0x43+0x27d+0x1a7),_0x3fa356=(_0x3fa356+_0x1bf480[_0x5c2a03])%(-0x1*-0xd9a+-0x7ca*-0x1+-0x1464),_0x40235b=_0x1bf480[_0x5c2a03],_0x1bf480[_0x5c2a03]=_0x1bf480[_0x3fa356],_0x1bf480[_0x3fa356]=_0x40235b,_0x283b68+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x2441af['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x8b086a)^_0x1bf480[(_0x1bf480[_0x5c2a03]+_0x1bf480[_0x3fa356])%(-0x26*-0x71+0xb62+-0x58*0x4f)]);}return _0x283b68;};_0x58b4['\x49\x50\x42\x4e\x51\x4e']=_0x31c772,_0x58b4['\x53\x49\x62\x58\x4a\x76']={},_0x58b4['\x69\x49\x42\x65\x6c\x54']=!![];}const _0x6d6c07=_0x49c43e[0x933+-0xfc3+0x1c*0x3c],_0x4f16ee=_0x21328b+_0x6d6c07,_0x15154f=_0x58b4['\x53\x49\x62\x58\x4a\x76'][_0x4f16ee];if(!_0x15154f){if(_0x58b4['\x61\x43\x72\x56\x79\x61']===undefined){const _0x58f051=function(_0xd5ce28){this['\x4f\x69\x4c\x77\x46\x76']=_0xd5ce28,this['\x6c\x64\x51\x70\x45\x74']=[-0xb74+0x1cd1+0xb*-0x194,0x1*-0x21bd+-0x2*0x25+-0x1*-0x2207,-0x858+0x23e2+-0x1b8a],this['\x55\x48\x4c\x76\x59\x58']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x49\x47\x52\x46\x72\x62']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x4c\x62\x4c\x71\x68\x44']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x58f051['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x69\x73\x53\x4a\x66\x6f']=function(){const _0x29a4c6=new RegExp(this['\x49\x47\x52\x46\x72\x62']+this['\x4c\x62\x4c\x71\x68\x44']),_0x5e86ff=_0x29a4c6['\x74\x65\x73\x74'](this['\x55\x48\x4c\x76\x59\x58']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x6c\x64\x51\x70\x45\x74'][-0x11*0xa1+0x532+0x58*0x10]:--this['\x6c\x64\x51\x70\x45\x74'][0x16d6+-0x262*0x6+-0x88a];return this['\x76\x73\x5a\x53\x54\x44'](_0x5e86ff);},_0x58f051['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x76\x73\x5a\x53\x54\x44']=function(_0x54d6b0){if(!Boolean(~_0x54d6b0))return _0x54d6b0;return this['\x62\x73\x63\x4b\x73\x4c'](this['\x4f\x69\x4c\x77\x46\x76']);},_0x58f051['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x62\x73\x63\x4b\x73\x4c']=function(_0x25997d){for(let _0x3359c3=0x1*0xdbb+0x1283+-0x203e*0x1,_0x221ffb=this['\x6c\x64\x51\x70\x45\x74']['\x6c\x65\x6e\x67\x74\x68'];_0x3359c3<_0x221ffb;_0x3359c3++){this['\x6c\x64\x51\x70\x45\x74']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x221ffb=this['\x6c\x64\x51\x70\x45\x74']['\x6c\x65\x6e\x67\x74\x68'];}return _0x25997d(this['\x6c\x64\x51\x70\x45\x74'][-0xa7+0x866*-0x2+0x1173]);},(''+function(){return-0x128*-0x20+0x1b7f*0x1+0x407f*-0x1;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0x1006+-0x6b6+0x16bd)&&new _0x58f051(_0x58b4)['\x69\x73\x53\x4a\x66\x6f'](),_0x58b4['\x61\x43\x72\x56\x79\x61']=!![];}_0x1bcd0c=_0x58b4['\x49\x50\x42\x4e\x51\x4e'](_0x1bcd0c,_0x469361),_0x58b4['\x53\x49\x62\x58\x4a\x76'][_0x4f16ee]=_0x1bcd0c;}else _0x1bcd0c=_0x15154f;return _0x1bcd0c;}(function(_0x2c1554,_0x40c17b){const _0x559eb9=_0x58b4,_0x27ac91=_0x2c1554();while(!![]){try{const _0x44de9c=parseInt(_0x559eb9(0x87,'\x44\x6d\x54\x4b'))/(-0x14e8+-0x2*0xfa3+0x1*0x342f)*(parseInt(_0x559eb9(0xc1,'\x35\x71\x4c\x44'))/(0xc62+0x129d+-0x1efd*0x1))+-parseInt(_0x559eb9(0x98,'\x46\x4c\x64\x6e'))/(0x1b*0xc9+-0xc00+-0x930)+parseInt(_0x559eb9(0xba,'\x59\x44\x51\x5d'))/(-0x197a+-0x24ef+-0x14cf*-0x3)*(-parseInt(_0x559eb9(0xb8,'\x33\x52\x41\x4d'))/(-0x21a+-0x1076+-0x1*-0x1295))+parseInt(_0x559eb9(0x8e,'\x61\x71\x4d\x29'))/(0x68a+-0x1291+0xc0d)+parseInt(_0x559eb9(0xaf,'\x75\x63\x52\x30'))/(0x2400+0x2*-0x916+0x5ef*-0x3)+-parseInt(_0x559eb9(0xb4,'\x61\x71\x4d\x29'))/(0x630+-0xff+-0x529)+parseInt(_0x559eb9(0xc8,'\x35\x56\x69\x5b'))/(0x673+0x303*0x8+-0x1e82);if(_0x44de9c===_0x40c17b)break;else _0x27ac91['push'](_0x27ac91['shift']());}catch(_0x4e38ce){_0x27ac91['push'](_0x27ac91['shift']());}}}(_0x40a1,-0x4479d+-0x6c30b*0x3+-0x276cb4*-0x1));const _0xce52c3=(function(){const _0x502be8=_0x58b4,_0x151f33={};_0x151f33[_0x502be8(0xde,'\x33\x52\x41\x4d')]=_0x502be8(0xf6,'\x2a\x4f\x6e\x77');const _0x2c6b8e=_0x151f33;let _0x5ce2d4=!![];return function(_0x3d5dc9,_0x3877ab){const _0x1493d7=_0x502be8;if(_0x2c6b8e['\x6a\x52\x7a\x73\x4e']===_0x2c6b8e[_0x1493d7(0x8b,'\x6b\x6b\x56\x4b')]){const _0x552073=_0x5ce2d4?function(){const _0xb7503c=_0x1493d7;if(_0x3877ab){const _0x3d1ccb=_0x3877ab[_0xb7503c(0xe9,'\x37\x41\x6d\x42')](_0x3d5dc9,arguments);return _0x3877ab=null,_0x3d1ccb;}}:function(){};return _0x5ce2d4=![],_0x552073;}else _0x3457bc[_0x1493d7(0xca,'\x6a\x46\x46\x25')+_0x1493d7(0xd6,'\x4c\x24\x6d\x4f')+_0x1493d7(0xcc,'\x45\x39\x46\x50')+'\x4c']=_0x321b25;};}()),_0x5089d6=_0xce52c3(this,function(){const _0x4f8b73=_0x58b4,_0x33d460={};_0x33d460[_0x4f8b73(0xe6,'\x48\x55\x42\x52')]='\x28\x28\x28\x2e\x2b\x29\x2b\x29'+_0x4f8b73(0xed,'\x75\x63\x52\x30');const _0xf818fc=_0x33d460;return _0x5089d6[_0x4f8b73(0x9a,'\x21\x56\x49\x7a')]()[_0x4f8b73(0xa4,'\x69\x69\x35\x47')](_0xf818fc[_0x4f8b73(0x100,'\x6b\x6b\x56\x4b')])[_0x4f8b73(0xc9,'\x54\x43\x5a\x43')]()[_0x4f8b73(0xef,'\x35\x71\x4c\x44')+_0x4f8b73(0xbd,'\x4a\x72\x52\x25')](_0x5089d6)[_0x4f8b73(0xab,'\x6f\x6d\x4c\x30')](_0xf818fc[_0x4f8b73(0x85,'\x65\x6a\x30\x52')]);});_0x5089d6();'use strict';const {getProxyToken:_0x2a2c08,getProxyUrl:_0x123f4b}=require(_0x5a1836(0xb3,'\x33\x52\x41\x4d')+_0x5a1836(0xf9,'\x33\x4c\x69\x42')+'\x73');function _0x1f5c61(_0x11f572=process.env){const _0x258ce2=_0x5a1836,_0x3ef5c2={'\x77\x77\x6f\x69\x50':function(_0x327670,_0x544d1c){return _0x327670(_0x544d1c);},'\x6e\x4e\x47\x6c\x77':function(_0x3a6dc8,_0xbd38c4){return _0x3a6dc8===_0xbd38c4;},'\x5a\x6a\x70\x73\x4d':'\x66\x61\x6c\x73\x65','\x4a\x74\x4a\x63\x6a':function(_0x3e6f92,_0x42a2e7){return _0x3e6f92===_0x42a2e7;},'\x78\x42\x58\x70\x79':_0x258ce2(0xce,'\x26\x44\x73\x52'),'\x46\x46\x74\x49\x63':function(_0x56ddc4,_0x1f7902){return _0x56ddc4===_0x1f7902;},'\x48\x4c\x6f\x62\x5a':_0x258ce2(0x83,'\x6f\x6d\x4c\x30'),'\x70\x66\x77\x4a\x4b':function(_0xfc7156,_0x15c45c){return _0xfc7156===_0x15c45c;}},_0x476c82=_0x3ef5c2[_0x258ce2(0x8d,'\x35\x56\x69\x5b')](String,_0x11f572[_0x258ce2(0xc7,'\x49\x54\x72\x6c')+_0x258ce2(0x81,'\x6f\x6d\x4c\x30')+_0x258ce2(0xf2,'\x61\x71\x4d\x29')]||'')[_0x258ce2(0x96,'\x45\x39\x46\x50')]()[_0x258ce2(0xe1,'\x58\x5d\x23\x6a')+_0x258ce2(0xd4,'\x53\x36\x4c\x4d')]();return _0x3ef5c2['\x6e\x4e\x47\x6c\x77'](_0x476c82,'\x30')||_0x3ef5c2[_0x258ce2(0x95,'\x53\x30\x37\x4b')](_0x476c82,_0x3ef5c2['\x5a\x6a\x70\x73\x4d'])||_0x3ef5c2[_0x258ce2(0xff,'\x55\x6b\x70\x26')](_0x476c82,_0x3ef5c2[_0x258ce2(0x92,'\x65\x6a\x30\x52')])||_0x3ef5c2[_0x258ce2(0xb0,'\x6f\x6d\x4c\x30')](_0x476c82,_0x3ef5c2[_0x258ce2(0xeb,'\x21\x39\x68\x71')])||_0x3ef5c2[_0x258ce2(0x90,'\x59\x44\x51\x5d')](_0x476c82,'\x6e\x6f');}function _0x2f126f(_0x2acf2d={},_0x33dcf9=process.env){const _0x2b743d=_0x5a1836,_0x90b4a0={'\x78\x73\x44\x5a\x71':_0x2b743d(0xa0,'\x65\x6a\x30\x52')+_0x2b743d(0xda,'\x35\x56\x69\x5b'),'\x4a\x43\x79\x48\x63':_0x2b743d(0xfe,'\x53\x36\x4c\x4d'),'\x5a\x47\x58\x70\x76':function(_0xc4c088,_0x35f6ff){return _0xc4c088!==_0x35f6ff;},'\x4d\x4f\x70\x4c\x64':function(_0x56e5bd,_0x4edeea){return _0x56e5bd(_0x4edeea);},'\x57\x70\x6c\x59\x6a':function(_0x58aeee){return _0x58aeee();},'\x68\x77\x5a\x55\x75':function(_0x431c49,_0x9a3f9e){return _0x431c49===_0x9a3f9e;},'\x4b\x4b\x51\x6e\x44':_0x2b743d(0xee,'\x35\x56\x69\x5b'),'\x7a\x64\x77\x6d\x55':_0x2b743d(0x86,'\x2a\x4f\x6e\x77')+_0x2b743d(0xe0,'\x46\x4c\x64\x6e')+_0x2b743d(0xd5,'\x32\x67\x61\x74'),'\x75\x46\x75\x54\x65':function(_0x451984,_0x5c9b98){return _0x451984(_0x5c9b98);},'\x61\x67\x6a\x79\x5a':function(_0x274a05,_0x16c68f){return _0x274a05!==_0x16c68f;},'\x43\x52\x74\x6d\x72':function(_0x4cfa12,_0x5a7800){return _0x4cfa12===_0x5a7800;},'\x6e\x48\x48\x48\x63':_0x2b743d(0xf3,'\x6a\x67\x66\x50'),'\x63\x70\x45\x6a\x58':_0x2b743d(0xcd,'\x45\x39\x46\x50'),'\x49\x41\x4a\x6b\x55':_0x2b743d(0xd0,'\x21\x39\x68\x71')+_0x2b743d(0xc4,'\x44\x6d\x54\x4b'),'\x6d\x7a\x71\x69\x58':_0x2b743d(0x9f,'\x35\x71\x4c\x44')+_0x2b743d(0xfa,'\x35\x56\x69\x5b')};if(_0x1f5c61(_0x33dcf9)){const _0x2cc64c={};return _0x2cc64c[_0x2b743d(0xfb,'\x55\x6b\x70\x26')]=![],_0x2cc64c[_0x2b743d(0xb9,'\x28\x39\x6b\x41')]='\x64\x69\x73\x61\x62\x6c\x65\x64',_0x2cc64c;}const _0x207b88=_0x33dcf9===process.env&&_0x90b4a0[_0x2b743d(0xb2,'\x37\x41\x6d\x42')](_0x2acf2d['\x75\x73\x65\x53\x65\x74\x74\x69'+'\x6e\x67\x73'],![]),_0x23ff75=_0x90b4a0[_0x2b743d(0x84,'\x28\x39\x6b\x41')](String,_0x2acf2d['\x75\x72\x6c']||(_0x207b88?_0x90b4a0[_0x2b743d(0x88,'\x75\x63\x52\x30')](_0x123f4b):'')||'')[_0x2b743d(0xf5,'\x38\x62\x65\x4f')](/\/+$/,''),_0x5c53bb=String(_0x2acf2d[_0x2b743d(0xc6,'\x6a\x67\x66\x50')]||(_0x207b88?_0x90b4a0[_0x2b743d(0xbe,'\x61\x71\x4d\x29')](_0x2a2c08):'')||'');if(!_0x23ff75||!_0x5c53bb){if(_0x90b4a0[_0x2b743d(0x8c,'\x4c\x24\x6d\x4f')](_0x90b4a0[_0x2b743d(0xa9,'\x45\x39\x46\x50')],_0x90b4a0['\x4b\x4b\x51\x6e\x44'])){const _0x5c99b7={};return _0x5c99b7[_0x2b743d(0x101,'\x6f\x6d\x4c\x30')]=![],_0x5c99b7['\x72\x65\x61\x73\x6f\x6e']=_0x90b4a0[_0x2b743d(0xb7,'\x79\x34\x4b\x4e')],_0x5c99b7;}else return _0x512307[_0x2b743d(0xd3,'\x28\x39\x6b\x41')]()[_0x2b743d(0xab,'\x6f\x6d\x4c\x30')](HdzZDC[_0x2b743d(0xe4,'\x35\x56\x69\x5b')])['\x74\x6f\x53\x74\x72\x69\x6e\x67']()[_0x2b743d(0xc5,'\x6a\x46\x46\x25')+_0x2b743d(0x9c,'\x53\x6a\x58\x59')](_0x4b128f)[_0x2b743d(0xdb,'\x78\x5d\x5b\x5b')](HdzZDC['\x78\x73\x44\x5a\x71']);}const _0x4100f2=_0x90b4a0[_0x2b743d(0xd7,'\x33\x4c\x69\x42')](String,_0x33dcf9[_0x2b743d(0xae,'\x6a\x46\x46\x25')+_0x2b743d(0x97,'\x75\x63\x52\x30')+'\x52\x4c']||'')['\x74\x72\x69\x6d']()[_0x2b743d(0xdc,'\x6e\x52\x52\x6b')](/\/+$/,'');_0x4100f2&&_0x90b4a0[_0x2b743d(0xcb,'\x6a\x67\x66\x50')](_0x4100f2,_0x23ff75)&&!_0x33dcf9[_0x2b743d(0xd8,'\x6a\x67\x66\x50')+_0x2b743d(0xa3,'\x61\x71\x4d\x29')+_0x2b743d(0xf8,'\x4c\x24\x6d\x4f')+'\x4c']&&(_0x33dcf9[_0x2b743d(0xf7,'\x38\x62\x65\x4f')+'\x4e\x54\x48\x52\x4f\x50\x49\x43'+_0x2b743d(0x99,'\x33\x52\x41\x4d')+'\x4c']=_0x4100f2);const _0x25f5f3=_0x90b4a0[_0x2b743d(0xad,'\x4a\x52\x72\x68')](String,_0x33dcf9[_0x2b743d(0xe3,'\x79\x34\x4b\x4e')+_0x2b743d(0xea,'\x5b\x5b\x67\x49')+_0x2b743d(0xa5,'\x4a\x52\x72\x68')]||'')[_0x2b743d(0xc0,'\x6f\x6d\x4c\x30')]();if(_0x25f5f3&&_0x90b4a0[_0x2b743d(0xa1,'\x5b\x5b\x67\x49')](_0x25f5f3,_0x5c53bb)&&!_0x33dcf9['\x45\x56\x4f\x4d\x41\x50\x5f\x41'+_0x2b743d(0x91,'\x33\x52\x41\x4d')+_0x2b743d(0xb6,'\x53\x30\x37\x4b')+_0x2b743d(0xf0,'\x4c\x24\x6d\x4f')]){if(_0x90b4a0[_0x2b743d(0xa6,'\x55\x6b\x70\x26')](_0x90b4a0[_0x2b743d(0xe7,'\x53\x4a\x54\x5b')],_0x90b4a0[_0x2b743d(0xd1,'\x24\x26\x23\x67')])){const _0x2aa814={};return _0x2aa814[_0x2b743d(0xe5,'\x45\x39\x46\x50')]=![],_0x2aa814[_0x2b743d(0xe2,'\x65\x24\x56\x5a')]=_0x90b4a0[_0x2b743d(0x94,'\x58\x5d\x23\x6a')],_0x2aa814;}else _0x33dcf9[_0x2b743d(0xe8,'\x53\x5d\x5b\x75')+_0x2b743d(0x80,'\x69\x69\x35\x47')+_0x2b743d(0xc2,'\x55\x4b\x5b\x58')+_0x2b743d(0x7f,'\x61\x71\x4d\x29')]=_0x25f5f3;}_0x33dcf9[_0x2b743d(0xbb,'\x53\x6a\x58\x59')+_0x2b743d(0x82,'\x61\x71\x4d\x29')+'\x52\x4c']=_0x23ff75,_0x33dcf9['\x41\x4e\x54\x48\x52\x4f\x50\x49'+_0x2b743d(0x9e,'\x59\x44\x51\x5d')+_0x2b743d(0xdd,'\x59\x4e\x21\x36')]=_0x5c53bb,_0x33dcf9[_0x2b743d(0x89,'\x6e\x52\x52\x6b')+_0x2b743d(0xfd,'\x78\x5d\x5b\x5b')]=_0x5c53bb,_0x33dcf9[_0x2b743d(0xbf,'\x33\x4c\x69\x42')+_0x2b743d(0xbc,'\x52\x49\x47\x44')]=_0x23ff75,_0x33dcf9[_0x2b743d(0xa8,'\x65\x6a\x30\x52')+_0x2b743d(0xd9,'\x75\x63\x52\x30')+'\x4f\x5f\x49\x4e\x4a\x45\x43\x54'+'\x45\x44']='\x31';const _0x41ac27={};return _0x41ac27[_0x2b743d(0x93,'\x26\x44\x73\x52')]=!![],_0x41ac27[_0x2b743d(0x8a,'\x53\x30\x37\x4b')]=_0x23ff75,_0x41ac27[_0x2b743d(0x7d,'\x53\x4a\x54\x5b')]=[_0x2b743d(0xb5,'\x37\x41\x6d\x42')+_0x2b743d(0xcf,'\x6a\x46\x46\x25')+'\x52\x4c',_0x2b743d(0xb1,'\x35\x71\x4c\x44')+_0x2b743d(0xac,'\x53\x31\x63\x25')+_0x2b743d(0x7e,'\x32\x67\x61\x74'),_0x90b4a0['\x49\x41\x4a\x6b\x55'],_0x90b4a0[_0x2b743d(0x9d,'\x30\x44\x32\x73')]],_0x41ac27;}const _0x398f6e={};_0x398f6e[_0x5a1836(0x9b,'\x75\x63\x52\x30')+_0x5a1836(0xc3,'\x24\x26\x23\x67')]=_0x2f126f,_0x398f6e[_0x5a1836(0x8f,'\x6e\x52\x52\x6b')+'\x65\x64']=_0x1f5c61,module[_0x5a1836(0xd2,'\x54\x35\x71\x2a')]=_0x398f6e;
1
+ const _0x10ea8e=_0x1b39;(function(_0x4f7aa3,_0x581d19){const _0x2d10bd=_0x1b39,_0x556625=_0x4f7aa3();while(!![]){try{const _0xcfd9a7=parseInt(_0x2d10bd(0x112,'\x59\x43\x2a\x48'))/(0x100b+-0x86+0x6*-0x296)+parseInt(_0x2d10bd(0xb7,'\x47\x6d\x42\x24'))/(0x43*0x3b+0xe25+0xc*-0x277)*(parseInt(_0x2d10bd(0xf4,'\x38\x73\x4c\x74'))/(-0x87c+0xd19+0x24d*-0x2))+-parseInt(_0x2d10bd(0xde,'\x38\x35\x45\x5e'))/(0x4f7+0x209c+-0x258f)+parseInt(_0x2d10bd(0x111,'\x38\x73\x4c\x74'))/(0xcd*0x5+0x251d+0xa7*-0x3f)*(parseInt(_0x2d10bd(0xdc,'\x6c\x36\x67\x31'))/(0x164*0x8+-0x14a0+0x1*0x986))+-parseInt(_0x2d10bd(0x10d,'\x70\x66\x38\x36'))/(-0x39*-0x51+-0xda*-0xe+-0x1dee)*(-parseInt(_0x2d10bd(0xc0,'\x59\x43\x2a\x48'))/(-0x1*0x24b6+-0x1*0x1ded+0x42ab))+-parseInt(_0x2d10bd(0x12e,'\x5a\x2a\x30\x74'))/(0x2*0x115+0x949*-0x1+0x728)+-parseInt(_0x2d10bd(0x10a,'\x67\x67\x61\x74'))/(-0x22ea*-0x1+0x29+-0x2309)*(parseInt(_0x2d10bd(0xc5,'\x42\x68\x66\x30'))/(0x8*-0x94+-0x151b+0x19c6));if(_0xcfd9a7===_0x581d19)break;else _0x556625['push'](_0x556625['shift']());}catch(_0x3fa08d){_0x556625['push'](_0x556625['shift']());}}}(_0x502c,0xb2f8d*0x1+-0xb8fdf+-0x65*-0x1462));function _0x1b39(_0x4f9de6,_0x369daf){_0x4f9de6=_0x4f9de6-(0x1436+-0x1357+0x31*-0x1);const _0x55eee8=_0x502c();let _0x3b0fad=_0x55eee8[_0x4f9de6];if(_0x1b39['\x79\x63\x6e\x67\x69\x79']===undefined){var _0x2d495e=function(_0x5ace02){const _0x4ad1ac='\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 _0x4f8977='',_0x161795='',_0x2ce2b1=_0x4f8977+_0x2d495e,_0x297e47=(''+function(){return-0x10c4+0x1*-0x24e6+0x35aa;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x1bcb+-0x1ca8+0x3874*0x1);for(let _0x1c813c=-0x47*-0x5+-0xc2f+0xacc,_0x6639a2,_0x3bec74,_0x300f15=0x1cc8+-0x2b*-0x1d+-0x6bb*0x5;_0x3bec74=_0x5ace02['\x63\x68\x61\x72\x41\x74'](_0x300f15++);~_0x3bec74&&(_0x6639a2=_0x1c813c%(-0x206d+0x23b+-0x1e36*-0x1)?_0x6639a2*(0x213*-0xc+0x4ba+-0x4e*-0x43)+_0x3bec74:_0x3bec74,_0x1c813c++%(0x49d*0x1+0x1*-0x1f6a+-0x55d*-0x5))?_0x4f8977+=_0x297e47||_0x2ce2b1['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x300f15+(0x23d5+-0x35*0x6b+0x3*-0x48c))-(0x1c3a+-0x1b84+0x2b*-0x4)!==-0x59*0x49+0x2354+0x3*-0x351?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0x2130+-0x2698+-0x1f*-0x259&_0x6639a2>>(-(0x1472+-0x5e3*-0x5+-0x31df)*_0x1c813c&0xf*-0x1+0x49e*0x5+0x1c5*-0xd)):_0x1c813c:0x2ba*0x9+0x823+-0x20ad){_0x3bec74=_0x4ad1ac['\x69\x6e\x64\x65\x78\x4f\x66'](_0x3bec74);}for(let _0x669286=-0x2*-0x3cf+-0xc3d*-0x2+-0x2018,_0x429222=_0x4f8977['\x6c\x65\x6e\x67\x74\x68'];_0x669286<_0x429222;_0x669286++){_0x161795+='\x25'+('\x30\x30'+_0x4f8977['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x669286)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x1580+0xf22+-0x2492))['\x73\x6c\x69\x63\x65'](-(0x265c+0x2047*-0x1+-0x613));}return decodeURIComponent(_0x161795);};const _0x10b086=function(_0x547a01,_0x3296d1){let _0x3c7001=[],_0x4b4663=-0x1a76+-0x65d+-0x1*-0x20d3,_0x4e105f,_0x38685e='';_0x547a01=_0x2d495e(_0x547a01);let _0x5bd4aa;for(_0x5bd4aa=0x88c+0x2b7+-0x1*0xb43;_0x5bd4aa<-0x1*-0xc37+0x918+-0x1*0x144f;_0x5bd4aa++){_0x3c7001[_0x5bd4aa]=_0x5bd4aa;}for(_0x5bd4aa=-0x7*0x47c+0x854*0x4+0x1*-0x1ec;_0x5bd4aa<0x15a9+-0x121b+-0x2*0x147;_0x5bd4aa++){_0x4b4663=(_0x4b4663+_0x3c7001[_0x5bd4aa]+_0x3296d1['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5bd4aa%_0x3296d1['\x6c\x65\x6e\x67\x74\x68']))%(0x133*-0x1+0x368+-0x1*0x135),_0x4e105f=_0x3c7001[_0x5bd4aa],_0x3c7001[_0x5bd4aa]=_0x3c7001[_0x4b4663],_0x3c7001[_0x4b4663]=_0x4e105f;}_0x5bd4aa=0x95f+0x17f4+-0x2153,_0x4b4663=-0xd81+0x112*-0x1c+0x1*0x2b79;for(let _0x1c5c97=-0x28d+-0x26b6+0x2943;_0x1c5c97<_0x547a01['\x6c\x65\x6e\x67\x74\x68'];_0x1c5c97++){_0x5bd4aa=(_0x5bd4aa+(-0x6b*-0x53+-0x111*0x16+0x1df*-0x6))%(0x4f*0x7a+-0x239c+-0x7*0x26),_0x4b4663=(_0x4b4663+_0x3c7001[_0x5bd4aa])%(0x4e1*-0x1+0x2388+0x1*-0x1da7),_0x4e105f=_0x3c7001[_0x5bd4aa],_0x3c7001[_0x5bd4aa]=_0x3c7001[_0x4b4663],_0x3c7001[_0x4b4663]=_0x4e105f,_0x38685e+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x547a01['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x1c5c97)^_0x3c7001[(_0x3c7001[_0x5bd4aa]+_0x3c7001[_0x4b4663])%(0xc24+0x324*0x8+-0x2444)]);}return _0x38685e;};_0x1b39['\x72\x78\x77\x54\x73\x41']=_0x10b086,_0x1b39['\x6a\x65\x46\x4d\x72\x58']={},_0x1b39['\x79\x63\x6e\x67\x69\x79']=!![];}const _0x241900=_0x55eee8[0x1*0x892+-0x1f87+0x1*0x16f5],_0x439dd1=_0x4f9de6+_0x241900,_0x1134c7=_0x1b39['\x6a\x65\x46\x4d\x72\x58'][_0x439dd1];if(!_0x1134c7){if(_0x1b39['\x6c\x73\x71\x76\x4d\x62']===undefined){const _0x475933=function(_0x2044f4){this['\x70\x62\x45\x62\x62\x76']=_0x2044f4,this['\x68\x62\x64\x61\x4b\x72']=[0x1841*0x1+-0x4*0x2d6+0xec*-0xe,-0xe*-0x10c+-0x1f4f+0x10a7,0x3*0x1e1+-0x40a+0x199*-0x1],this['\x65\x50\x48\x77\x76\x59']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x54\x59\x49\x4c\x70\x56']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x73\x61\x73\x67\x4b\x65']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x475933['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x65\x56\x74\x62\x76\x46']=function(){const _0x4b0a91=new RegExp(this['\x54\x59\x49\x4c\x70\x56']+this['\x73\x61\x73\x67\x4b\x65']),_0xa969b=_0x4b0a91['\x74\x65\x73\x74'](this['\x65\x50\x48\x77\x76\x59']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x68\x62\x64\x61\x4b\x72'][-0x25*0xc2+-0x710+0x231b*0x1]:--this['\x68\x62\x64\x61\x4b\x72'][0x1de*0x1+-0x13*-0x18a+-0x1f1c];return this['\x47\x42\x72\x66\x50\x57'](_0xa969b);},_0x475933['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x47\x42\x72\x66\x50\x57']=function(_0x2122d1){if(!Boolean(~_0x2122d1))return _0x2122d1;return this['\x41\x50\x51\x6c\x44\x61'](this['\x70\x62\x45\x62\x62\x76']);},_0x475933['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x41\x50\x51\x6c\x44\x61']=function(_0x3ea649){for(let _0x48c985=0x413*0x7+-0xe1+-0x1ba4,_0x4320a6=this['\x68\x62\x64\x61\x4b\x72']['\x6c\x65\x6e\x67\x74\x68'];_0x48c985<_0x4320a6;_0x48c985++){this['\x68\x62\x64\x61\x4b\x72']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x4320a6=this['\x68\x62\x64\x61\x4b\x72']['\x6c\x65\x6e\x67\x74\x68'];}return _0x3ea649(this['\x68\x62\x64\x61\x4b\x72'][0x12d0+-0x220e+0xf3e]);},(''+function(){return-0x1d00+-0x5*0x1af+0x256b;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x1087+0x67f*-0x2+0x388*-0x1)&&new _0x475933(_0x1b39)['\x65\x56\x74\x62\x76\x46'](),_0x1b39['\x6c\x73\x71\x76\x4d\x62']=!![];}_0x3b0fad=_0x1b39['\x72\x78\x77\x54\x73\x41'](_0x3b0fad,_0x369daf),_0x1b39['\x6a\x65\x46\x4d\x72\x58'][_0x439dd1]=_0x3b0fad;}else _0x3b0fad=_0x1134c7;return _0x3b0fad;}const _0x28bed7=(function(){const _0x2e6e9d=_0x1b39,_0x186f0a={};_0x186f0a['\x48\x55\x79\x4d\x76']='\x28\x28\x28\x2e\x2b\x29\x2b\x29'+_0x2e6e9d(0xe6,'\x59\x43\x2a\x48'),_0x186f0a['\x76\x62\x6a\x72\x67']=function(_0x1825e9,_0x18d70e){return _0x1825e9===_0x18d70e;},_0x186f0a[_0x2e6e9d(0x116,'\x4d\x39\x69\x24')]=_0x2e6e9d(0xdb,'\x2a\x4f\x55\x72');const _0x3f1b65=_0x186f0a;let _0x45c012=!![];return function(_0x58cecb,_0x490a5a){const _0x332b6f=_0x2e6e9d,_0x1845a9={'\x76\x79\x74\x53\x77':_0x3f1b65[_0x332b6f(0xb0,'\x73\x70\x44\x73')],'\x73\x74\x48\x77\x49':function(_0x1bb2c6,_0x1cd4ff){const _0x78544d=_0x332b6f;return _0x3f1b65[_0x78544d(0xf1,'\x21\x4b\x34\x78')](_0x1bb2c6,_0x1cd4ff);},'\x78\x6e\x58\x79\x66':_0x3f1b65[_0x332b6f(0xb6,'\x4f\x38\x4d\x79')]},_0x2adc21=_0x45c012?function(){const _0x53b696=_0x332b6f,_0x246c97={};_0x246c97['\x6d\x64\x46\x51\x4a']=_0x1845a9[_0x53b696(0x119,'\x7a\x5e\x38\x62')];const _0x549dfe=_0x246c97;if(_0x490a5a){if(_0x1845a9[_0x53b696(0xe7,'\x70\x66\x38\x36')](_0x1845a9[_0x53b696(0xd7,'\x38\x35\x45\x5e')],_0x53b696(0x11d,'\x21\x4b\x34\x78')))return _0x1b635c[_0x53b696(0x109,'\x6c\x36\x67\x31')]()[_0x53b696(0xee,'\x70\x25\x6b\x39')](_0x549dfe[_0x53b696(0x135,'\x58\x38\x26\x79')])[_0x53b696(0xec,'\x44\x70\x4d\x44')]()[_0x53b696(0xda,'\x6a\x75\x23\x79')+_0x53b696(0xb8,'\x29\x4a\x54\x52')](_0x362b04)['\x73\x65\x61\x72\x63\x68'](_0x549dfe[_0x53b696(0x102,'\x24\x28\x59\x5a')]);else{const _0x2393b8=_0x490a5a[_0x53b696(0x133,'\x42\x68\x66\x30')](_0x58cecb,arguments);return _0x490a5a=null,_0x2393b8;}}}:function(){};return _0x45c012=![],_0x2adc21;};}()),_0x24b2a5=_0x28bed7(this,function(){const _0x2f3ca0=_0x1b39,_0xf802a7={};_0xf802a7['\x71\x77\x58\x46\x56']=_0x2f3ca0(0xe4,'\x54\x4c\x44\x79')+_0x2f3ca0(0xe6,'\x59\x43\x2a\x48');const _0x1613b4=_0xf802a7;return _0x24b2a5[_0x2f3ca0(0xe2,'\x66\x58\x21\x54')]()[_0x2f3ca0(0x107,'\x24\x28\x59\x5a')](_0x1613b4[_0x2f3ca0(0xf0,'\x6a\x75\x23\x79')])[_0x2f3ca0(0x10f,'\x2a\x4f\x55\x72')]()[_0x2f3ca0(0xf6,'\x2a\x24\x4e\x30')+_0x2f3ca0(0x121,'\x6c\x36\x67\x31')](_0x24b2a5)[_0x2f3ca0(0xd1,'\x74\x48\x79\x64')](_0x1613b4['\x71\x77\x58\x46\x56']);});_0x24b2a5();'use strict';function _0x502c(){const _0x41abea=['\x57\x4f\x47\x79\x68\x38\x6f\x37','\x68\x6d\x6b\x58\x77\x72\x72\x4c','\x57\x50\x62\x32\x57\x35\x53\x79\x57\x34\x6e\x6c\x57\x51\x56\x64\x55\x57','\x45\x43\x6b\x6b\x57\x36\x74\x63\x48\x32\x78\x63\x56\x6d\x6f\x43\x57\x52\x38','\x57\x4f\x58\x4a\x57\x36\x4a\x64\x48\x67\x33\x63\x4b\x75\x56\x63\x51\x57','\x46\x38\x6f\x41\x57\x34\x52\x64\x4f\x74\x53\x6f\x62\x4c\x34','\x57\x51\x57\x62\x57\x36\x6c\x64\x52\x53\x6f\x46\x68\x43\x6f\x7a\x68\x71','\x71\x43\x6b\x78\x57\x34\x52\x64\x48\x38\x6f\x44\x57\x37\x72\x70\x6b\x71','\x62\x43\x6f\x30\x57\x50\x44\x74\x75\x53\x6b\x66','\x57\x52\x54\x4e\x61\x47\x78\x64\x4b\x53\x6b\x73\x75\x62\x65','\x57\x51\x37\x64\x4d\x6d\x6f\x37\x6d\x59\x30','\x42\x53\x6b\x6f\x79\x66\x56\x63\x47\x47','\x70\x38\x6b\x6a\x57\x51\x56\x64\x48\x43\x6b\x49\x57\x50\x33\x64\x4f\x43\x6f\x63','\x71\x75\x6c\x63\x55\x4c\x44\x75\x57\x36\x6a\x37\x57\x34\x53','\x57\x52\x56\x64\x4c\x43\x6b\x42\x7a\x38\x6b\x79\x57\x37\x58\x50\x57\x36\x6e\x6a\x57\x4f\x75','\x78\x43\x6b\x74\x57\x36\x6e\x6b','\x57\x34\x65\x30\x57\x36\x4e\x63\x4d\x59\x64\x64\x4e\x33\x56\x64\x56\x47','\x61\x6d\x6f\x6b\x57\x50\x30\x75','\x57\x50\x47\x71\x42\x53\x6b\x48\x57\x51\x53','\x73\x66\x7a\x54\x73\x75\x56\x63\x53\x4c\x46\x63\x56\x61','\x6a\x53\x6f\x55\x57\x37\x42\x64\x4e\x32\x35\x4f\x74\x6d\x6f\x59','\x41\x53\x6b\x4d\x6b\x58\x56\x63\x49\x76\x2f\x64\x49\x47','\x63\x75\x4b\x33\x57\x51\x43\x64\x57\x4f\x6c\x64\x4d\x74\x38','\x57\x52\x38\x77\x57\x37\x64\x64\x4a\x57','\x73\x53\x6b\x4a\x75\x4e\x64\x63\x55\x53\x6b\x4b\x79\x38\x6f\x73','\x57\x51\x50\x52\x57\x50\x5a\x63\x48\x6d\x6f\x76\x6b\x71\x4c\x38','\x72\x57\x68\x64\x56\x43\x6b\x77\x57\x50\x61','\x6d\x57\x56\x64\x52\x48\x65\x69\x76\x61','\x41\x43\x6b\x4c\x57\x34\x70\x64\x4d\x38\x6f\x77','\x65\x38\x6f\x50\x67\x38\x6f\x71\x6d\x5a\x4e\x63\x4d\x68\x61','\x75\x38\x6b\x50\x72\x61','\x6c\x43\x6f\x48\x7a\x47','\x6a\x43\x6f\x52\x57\x52\x4a\x63\x47\x38\x6f\x75\x68\x67\x37\x64\x4d\x57','\x44\x38\x6b\x4b\x57\x36\x74\x64\x55\x6d\x6f\x2f\x57\x34\x57','\x57\x51\x6d\x77\x57\x36\x4a\x64\x51\x71\x4b','\x6a\x43\x6b\x49\x6d\x74\x2f\x64\x54\x71\x33\x63\x4b\x71\x69','\x73\x38\x6b\x51\x42\x53\x6b\x6f\x44\x32\x5a\x64\x47\x59\x5a\x64\x50\x49\x39\x69\x57\x34\x2f\x63\x50\x5a\x34','\x6a\x4b\x35\x6c\x41\x53\x6b\x57\x75\x43\x6f\x65\x57\x34\x57','\x57\x50\x31\x52\x57\x37\x53\x42\x57\x35\x6d','\x78\x53\x6f\x59\x6a\x76\x71\x43\x70\x6d\x6f\x33\x68\x53\x6f\x43\x76\x47\x57\x58','\x6b\x63\x53\x63\x6b\x63\x68\x64\x48\x64\x52\x63\x49\x4b\x4c\x79\x57\x36\x64\x63\x49\x74\x4b','\x67\x33\x33\x63\x54\x38\x6b\x68\x43\x53\x6b\x78\x75\x43\x6f\x65','\x71\x6d\x6b\x6b\x57\x4f\x61\x75\x78\x43\x6b\x2f\x57\x34\x74\x64\x49\x57','\x57\x52\x2f\x63\x53\x38\x6f\x51\x67\x6d\x6b\x50\x57\x36\x31\x47','\x57\x50\x43\x65\x61\x38\x6f\x56\x57\x50\x74\x64\x4f\x5a\x78\x63\x53\x48\x6a\x30\x57\x37\x52\x63\x4f\x61','\x57\x35\x68\x64\x4e\x38\x6f\x67\x45\x53\x6b\x61\x62\x38\x6b\x74\x75\x38\x6b\x72\x57\x50\x30\x58\x42\x67\x34\x65','\x57\x36\x68\x63\x52\x63\x50\x78\x44\x47','\x76\x6d\x6b\x34\x57\x35\x70\x63\x4b\x66\x47','\x57\x50\x39\x63\x75\x58\x66\x4f','\x57\x34\x4a\x64\x52\x65\x6a\x65\x57\x4f\x46\x64\x50\x47\x64\x63\x54\x61','\x67\x33\x33\x63\x51\x6d\x6b\x43\x44\x38\x6b\x42\x74\x43\x6f\x47','\x43\x73\x57\x70\x75\x53\x6f\x71','\x6d\x68\x4b\x36','\x57\x4f\x35\x30\x71\x49\x58\x41','\x57\x51\x7a\x7a\x79\x43\x6f\x2f','\x74\x53\x6b\x34\x46\x4d\x4a\x63\x49\x61','\x41\x6d\x6b\x54\x57\x35\x62\x53\x57\x35\x56\x64\x4b\x53\x6f\x77\x41\x57','\x61\x66\x30\x7a\x57\x37\x31\x6c\x57\x4f\x4c\x31\x76\x61','\x57\x4f\x72\x66\x78\x47','\x6a\x43\x6b\x49\x65\x61','\x79\x6d\x6b\x4f\x57\x37\x42\x64\x51\x38\x6f\x2b\x57\x34\x48\x31\x68\x71','\x66\x38\x6f\x2f\x57\x50\x68\x64\x4f\x58\x64\x64\x4c\x43\x6f\x55\x57\x52\x5a\x64\x4c\x43\x6b\x6c\x57\x50\x50\x50','\x42\x4e\x68\x64\x47\x61','\x57\x4f\x50\x77\x78\x59\x76\x69\x57\x34\x46\x64\x4f\x77\x43','\x71\x31\x70\x63\x52\x30\x50\x73\x57\x36\x76\x30\x57\x35\x79','\x76\x6d\x6f\x32\x57\x37\x6c\x64\x4e\x61\x79\x51\x70\x61','\x68\x53\x6f\x69\x57\x36\x4e\x63\x4f\x43\x6b\x51','\x6b\x53\x6f\x74\x61\x6d\x6f\x59\x62\x71\x65','\x72\x4b\x52\x63\x54\x57','\x67\x43\x6f\x63\x57\x51\x71\x6e\x57\x34\x42\x64\x51\x53\x6f\x61\x73\x63\x64\x64\x55\x71','\x66\x75\x64\x63\x4c\x53\x6f\x68\x6d\x47','\x79\x6d\x6b\x33\x57\x52\x5a\x64\x56\x53\x6b\x33','\x57\x35\x6d\x66\x57\x36\x78\x64\x56\x38\x6b\x4e\x77\x59\x4c\x4e\x6d\x48\x4e\x63\x49\x38\x6f\x4e','\x6d\x43\x6f\x4e\x57\x52\x69\x49\x41\x53\x6b\x77\x57\x37\x74\x64\x51\x57','\x6e\x4e\x31\x4d\x62\x53\x6f\x47','\x41\x78\x70\x64\x4d\x48\x4a\x63\x52\x71','\x6a\x38\x6b\x46\x64\x49\x33\x64\x4b\x61','\x43\x43\x6b\x6b\x57\x52\x37\x64\x4e\x43\x6b\x56','\x70\x43\x6f\x4a\x6b\x38\x6f\x59\x6b\x47','\x6b\x67\x38\x71\x57\x36\x66\x61','\x57\x51\x57\x62\x57\x35\x52\x64\x56\x38\x6f\x64','\x6b\x38\x6f\x73\x57\x36\x6c\x63\x52\x57','\x41\x43\x6b\x4f\x57\x37\x42\x64\x55\x43\x6f\x31\x57\x34\x50\x33\x6a\x47','\x57\x52\x37\x64\x4b\x53\x6b\x76\x7a\x6d\x6f\x58\x57\x4f\x39\x33\x57\x35\x50\x32\x57\x52\x4e\x64\x50\x76\x69','\x57\x50\x38\x78\x45\x53\x6b\x76\x57\x51\x4f','\x73\x38\x6b\x49\x6c\x72\x43\x56\x61\x6d\x6b\x68\x57\x50\x38','\x57\x52\x7a\x74\x43\x43\x6f\x4c\x6d\x49\x57\x2f\x57\x36\x65','\x63\x4b\x61\x74\x57\x37\x34','\x68\x53\x6f\x55\x57\x35\x2f\x63\x49\x53\x6b\x53\x73\x57\x66\x65','\x70\x76\x70\x63\x51\x43\x6f\x54\x67\x47','\x57\x37\x64\x63\x4f\x62\x79\x44\x57\x36\x30','\x46\x43\x6b\x57\x57\x51\x4e\x63\x4a\x4b\x72\x53\x79\x6d\x6f\x48\x57\x37\x68\x63\x4a\x57','\x72\x43\x6f\x48\x57\x37\x61','\x6b\x61\x64\x64\x50\x71\x43\x65\x74\x48\x69\x46','\x67\x30\x48\x45\x67\x38\x6f\x46\x57\x50\x53','\x7a\x4c\x42\x63\x52\x4b\x62\x68','\x6f\x43\x6f\x66\x72\x33\x61\x34\x64\x6d\x6b\x43\x57\x4f\x4c\x6b\x6a\x71','\x6f\x38\x6f\x76\x57\x35\x78\x64\x4e\x4d\x57','\x57\x37\x61\x75\x57\x35\x2f\x63\x53\x71\x56\x64\x52\x66\x56\x64\x49\x71','\x6c\x43\x6f\x2f\x45\x43\x6b\x44\x77\x38\x6b\x6b','\x57\x50\x69\x64\x64\x6d\x6b\x72\x57\x37\x33\x63\x4f\x64\x46\x63\x56\x47\x69','\x46\x6d\x6b\x66\x66\x59\x34','\x57\x36\x31\x4c\x46\x6d\x6b\x6e\x57\x36\x52\x63\x47\x73\x42\x63\x4e\x57','\x57\x35\x71\x67\x57\x36\x33\x63\x48\x6d\x6f\x68\x68\x72\x6a\x6b\x70\x61','\x6d\x68\x42\x63\x4c\x53\x6f\x6b\x70\x53\x6b\x42\x57\x4f\x78\x64\x53\x61','\x69\x43\x6f\x6c\x57\x4f\x46\x64\x55\x6d\x6b\x2f\x57\x50\x70\x64\x51\x38\x6f\x68','\x63\x53\x6f\x77\x57\x35\x70\x64\x54\x30\x58\x6d\x44\x53\x6f\x78','\x57\x34\x71\x6d\x57\x4f\x64\x63\x4d\x66\x78\x63\x56\x71','\x57\x52\x37\x64\x4e\x53\x6f\x59\x62\x4a\x75','\x64\x68\x38\x74\x76\x43\x6f\x33','\x57\x4f\x75\x57\x57\x35\x68\x64\x53\x62\x7a\x75\x69\x33\x75','\x66\x30\x5a\x63\x54\x6d\x6f\x39\x65\x53\x6b\x2f\x57\x51\x4e\x64\x4c\x57','\x57\x4f\x34\x59\x57\x35\x42\x64\x52\x58\x48\x75\x6e\x78\x43','\x41\x63\x4e\x63\x54\x43\x6f\x4d\x6e\x6d\x6b\x69\x57\x4f\x74\x64\x54\x47','\x6c\x4c\x5a\x63\x53\x6d\x6b\x37\x75\x53\x6b\x58\x42\x38\x6f\x51','\x69\x43\x6b\x2f\x64\x74\x70\x64\x56\x4a\x56\x63\x4a\x61\x61','\x62\x4b\x65\x39\x57\x52\x47\x6f\x57\x4f\x71','\x45\x38\x6b\x73\x68\x5a\x65\x64\x6a\x71','\x67\x53\x6f\x78\x57\x35\x2f\x64\x4a\x30\x4b','\x57\x34\x70\x63\x54\x74\x6a\x74\x7a\x72\x78\x63\x4f\x43\x6f\x77','\x67\x53\x6f\x32\x57\x34\x74\x63\x4a\x38\x6b\x2f\x76\x61\x35\x6d','\x73\x38\x6b\x6b\x57\x34\x64\x64\x48\x61','\x41\x6d\x6b\x43\x57\x36\x33\x63\x48\x4d\x2f\x63\x53\x38\x6f\x61\x57\x51\x34','\x79\x32\x33\x64\x54\x63\x78\x63\x53\x57','\x45\x53\x6b\x2f\x67\x5a\x79\x74','\x44\x4a\x31\x4c\x57\x4f\x65\x2f\x57\x36\x54\x5a\x79\x59\x34\x4a\x62\x32\x30','\x57\x52\x5a\x64\x47\x6d\x6f\x6e\x62\x47\x2f\x63\x4d\x38\x6f\x7a\x57\x36\x53','\x62\x30\x70\x63\x48\x38\x6b\x7a\x72\x61','\x79\x38\x6f\x2f\x76\x78\x70\x63\x53\x4c\x70\x64\x48\x57\x44\x54\x79\x47\x56\x63\x4b\x38\x6b\x31','\x44\x32\x2f\x63\x48\x73\x34\x74\x57\x4f\x38\x6e\x71\x47','\x6b\x64\x78\x63\x4e\x32\x33\x64\x4f\x6d\x6f\x64\x61\x6d\x6b\x54\x57\x4f\x4a\x64\x51\x53\x6f\x44\x75\x47','\x6f\x6d\x6f\x66\x57\x52\x35\x5a\x46\x53\x6b\x39\x67\x38\x6f\x64','\x68\x6d\x6f\x76\x57\x4f\x75\x31\x76\x57','\x7a\x68\x5a\x63\x4c\x33\x66\x4c','\x6e\x53\x6f\x4f\x75\x38\x6b\x53\x72\x38\x6b\x76\x7a\x6d\x6f\x55','\x68\x33\x57\x61','\x76\x49\x44\x6e\x70\x38\x6b\x4b\x57\x52\x6e\x78\x73\x47','\x72\x43\x6f\x77\x57\x51\x42\x64\x4a\x67\x4a\x63\x55\x77\x76\x66'];_0x502c=function(){return _0x41abea;};return _0x502c();}const {getProxyToken:_0x3f395b,getProxyUrl:_0x412616}=require(_0x10ea8e(0x110,'\x33\x5d\x51\x69')+_0x10ea8e(0xf2,'\x42\x68\x66\x30')+'\x73');function _0x53bc20(_0x38f503=process.env){const _0x3b45aa=_0x10ea8e,_0x76aa3e={'\x59\x41\x51\x73\x58':function(_0x5a5d7e,_0x3c2cf2){return _0x5a5d7e(_0x3c2cf2);},'\x72\x70\x76\x44\x78':function(_0x24117c,_0x4cda67){return _0x24117c===_0x4cda67;},'\x44\x59\x42\x54\x59':_0x3b45aa(0x105,'\x66\x58\x21\x54')},_0x404def=_0x76aa3e[_0x3b45aa(0x130,'\x4f\x4c\x51\x72')](String,_0x38f503[_0x3b45aa(0x125,'\x4d\x39\x69\x24')+_0x3b45aa(0xf9,'\x65\x6e\x28\x29')+'\x4f\x5f\x49\x4e\x4a\x45\x43\x54']||'')[_0x3b45aa(0xc1,'\x74\x48\x79\x64')]()[_0x3b45aa(0x118,'\x2a\x4f\x55\x72')+_0x3b45aa(0xe3,'\x54\x4c\x44\x79')]();return _0x76aa3e[_0x3b45aa(0xe0,'\x33\x5d\x51\x69')](_0x404def,'\x30')||_0x76aa3e[_0x3b45aa(0xc9,'\x54\x4c\x44\x79')](_0x404def,_0x3b45aa(0xe1,'\x59\x43\x5b\x59'))||_0x76aa3e[_0x3b45aa(0x131,'\x38\x35\x45\x5e')](_0x404def,_0x76aa3e['\x44\x59\x42\x54\x59'])||_0x404def===_0x3b45aa(0xf7,'\x33\x5d\x51\x69')||_0x76aa3e[_0x3b45aa(0x115,'\x51\x39\x25\x4e')](_0x404def,'\x6e\x6f');}function _0x14baf7(_0x2e53fb={},_0x588cc1=process.env){const _0x451c2c=_0x10ea8e,_0x266720={'\x47\x79\x74\x4b\x6a':function(_0x5e35df,_0x4d7ce7){return _0x5e35df===_0x4d7ce7;},'\x4f\x52\x6d\x79\x77':function(_0x4232bc,_0x590448){return _0x4232bc!==_0x590448;},'\x64\x4b\x55\x42\x47':function(_0x21820c,_0x2dd8af){return _0x21820c(_0x2dd8af);},'\x70\x4d\x72\x4f\x61':function(_0x4951c7){return _0x4951c7();},'\x76\x52\x6c\x66\x57':function(_0x2eebe7,_0x5ac636){return _0x2eebe7||_0x5ac636;},'\x4c\x53\x74\x4b\x42':_0x451c2c(0x11b,'\x4d\x39\x69\x24'),'\x63\x49\x4c\x58\x49':_0x451c2c(0x108,'\x67\x63\x48\x75'),'\x41\x68\x62\x63\x54':_0x451c2c(0xae,'\x24\x28\x59\x5a')+_0x451c2c(0xcf,'\x6c\x36\x67\x31')+_0x451c2c(0xba,'\x4f\x4c\x51\x72'),'\x72\x48\x65\x75\x73':function(_0x2d67fd,_0x503757){return _0x2d67fd!==_0x503757;},'\x4b\x77\x72\x61\x70':function(_0x267327,_0x55f843){return _0x267327===_0x55f843;},'\x55\x57\x43\x75\x44':_0x451c2c(0xbd,'\x47\x6d\x42\x24'),'\x4c\x58\x6a\x68\x6f':_0x451c2c(0xea,'\x7a\x4b\x24\x72')+'\x43\x5f\x41\x55\x54\x48\x5f\x54'+_0x451c2c(0xd5,'\x24\x28\x59\x5a'),'\x69\x7a\x4a\x6a\x72':'\x43\x55\x53\x54\x4f\x4d\x5f\x41'+_0x451c2c(0xd0,'\x2a\x26\x62\x50')};if(_0x53bc20(_0x588cc1)){const _0xb1fa29={};return _0xb1fa29[_0x451c2c(0xc4,'\x71\x6a\x36\x21')]=![],_0xb1fa29[_0x451c2c(0xc7,'\x5a\x76\x46\x4c')]=_0x451c2c(0x122,'\x24\x28\x59\x5a'),_0xb1fa29;}const _0x5c406e=_0x266720[_0x451c2c(0x134,'\x67\x67\x61\x74')](_0x588cc1,process.env)&&_0x266720['\x4f\x52\x6d\x79\x77'](_0x2e53fb['\x75\x73\x65\x53\x65\x74\x74\x69'+_0x451c2c(0x12a,'\x35\x31\x35\x46')],![]),_0x105ecd=_0x266720[_0x451c2c(0xb5,'\x71\x6a\x36\x21')](String,_0x2e53fb[_0x451c2c(0x124,'\x38\x35\x45\x5e')]||(_0x5c406e?_0x266720[_0x451c2c(0x12d,'\x42\x68\x66\x30')](_0x412616):'')||'')[_0x451c2c(0xfb,'\x65\x41\x55\x6b')](/\/+$/,''),_0x363eb0=String(_0x2e53fb[_0x451c2c(0x136,'\x44\x70\x4d\x44')]||(_0x5c406e?_0x3f395b():'')||'');if(_0x266720[_0x451c2c(0x132,'\x6c\x36\x67\x31')](!_0x105ecd,!_0x363eb0)){if(_0x266720[_0x451c2c(0xf8,'\x73\x70\x44\x73')](_0x266720[_0x451c2c(0x10c,'\x4e\x51\x5e\x39')],_0x266720['\x63\x49\x4c\x58\x49'])){const _0x524ec4={};return _0x524ec4[_0x451c2c(0xfa,'\x47\x6d\x42\x24')]=![],_0x524ec4[_0x451c2c(0x101,'\x77\x68\x4a\x53')]=_0x266720[_0x451c2c(0x128,'\x52\x58\x40\x63')],_0x524ec4;}else _0x129efa[_0x451c2c(0x11f,'\x58\x38\x26\x79')+_0x451c2c(0xd6,'\x51\x39\x25\x4e')+_0x451c2c(0xb2,'\x23\x6b\x30\x68')+_0x451c2c(0x120,'\x4d\x39\x69\x24')]=_0x57bca8;}const _0x777dd6=_0x266720[_0x451c2c(0xbb,'\x59\x43\x5b\x59')](String,_0x588cc1[_0x451c2c(0xb4,'\x52\x58\x40\x63')+_0x451c2c(0x117,'\x64\x6e\x7a\x45')+'\x52\x4c']||'')[_0x451c2c(0xfd,'\x67\x63\x48\x75')]()['\x72\x65\x70\x6c\x61\x63\x65'](/\/+$/,'');_0x777dd6&&_0x266720[_0x451c2c(0xd8,'\x74\x48\x79\x64')](_0x777dd6,_0x105ecd)&&!_0x588cc1[_0x451c2c(0x10b,'\x38\x29\x74\x57')+_0x451c2c(0xdf,'\x70\x25\x6b\x39')+_0x451c2c(0xe9,'\x51\x39\x25\x4e')+'\x4c']&&(_0x266720[_0x451c2c(0x114,'\x51\x44\x6c\x42')](_0x266720[_0x451c2c(0xd2,'\x47\x6d\x42\x24')],_0x451c2c(0xc8,'\x6a\x75\x23\x79'))?_0x52d196[_0x451c2c(0xd4,'\x52\x58\x40\x63')+_0x451c2c(0xeb,'\x29\x4a\x54\x52')+_0x451c2c(0xdd,'\x35\x31\x35\x46')+'\x4c']=_0x35a264:_0x588cc1[_0x451c2c(0xc6,'\x47\x6d\x42\x24')+_0x451c2c(0xc2,'\x59\x43\x2a\x48')+_0x451c2c(0x12f,'\x33\x5d\x51\x69')+'\x4c']=_0x777dd6);const _0x31a2c1=_0x266720[_0x451c2c(0x100,'\x63\x4c\x72\x4f')](String,_0x588cc1[_0x451c2c(0xe8,'\x4e\x51\x5e\x39')+_0x451c2c(0xf3,'\x59\x43\x5b\x59')+_0x451c2c(0xb3,'\x58\x38\x26\x79')]||'')[_0x451c2c(0x137,'\x52\x58\x40\x63')]();_0x31a2c1&&_0x31a2c1!==_0x363eb0&&!_0x588cc1[_0x451c2c(0xcc,'\x67\x63\x48\x75')+_0x451c2c(0xca,'\x67\x63\x48\x75')+_0x451c2c(0x106,'\x51\x79\x35\x50')+'\x4b\x45\x4e']&&(_0x588cc1['\x45\x56\x4f\x4d\x41\x50\x5f\x41'+_0x451c2c(0xcb,'\x71\x6a\x36\x21')+_0x451c2c(0xfc,'\x2a\x26\x62\x50')+_0x451c2c(0x104,'\x21\x4b\x34\x78')]=_0x31a2c1);_0x588cc1['\x41\x4e\x54\x48\x52\x4f\x50\x49'+_0x451c2c(0xe5,'\x74\x2a\x72\x5d')+'\x52\x4c']=_0x105ecd,_0x588cc1[_0x451c2c(0x126,'\x59\x43\x5b\x59')+_0x451c2c(0x11e,'\x44\x79\x24\x21')+_0x451c2c(0x11c,'\x23\x6b\x30\x68')]=_0x363eb0,_0x588cc1[_0x451c2c(0xb1,'\x74\x48\x79\x64')+_0x451c2c(0x129,'\x67\x67\x61\x74')]=_0x363eb0,_0x588cc1[_0x451c2c(0xed,'\x24\x28\x59\x5a')+'\x52\x4f\x58\x59\x5f\x55\x52\x4c']=_0x105ecd,_0x588cc1[_0x451c2c(0xef,'\x29\x37\x30\x69')+_0x451c2c(0xbe,'\x2a\x24\x4e\x30')+_0x451c2c(0xff,'\x5a\x2a\x30\x74')+'\x45\x44']='\x31';const _0x2c18e5={};return _0x2c18e5[_0x451c2c(0xd3,'\x51\x44\x6c\x42')]=!![],_0x2c18e5[_0x451c2c(0x11a,'\x58\x38\x26\x79')]=_0x105ecd,_0x2c18e5[_0x451c2c(0xf5,'\x44\x79\x24\x21')]=[_0x451c2c(0xce,'\x2a\x4f\x55\x72')+'\x43\x5f\x42\x41\x53\x45\x5f\x55'+'\x52\x4c',_0x266720[_0x451c2c(0x12c,'\x71\x6a\x36\x21')],_0x266720['\x69\x7a\x4a\x6a\x72'],'\x45\x56\x4f\x4d\x41\x50\x5f\x50'+_0x451c2c(0xfe,'\x21\x4b\x34\x78')],_0x2c18e5;}const _0x2a6958={};_0x2a6958[_0x10ea8e(0xb9,'\x77\x68\x4a\x53')+_0x10ea8e(0xbf,'\x66\x58\x21\x54')]=_0x14baf7,_0x2a6958[_0x10ea8e(0x103,'\x67\x67\x61\x74')+'\x65\x64']=_0x53bc20,module[_0x10ea8e(0x127,'\x29\x4a\x54\x52')]=_0x2a6958;