@ax-hub/sdk 0.0.3 → 0.0.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,86 @@
1
1
  # Changelog
2
2
 
3
+ ## [Unreleased]
4
+
5
+ ## [0.0.5] — 2026-05-25
6
+
7
+ ### BREAKING
8
+
9
+ - `gateway.connectors.list()` / `gateway.resources.list()` 반환 `PaginatedList<T>` → `T[]` — backend gateway list 엔드포인트가 pagination 봉투 없이 bare array 반환 (ADR-0036). Migration: `const { items } = await tenant.gateway.connectors.list()` → `const items = await tenant.gateway.connectors.list()` (cursor/total 처리 제거).
10
+ - `gateway.connectors` 경로가 tenant root 로 이동 (`/tenants/{id}/gateway/connectors` → `/tenants/{id}/connectors`) — 기존 경로는 backend 에서 404 였음 (ADR-0036). 호출 코드 변경 없음 (SDK 내부 경로).
11
+ - `GatewayQueryResult` 모양 변경 (ADR-0036): `{ rows, rowCount, auditEventId }` → `{ allowed, denyReason?, columns, rows, rowCount, matchedPolicies? }`. `auditEventId` 제거 (backend query 응답에 없어 항상 undefined 였음). `query.run` 이 backend 의 positional `rows: [][]any` + `columns` 를 객체 배열로 zip — 이전엔 `rows` 가 `Row[]` 로 타입됐지만 실제론 매핑 안 된 배열이었음. Migration: `res.rows[i].colName` 이 이제 실제 동작; `res.auditEventId` 사용처 제거; policy deny 는 `res.allowed === false` + `res.denyReason` 로 확인.
12
+
13
+ ### Internal
14
+
15
+ - **harness revamp (2026-05-22)** — agent-first SDK 유지보수 인프라 신규 구축. 회사 인계 + 신규 maintainer 대비.
16
+ - `AGENTS.md` rewrite: 8 BC + 16 invariants + BC-specific rules summary + verification matrix + workflow + anti-patterns. LLM-agnostic (Claude/Codex/Cursor 모두 root에서 자동 인식).
17
+ - `CLAUDE.md`에 `<!-- sdk-rules:start -->...<!-- sdk-rules:end -->` managed block 추가. GitNexus block과 분리.
18
+ - per-domain `CLAUDE.md` × 7: `src/resources/`, `src/resources/apps/`, `src/resources/data/`, `src/errors/`, `codegen/`, `tests/`, `scripts/`. Claude Code 작업 디렉토리 자동 컨텍스트.
19
+ - `docs/decisions/` ADR catalog (MADR format) × 35: `.plan/` 31+ 결정을 영구 보존. `README.md` 인덱스.
20
+ - `docs/MAINTAINING.md`: 회사 인수자 onboarding (week 1 / month 3 / month 12 milestones + first PR walkthrough + common pitfalls).
21
+ - `lefthook.yml` pre-commit: priority 1 `build:raw` 후 priority 2 `typecheck`/`test:unit`/`extract-codes`/`route-inventory-diff`/`check:size:fast`/`check:dist-wire:fast` parallel. race-free.
22
+ - `package.json` `prepare: lefthook install` — `npm install` 시 hook 자동 설치. `lefthook` devDep 추가.
23
+ - `check:size:fast` + `check:dist-wire:fast` script variants — pre-commit용 (build 호출 안 함, dist/ exists guard 추가).
24
+ - `tests/lefthook-smoke/` × 6 fixture + `run.sh` + `.github/workflows/lefthook-smoke.yml`: invariant 위반 패턴 (한국어 substring, mock parity, cursor v2 bypass, BC boundary, redaction leak, prototype pollution)이 실제 차단되는지 PR마다 검증.
25
+ - `.github/PULL_REQUEST_TEMPLATE.md`: 16 invariant checklist + ADR link field + verification checklist.
26
+ - `.plan/` 삭제 — rationale은 `docs/decisions/` ADR로 영구 이관.
27
+ - `TODOS.md` deferred to v1.1+: sdk-onboard skill, harness-fidelity eval, extract-decisions automation, AGENTS↔ADR sync script, ADR index 자동 생성.
28
+
29
+ ## [0.0.4] — 2026-05-22
30
+
31
+ PR #12 종합 리뷰 (8 ce reviewers) 결과 반영 — D36 scope freeze 명시적 override (2026-05-22). 75 finding → 25 distinct → 8 stories.
32
+
33
+ ### BREAKING
34
+
35
+ - `list()` `nextCursor` wire format — `orderBy`/`after`/`before` 또는 v2 cursor 입력 시 `v2:<base64-url>` 키셋 토큰 반환. 기존 순수 정수 cursor 는 plain page 호환을 위해 계속 수용되지만 `v1:` 접두사 토큰은 이제 `LegacyCursorError` throw.
36
+ - `list()` 진입부 `cursor` 검증 강화 — v2/v1 접두사 아닌 cursor 가 정수가 아니면 `InvalidCursorError` throw (silent NaN 폴백 차단).
37
+ - `v2:` cursor 토큰에 `contextFingerprint` (tenant+app+table SHA8) 가 SDK 측에서 주입되며 디코드 시 mismatch 면 `InvalidCursorError` throw — 다른 테이블의 cursor 재생 차단.
38
+ - `v2:` cursor 토큰 size 상한 `MAX_CURSOR_TOKEN_LENGTH=4096` — 초과 시 `InvalidCursorError` (base64 DoS 가드).
39
+ - mock `get/update/delete` 가 `NotFoundError` throw — 실 백엔드 404 동작과 일치 (이전: `get` = null cast, `delete` = silent). drop-in parity 의 핵심 누락 해소.
40
+ - mock `insert` 가 중복 id 시 `ConflictError` (code=`duplicate_key`, httpStatus=409) throw — 이전: 일반 `Error`. `instanceof AxHubError` 분기를 가진 호출자가 mock/real 일관 처리 가능.
41
+ - `defineSchema().validate` 타입이 `unknown` → `ZodSchemaLike` 로 좁혀짐 — 잘못된 입력 컴파일 단계 차단.
42
+
43
+ ### Added
44
+
45
+ - `ScanLimitExceededError` (`InternalServerError` 계열, code=`scan_limit_exceeded`) — `count({where})` 가 100K 행 스캔 한도 초과 시, `discover()` app-id fallback 이 10 페이지 한도 초과 시 throw.
46
+ - `MAX_CURSOR_TOKEN_LENGTH` 상수 export.
47
+ - `assertCursorMatchesContext` 함수 — SDK 자체에서 cursor scope 검증.
48
+ - `KeysetCursor.contextFingerprint` 옵션 필드, `CursorBuildOptions.contextFingerprint` 옵션.
49
+ - `PaginatedList.totalIsExact?: boolean` — `where` 적용 + 백엔드 미푸시다운 시 `false` 마킹, caller 가 page-당 partial count 임을 인지 가능.
50
+ - `assertSafeLikePattern()` + `MAX_LIKE_PATTERN_LENGTH`/`MAX_CONSECUTIVE_WILDCARDS`/`MAX_LIKE_ALTERNATION_SEGMENTS` 상수 — `like.raw()` 진입부에서 ReDoS 패턴 거부.
51
+
52
+ ### Changed
53
+
54
+ - `assertMockModeAllowed()` — `NODE_ENV` 대소문자/공백 정규화 (`'Production '` / `'PRODUCTION'` 인식), `AX_HUB_ALLOW_MOCK_IN_PROD` 가 `'1'/'true'/'yes'/'on'` (대소문자/공백 무시) truthy 파싱.
55
+ - `SchemaCache` 5xx 응답 시 30 초 negative TTL 로 이전 stale 엔트리 보존 (stale-while-error) → degraded backend 동안 thundering herd 방지. `negativeTtlMs` 옵션으로 조정 가능 (default `DEFAULT_SCHEMA_CACHE_NEGATIVE_TTL_MS = 30000`).
56
+ - `SchemaCache.getOrSet` 가 monotonic write token 으로 stale-write race 차단 — `fresh:true` 추월이 stale `set` 으로 overwrite 못 함.
57
+ - `SchemaCache.getOrSet` 가 loader rejection 시 즉시 inflight 키 evict (다음 콜러 retry 가능). transient 5xx 만 stale entry 복원.
58
+ - `count({where})` 가 page 크기 100 → 1000 + 최대 100 페이지 (10만 행) 스캔 상한 + 매 iteration `signal.aborted` 검사.
59
+ - `discover()` app-id 폴백 (`resolveAppId`) 가 5 초 총 budget + `signal` per-page threading + 빈 첫 페이지 즉시 `TableNotFoundError` + 페이지 한도 초과 시 `ScanLimitExceededError`.
60
+ - `inferSchemaFromRows` UUID 정규식 RFC4122 정확 (`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`) — 이전 `[0-9a-f-]{27,}` false-positive 제거.
61
+ - `src/mock/index.ts` wildcard `export *` 제거 → `createMockStore`/`assertMockModeAllowed`/`MockClientOptions`/`MockStore`/`MockFixtures`/`MockSchemas`/`MockRow` 만 named export. DSL evaluator/CRUD 핸들러/페이지네이션/projection internal 화.
62
+ - `src/mock/projection.ts` 단일 라인 re-export 파일 삭제 (consumer 들이 `src/resources/data/projection.js` 직접 import).
63
+ - `schemaFromInspectResult` 가 `__proto__`/`constructor`/`prototype` 등 위험 컬럼명 거부 + identifier-shape regex 검증 (defense-in-depth, prototype pollution 시나리오 봉쇄).
64
+ - mock `paginateRows` 가 cursor tiebreaker row 가 삭제된 경우 page1 silent 재출력 대신 `InvalidCursorError` throw.
65
+ - mock pagination 의 plain cursor 가 정수 아니면 `InvalidCursorError` throw.
66
+
67
+ ### Fixed
68
+
69
+ - DSL 평가 single truth — `src/resources/data/index.ts` 의 `matchesWhere`/`compare`/`likeToRegExp`/`escapeRegExp` 4 함수 삭제. live + mock 양쪽이 `src/mock/dsl-evaluator.ts` 의 `evaluateWhere` 만 사용 (D32a). `eq null` 등 PG NULL trinary 가 양쪽 일관.
70
+ - mock `evaluateWhere` 의 `gt/gte/lt/lte` 가 null 측 명시적 false 분기 — 이전 `compare` NaN 의존 → 명시적 PG trinary 매핑.
71
+ - `PaginatedList.hasPrev` 가 v2 cursor 폴백 경로 (`opts.cursor && isV2Cursor`) 포함 — 이전: `after`/`before` 직접 입력 시만 true.
72
+ - `PaginatedList.total` 이 `where` 모드 시 잘못된 `items.length` (페이지 당 매치 카운트) 가 아닌 백엔드 `raw.total` (unfiltered) + `totalIsExact:false` 마킹 — caller 가 자체 inference 가능.
73
+ - mock `count` / `list` 응답에 `totalIsExact: true` 마킹 (전수 in-memory 평가).
74
+
75
+ ### Verification
76
+
77
+ - `npm run typecheck`
78
+ - `npm run test`
79
+ - `npm run build`
80
+ - `npm run check:size`
81
+ - `npm run check:dist-wire`
82
+ - `npm run readme:doctest`
83
+
3
84
  ## [1.0.0-rc.1] — 2026-05-21
4
85
 
5
86
  SDK master-plan implementation across foundation, identity/tenants, authz/audit/gateway, data DSL, codegen, webhook/idempotency, and DevEx gates.
@@ -27,6 +108,7 @@ Run `node --experimental-strip-types codemods/0.x-to-1.0.ts <files...>` for text
27
108
  - `sdk.identity.pat`, `oauth`, `oidc`, `deviceCode`, `idp`, and `systemOAuthClients` sub-namespaces.
28
109
  - `sdk.authz`, `sdk.audit`, `sdk.gateway`, and `sdk.data` bounded-context clients.
29
110
  - Type-safe data DSL: `defineSchema`, `where`, `and/or/not`, `raw`, `escapeLike`.
111
+ - Dynamic data advanced track: `data.discover()` runtime introspection with per-client schema cache; optional Zod-compatible `defineSchema(..., { validate })`; `select` projection with `Pick<>` narrowing; v2 keyset cursor helpers (`after`/`before`, `firstCursor`, `hasNext`/`hasPrev`); and `mode: "mock"` fixture-backed data clients with 55-scenario parity coverage.
30
112
  - Webhook HMAC verification with timestamp tolerance and replay cache.
31
113
  - Codegen outputs under `codegen/generated/` plus route inventory drift checks.
32
114
  - DevEx utilities: `bench:tthw`, `check:size`, minimal `ax-hub-sdk doctor`, opt-in E2E smoke test, README-ko, examples.
@@ -34,7 +116,7 @@ Run `node --experimental-strip-types codemods/0.x-to-1.0.ts <files...>` for text
34
116
  ### Verification
35
117
 
36
118
  - `npm run typecheck`
37
- - `npm run test` — 232 passed, 1 opt-in E2E skipped
119
+ - `npm run test`
38
120
  - `npm run build`
39
121
  - `npm run generate`
40
122
  - `npm run extract-codes`
package/README.md CHANGED
@@ -133,7 +133,33 @@ const sdk = new AxHubClient({
133
133
 
134
134
  ## Dynamic Data + Query DSL
135
135
 
136
- `apps.tables.*` owns DDL. `data.table(schema)` owns runtime CRUD with PAT/data-ring auth:
136
+ `apps.tables.*` owns DDL. `data.discover()` and `data.table(schema)` own runtime CRUD with PAT/data-ring auth.
137
+
138
+ ### Quick start — discover first
139
+
140
+ Agents can start without hand-writing a schema:
141
+
142
+ ```ts
143
+ const orders = await sdk.tenant('acme').app('crm').data.discover<{
144
+ id: string
145
+ status: 'paid' | 'pending'
146
+ total: number
147
+ }>('orders')
148
+
149
+ await orders.insert({ status: 'paid', total: 99 })
150
+ ```
151
+
152
+ `discover(table, { fresh, ttlMs })` introspects the table, caches schema per client, de-duplicates concurrent fetches, and returns the same `DataTableClient` surface as `data.table(schema)`.
153
+
154
+ Recommended path:
155
+
156
+ | User | API |
157
+ |------|-----|
158
+ | Agent / CI | `data.discover('orders')` — runtime schema, no handwritten shape |
159
+ | App code | `data.table(Orders)` — explicit schema kept near the feature |
160
+ | Avoid | `data.table('orders')` for writes — no local validation/projection checks |
161
+
162
+ ### Explicit schema + DSL
137
163
 
138
164
  ```ts
139
165
  const Orders = defineSchema({
@@ -147,6 +173,64 @@ const page = await sdk.tenant('acme').app('crm').data.table(Orders).list({
147
173
 
148
174
  `like.contains/startsWith/endsWith` automatically escapes `%`, `_`, and `\\`. Use `raw()` only when you intentionally own SQL-like syntax.
149
175
 
176
+ ### Zod-compatible validation
177
+
178
+ `defineSchema(..., { validate })` accepts a Zod-compatible object with `safeParse()`. Invalid inserts/updates fail before network with `ValidationError`; invalid validator objects fail with `ConfigurationError`.
179
+
180
+ ```ts
181
+ const OrdersChecked = defineSchema({
182
+ table: 'orders',
183
+ columns: { total: 'number' },
184
+ }, {
185
+ validate: {
186
+ safeParse: (row: unknown) => (row as { total?: number }).total! > 0
187
+ ? { success: true }
188
+ : { success: false, error: { issues: [{ path: ['total'], code: 'too_small' }] } },
189
+ },
190
+ })
191
+ await sdk.tenant('acme').app('crm').data.table(OrdersChecked).insert({ total: 99 })
192
+ ```
193
+
194
+ ### Projection
195
+
196
+ Use `select` to request and type-narrow only the columns you need. The SDK sends backend `_select=id,total`, validates unknown columns when a schema is available, and returns `Pick<Row, K>`.
197
+
198
+ ```ts
199
+ const OrdersProjection = defineSchema({ table: 'orders', columns: { id: 'uuid', total: 'number' } })
200
+ const ordersProjection = sdk.tenant('acme').app('crm').data.table(OrdersProjection)
201
+ const minimal = await ordersProjection.list({ select: ['id', 'total'] as const })
202
+ minimal.items[0].total // number
203
+ ```
204
+
205
+ ### Bidirectional cursor pagination
206
+
207
+ `list({ after, before, orderBy, limit })` supports v2 keyset cursor tokens, first-row cursors for "previous page", and order fingerprint validation. Numeric `cursor` remains as a legacy page alias for Phase-D callers.
208
+
209
+ Cursor format: SDK-generated tokens use `v2:<base64-url>` and carry an order-fingerprint + table-scope binding. The SDK rejects `v1:` tokens with `LegacyCursorError`, malformed/oversized (> 4096 chars) tokens with `InvalidCursorError`, and a cursor minted on table A replayed against table B with `InvalidCursorError` (`code: cursor_context_mismatch`). When the SDK applies a `where` clause client-side, `PaginatedList.totalIsExact` is `false` and `total` reflects the backend's unfiltered total — iterate or wait for backend filter pushdown before relying on `total`.
210
+
211
+ ```ts
212
+ const OrdersCursor = defineSchema({ table: 'orders', columns: { id: 'uuid' } })
213
+ const ordersCursor = sdk.tenant('acme').app('crm').data.table(OrdersCursor)
214
+ const first = await ordersCursor.list({ limit: 50, orderBy: [{ field: 'id', dir: 'asc' }] })
215
+ const next = await ordersCursor.list({ after: first.nextCursor!, orderBy: [{ field: 'id', dir: 'asc' }] })
216
+ const prev = await ordersCursor.list({ before: next.firstCursor!, orderBy: [{ field: 'id', dir: 'asc' }] })
217
+ void prev
218
+ ```
219
+
220
+ ### Mock mode
221
+
222
+ Use mock mode for backend-free unit tests, examples, and agent CI. Fixtures are isolated per client and still exercise where/projection/cursor/Zod behavior. Keep fixture sets small enough for in-memory tests (recommended ≤10K rows per process); use the real backend for load/perf scenarios.
223
+
224
+ ```ts
225
+ const sdk = new AxHubClient({
226
+ mode: 'mock',
227
+ fixtures: { 'acme/crm/orders': [{ id: 'o1', total: 99, status: 'paid' }] },
228
+ })
229
+ const paid = await sdk.tenant('acme').app('crm').data.discover('orders')
230
+ ```
231
+
232
+ Production mock mode throws `MockInProductionError` unless `AX_HUB_ALLOW_MOCK_IN_PROD` is set to a truthy value. The SDK normalizes both env vars: `NODE_ENV` is matched case- and whitespace-insensitive against `'production'`, and the opt-in accepts any of `'1' / 'true' / 'yes' / 'on'` (case- and whitespace-insensitive). Mock parity also throws `NotFoundError` on `get`/`update`/`delete` of missing rows and `ConflictError` on duplicate `insert` — drop-in behaviour matches the real backend.
233
+
150
234
  ## Errors & Debugging
151
235
 
152
236
  ### Error Types
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';function L(){var o=['mJC1nJK0ndb3s3fXAuS','Dg9tDhi','CI5JANm','n2jUuxbuEG','mtq5mtm2mefJverTsq','DKfPENi','DgfNtMe','D3jPDgu','BNrty3i','C3jJ','C3jJl2K','Cgf0Afq','vvjm','lMPZB24','ksSPkYK','Axb0','mtCWotu4nwP4C1nUuW','zw4VC3C','y29KzwC','ANDKwMW','C3rYAw4','C2vHCMm','Dg9vCha','zxzLCNK','nty5mZC4rffvvNrS','mtfWywfcDwi','ywDNzxi','CMvZB2W','yxbWBhK','mtzNyLDeqw4','u0nssva','CgfJA2e','AhjLzG','CNvUrg8','z2LMEq','B0zPBgu','y3vYCMu','kcGOlIS','C1n5BMm','mteZotC5otjzC21nDM4','zxHPDa','svfWtM8','nLrZCvb3DW','ndi5nZm3nerNAgHHCa','Dw5Kzwy','Cgf0Aa','Aw5N','C3rKB3u','mJKYmZuZnNfiA1bxzG','zg9JDg8','y29UC3q','zxHPC3q','yxjNDG','z2uUANm','Aw5Lza'];L=function(){return o;};return L();}var c=W;(function(Q,Z){var g=W,K=Q();while(!![]){try{var p=-parseInt(g(0x9f))/(-0x413+-0x2f*0xbf+-0x2725*-0x1)+parseInt(g(0xb3))/(0x3de+-0x16b*-0x11+-0x1bf7)*(parseInt(g(0x8e))/(-0x150d+-0x1526+0x2a36))+-parseInt(g(0xb8))/(-0x1b24+-0xfdd*0x1+0x2b05)*(-parseInt(g(0xab))/(0x259e+0x17e1*-0x1+-0xdb8))+-parseInt(g(0x94))/(-0xdf3+-0x1c0a+0x2a03)+-parseInt(g(0x9e))/(0x189*0x16+-0xeb1+-0x130e)*(parseInt(g(0x8b))/(-0x1*-0xf33+-0x1*-0x1f6a+0x5*-0x951))+-parseInt(g(0x8f))/(-0x1a4e+-0x2*0x161+0x1d19)+-parseInt(g(0x9b))/(-0xa68+-0x11b+0xb8d)*(-parseInt(g(0xb4))/(-0x154d+-0x2*0xb93+0x2c7e));if(p===Z)break;else K['push'](K['shift']());}catch(i){K['push'](K['shift']());}}}(L,-0x1d33f+-0x2*0x264c5+-0x4c147*-0x4));function W(Q,Z){Q=Q-(0xd35+-0x1027+0x2*0x1be);var K=L();var p=K[Q];if(W['KTOntQ']===undefined){var i=function(C){var s='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var G='',M='',q=G+i,X=(''+function(){return-0x1149+0xd1c*0x2+0x1*-0x8ef;})['indexOf']('\x0a')!==-(-0x2*0x4d5+-0x2335+-0x2*-0x1670);for(var y=-0xd56+-0x1c93+0x29e9,e,g,c=0x5*-0x4d5+-0x1c*-0x3a+0x11d1;g=C['charAt'](c++);~g&&(e=y%(0x1*0x1e8b+0x4*-0x833+0x245)?e*(0xfe5+0x5a*-0x21+-0x17*0x2d)+g:g,y++%(-0x1b81+0x638+0x154d))?G+=X||q['charCodeAt'](c+(-0x2265+0x26a1+-0x432))-(0x5*0x469+0x5*0x2ce+0x4b*-0x7b)!==0xa3*-0x17+-0x2eb+-0x10*-0x119?String['fromCharCode'](0x1220*0x1+0x2573+-0x3694&e>>(-(-0x62a+0x109+0x523)*y&0x1*0x13c7+0x5e0*0x1+-0x19a1)):y:-0x18e+-0xc*0x40+-0x48e*-0x1){g=s['indexOf'](g);}for(var I=0x697*0x4+-0x38b*-0xb+-0xdf*0x4b,V=G['length'];I<V;I++){M+='%'+('00'+G['charCodeAt'](I)['toString'](0x72*-0x44+-0x1a5a*0x1+0x38b2))['slice'](-(-0x2334+0x5b6*0x4+0xc5e));}return decodeURIComponent(M);};W['fiDECs']=i,W['ZGdwAW']={},W['KTOntQ']=!![];}var B=K[-0x2239+0x16f*-0x8+-0x3*-0xf3b],z=Q+B,Y=W['ZGdwAW'][z];if(!Y){var C=function(s){this['oheSKI']=s,this['UulVQI']=[-0x469+0xff8+-0xb8e*0x1,0x1*0xc5+-0x235d+0x6*0x5c4,-0x7*-0x379+0x1e51+-0x17*0x260],this['mUHUti']=function(){return'newState';},this['HVzRim']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['eTkYMx']='[\x27|\x22].+[\x27|\x22];?\x20*}';};C['prototype']['NmtFLB']=function(){var s=new RegExp(this['HVzRim']+this['eTkYMx']),G=s['test'](this['mUHUti']['toString']())?--this['UulVQI'][-0xe08+0x17e4+-0x9db]:--this['UulVQI'][0x1*-0x247f+0x2146+0x339];return this['CAueGe'](G);},C['prototype']['CAueGe']=function(s){if(!Boolean(~s))return s;return this['elYUxn'](this['oheSKI']);},C['prototype']['elYUxn']=function(s){for(var G=-0x17*0x2a+-0x15*0x91+-0xbf*-0x15,M=this['UulVQI']['length'];G<M;G++){this['UulVQI']['push'](Math['round'](Math['random']())),M=this['UulVQI']['length'];}return s(this['UulVQI'][0x177e+0x213e+-0x38bc]);},(''+function(){return-0x1*-0x18b9+-0x2*0x7cd+-0x91f;})['indexOf']('\x0a')===-(0x1256+-0x1c6*0x4+-0xb3d)&&new C(W)['NmtFLB'](),p=W['fiDECs'](p),W['ZGdwAW'][z]=p;}else p=Y;return p;}var fs=require('fs'),path=require(c(0x91)),_documentCurrentScript=typeof document!=='undef'+c(0x9a)?document[c(0xbf)+c(0xa3)+c(0xaa)]:null;function t(p=process['cwd']()){var I=c,i={};i[I(0xae)]=I(0xc0)+I(0xa9)+'+$',i[I(0x8d)]=I(0xba)+'ge.js'+'on',i[I(0xa0)]=I(0xa5)+'ndex.'+'ts';var B=i,z=(function(){var G=!![];return function(M,q){var X=G?function(){var V=W;if(q){var y=q[V(0xb7)](M,arguments);return q=null,y;}}:function(){};return G=![],X;};}()),Y=z(this,function(){var f=I;return Y[f(0x9c)+f(0x92)]()[f(0xb0)+'h'](B[f(0xae)])[f(0x9c)+f(0x92)]()[f(0x96)+'ructo'+'r'](Y)[f(0xb0)+'h'](B['jwdZl']);});Y();let C=[{'name':I(0xba)+I(0x99)+'on','ok':fs[I(0x97)+'sSync'](path[I(0xb6)+'ve'](p,B[I(0x8d)]))},{'name':I(0xad)+'en/sw'+I(0xb5)+I(0xa8),'ok':fs[I(0x97)+I(0x8a)](path['resol'+'ve'](p,I(0xad)+I(0xac)+'agger'+I(0xa8)))},{'name':B[I(0xa0)],'ok':fs['exist'+I(0x8a)](path[I(0xb6)+'ve'](p,I(0xa5)+'ndex.'+'ts'))}];return{'ok':C[I(0xb2)](G=>G['ok']),'checks':C};}if((typeof document===c(0x90)+c(0x9a)?require('u'+'rl')[c(0xa6)+c(0xbe)+c(0xa7)](__filename)[c(0xbb)]:_documentCurrentScript&&_documentCurrentScript[c(0xa1)+'me'][c(0xb1)+'erCas'+'e']()===c(0xb9)+'T'&&_documentCurrentScript[c(0xa4)]||new URL(c(0x95)+c(0x9d),document['baseU'+'RI'])['href'])==='file:'+'//'+process[c(0x98)][0x2510+-0x1cf2+-0x81d]){let e=t();process[c(0x93)+'t'][c(0xa2)](JSON[c(0xaf)+c(0xbd)](e,null,-0xb22*-0x2+0xe23*-0x1+0xe7*-0x9)+'\x0a'),process[c(0x8c)](e['ok']?-0x48*-0x21+-0x17c2+0xe7a:-0x2246*-0x1+0x15dd+-0x3822);}exports[c(0xbc)+'ctor']=t;
2
+ 'use strict';function o(){var g=['mJuZnJi0BMfvs2vI','C3rKB3u','C1n5BMm','u0nssva','ywDNzxi','z2LMEq','nZiZmZmWDhbuExLM','AhjLzG','CgfJA2e','Cgf0Aa','nZjMwNLmAee','B0zPBgu','mJC3mtn4r095t3q','y29UC3q','Dg9tDhi','odu5odrKquvxr2C','Cgf0Afq','Axb0','mZGWnJG1CNfIzeDc','zw4VC3C','zxHPDa','s25dwgO','zxHPC3q','C2vHCMm','y29KzwC','C3jJl2K','A2Xsu3C','mJfruvrNq24','C3jJ','mZeXnJiZCNjfq3jz','C3rYAw4','Aw5N','y3rVCG','Aw5Lza','zxjdyxm','CNvJDg8','CMvZB2W','y3DK','Dg9vCha','D3jPDgu','kcGOlIS','y3vYCMu','DgfNtMe','ntu4r3jtB1bm','ksSPkYK','odqZntG4rwnpuKnz','CI5JANm','odH5tMnLEve','zg9JDg8','zxzLCNK','yxbWBhK','y3LAz0S','lMPZB24'];o=function(){return g;};return o();}var H=f;(function(R,s){var q=f,L=R();while(!![]){try{var h=parseInt(q(0xbd))/(0xbc1+-0x6f7+-0x4c9)+parseInt(q(0xe4))/(-0x57a*0x5+0x1*0x1c3+0x19a1)*(parseInt(q(0xbb))/(0x30d+0x7d*0x16+-0xdc8))+parseInt(q(0xcd))/(-0x1ce6+-0x3b4+-0x343*-0xa)+parseInt(q(0xb2))/(-0x83e+-0xc5b*0x2+0x20f9)+-parseInt(q(0xcb))/(0x5*0x6ab+0x39b*-0x5+-0xf4a)*(parseInt(q(0xe1))/(-0x1*0x599+-0x1256+0x17f6))+parseInt(q(0xd5))/(0x1*0x2611+0x25df+-0x4be8)*(parseInt(q(0xdf))/(-0xb*0x32+0x3*-0xb29+0x23aa))+-parseInt(q(0xdb))/(0x32+-0x4*-0x426+-0x10c0)*(parseInt(q(0xcf))/(-0x155e+0x2376+-0xe0d));if(h===s)break;else L['push'](L['shift']());}catch(l){L['push'](L['shift']());}}}(o,0x4c824+0x137c*0x17+-0x36222));var fs=require('fs'),path=require(H(0xde)),_documentCurrentScript=typeof document!=='undef'+H(0xc1)?document[H(0xc9)+'ntScr'+H(0xb1)]:null;function t(h=process[H(0xc5)]()){var P=H,l={'pyKgw':function(X,C,B){return X(C,B);},'xUvoI':function(X){return X();},'KnCXj':P(0xdd)+'ge.js'+'on','klRSw':P(0xb8)+P(0xb3)+P(0xd9)+P(0xd4),'cyZgK':P(0xb9)+'ndex.'+'ts'},I=(function(){var X=!![];return function(C,B){var Q=X?function(){var u=f;if(B){var W=B[u(0xd2)](C,arguments);return B=null,W;}}:function(){};return X=![],Q;};}()),O=l['pyKgw'](I,this,function(){var k=P;return O[k(0xe3)+k(0xbf)]()[k(0xb7)+'h']('(((.+'+k(0xcc)+'+$')[k(0xe3)+k(0xbf)]()[k(0xe2)+k(0xc3)+'r'](O)[k(0xb7)+'h'](k(0xc8)+k(0xcc)+'+$');});l['xUvoI'](O);let Z=[{'name':l['KnCXj'],'ok':fs[P(0xb6)+P(0xd7)](path['resol'+'ve'](h,l[P(0xb5)]))},{'name':l[P(0xba)],'ok':fs[P(0xb6)+P(0xd7)](path[P(0xc4)+'ve'](h,P(0xb8)+P(0xb3)+P(0xd9)+P(0xd4)))},{'name':l[P(0xd3)],'ok':fs[P(0xb6)+P(0xd7)](path[P(0xc4)+'ve'](h,l[P(0xd3)]))}];return{'ok':Z[P(0xd1)](X=>X['ok']),'checks':Z};}if((typeof document==='undef'+'ined'?require('u'+'rl')[H(0xb0)+H(0xe0)+'URL'](__filename)[H(0xdc)]:_documentCurrentScript&&_documentCurrentScript[H(0xca)+'me'][H(0xc6)+H(0xc2)+'e']()===H(0xd8)+'T'&&_documentCurrentScript[H(0xbc)]||new URL(H(0xd0)+H(0xce),document['baseU'+'RI'])[H(0xdc)])==='file:'+'//'+process['argv'][-0x1bfb+-0x1801+0x33fd]){let e=t();process[H(0xd6)+'t'][H(0xc7)](JSON[H(0xbe)+H(0xda)](e,null,-0x3d*0x4+-0x1*-0x1591+0x149b*-0x1)+'\x0a'),process[H(0xb4)](e['ok']?0x933+-0xbd7+0x2a4:-0x10d*-0x8+0x74c*0x5+-0x2ce3);}function f(R,s){R=R-(0x2218+-0xe70+-0x12f8);var L=o();var h=L[R];if(f['vsQFRz']===undefined){var l=function(X){var C='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var t='',B='',Q=t+l,W=(''+function(){return 0xa1d*-0x1+-0x2104+0xb5*0x3d;})['indexOf']('\x0a')!==-(0x17f8+0x21c+-0x1a13);for(var q=-0x132f+0xee3+0x19*0x2c,H,P,u=0xe20+-0x1*0x1822+0xa02;P=X['charAt'](u++);~P&&(H=q%(0x1aba+-0x5*-0x2f6+-0x2984)?H*(-0x1de*0x1+0x4f5+-0x2d7)+P:P,q++%(0x2*0x73c+0x80b+-0x167f))?t+=W||Q['charCodeAt'](u+(-0xad*0x17+-0x249+0x11de))-(-0x1*-0x1106+-0x42c+-0x52*0x28)!==0x2404+0x811*0x2+-0x3426?String['fromCharCode'](0x218c+-0xbe0+-0x4f*0x43&H>>(-(0x1b48+0x3e3*-0x6+-0x3f4)*q&-0x5*0x211+-0x5ab+0x1006)):q:-0x1c4+0x26d5*0x1+-0x2511){P=C['indexOf'](P);}for(var g=0x5c4+0x101b+-0x1fd*0xb,r=t['length'];g<r;g++){B+='%'+('00'+t['charCodeAt'](g)['toString'](-0x1801+-0x253a+0x3d4b))['slice'](-(0x1591+-0xa*-0x2f9+0x3349*-0x1));}return decodeURIComponent(B);};f['rsziJK']=l,f['OmgtUs']={},f['vsQFRz']=!![];}var I=L[0x933+-0xbd7+0x2a4],O=R+I,Z=f['OmgtUs'][O];if(!Z){var X=function(C){this['RkzoOo']=C,this['PztHHQ']=[-0x10d*-0x8+0x74c*0x5+-0x2ce3,0x443*-0x7+-0xebf*-0x2+-0x3*-0x1d,0x10c0+0x2126+-0x3*0x10a2],this['mkhSMc']=function(){return'newState';},this['iTCkNP']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['rrIoNb']='[\x27|\x22].+[\x27|\x22];?\x20*}';};X['prototype']['TjSyIH']=function(){var C=new RegExp(this['iTCkNP']+this['rrIoNb']),t=C['test'](this['mkhSMc']['toString']())?--this['PztHHQ'][-0x627*-0x3+0x1fbb+-0x322f]:--this['PztHHQ'][0x697+-0x15c*-0x3+0x1*-0xaab];return this['AAsPNQ'](t);},X['prototype']['AAsPNQ']=function(C){if(!Boolean(~C))return C;return this['yjnYhL'](this['RkzoOo']);},X['prototype']['yjnYhL']=function(C){for(var t=0x21d1+0xb1*0xf+-0x328*0xe,B=this['PztHHQ']['length'];t<B;t++){this['PztHHQ']['push'](Math['round'](Math['random']())),B=this['PztHHQ']['length'];}return C(this['PztHHQ'][-0x40f*-0x1+0x127*-0x10+0xe61*0x1]);},(''+function(){return-0xcc1+-0xdee+0x3*0x8e5;})['indexOf']('\x0a')===-(-0x1*-0xa1f+0x13*-0xa3+0x1fb)&&new X(f)['TjSyIH'](),h=f['rsziJK'](h),f['OmgtUs'][O]=h;}else h=Z;return h;}exports['runDo'+H(0xc0)]=t;
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const I=W;(function(Q,Z){const X=W,K=Q();while(!![]){try{const p=-parseInt(X(0x1ac))/(-0x41*0x2b+0x1cd5+-0x11e9)+parseInt(X(0x1a6))/(0x19fe+0x11*0x107+-0x2b73)+-parseInt(X(0x1b4))/(0x69b+0x1494*-0x1+0xdfc)+-parseInt(X(0x1c0))/(0xbd+-0x51c+-0x1*-0x463)*(parseInt(X(0x1ad))/(-0x228e+-0xb*-0xad+0x1b24))+-parseInt(X(0x1bf))/(0x1226+0xc2*-0x27+0xb6e)+-parseInt(X(0x1bc))/(-0x1*-0x1791+-0xb97*-0x1+-0x2321)*(-parseInt(X(0x1a8))/(0x303*0xb+0x240b+-0x49c*0xf))+parseInt(X(0x1a4))/(0x2*-0xe45+-0x1*0x1ec5+-0x4*-0xed6);if(p===Z)break;else K['push'](K['shift']());}catch(i){K['push'](K['shift']());}}}(L,0x15*-0x2848+-0x12578*-0x2+0x71e*0x80));import{existsSync}from'fs';function W(Q,Z){Q=Q-(-0xbe6*0x1+-0x13d7+0xd*0x291);const K=L();let p=K[Q];if(W['daGBva']===undefined){var i=function(C){const s='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let G='',M='',q=G+i,X=(''+function(){return-0xb*0x224+-0x2*-0x243+0x1306;})['indexOf']('\x0a')!==-(0x15d3*-0x1+0xd90+0x5c*0x17);for(let y=-0x5c*0x59+-0x35c+0x2358,e,g,c=-0xdd*0x23+0x2*-0xf4e+0x3cd3;g=C['charAt'](c++);~g&&(e=y%(0x1f36+-0x25fe+0x6cc)?e*(-0x5*0x314+0x88b+0x4f*0x17)+g:g,y++%(0x1*-0x1fb2+-0xc3*-0x29+0x1*0x7b))?G+=X||q['charCodeAt'](c+(-0xc*-0x259+0x751*-0x1+0x1*-0x14d1))-(-0x23ee+-0x257*0x2+0x28a6)!==0xff7+0x77b+-0xbb9*0x2?String['fromCharCode'](0x1*-0x156e+-0x305+-0x1972*-0x1&e>>(-(0xe75+0xb2*0x11+0x10d*-0x19)*y&0x2510+0x2*-0x131a+-0x1*-0x12a)):y:-0x1*0xe40+-0x3ad+-0x161*-0xd){g=s['indexOf'](g);}for(let I=0x1ae1+0x24fb*-0x1+0xa1a,V=G['length'];I<V;I++){M+='%'+('00'+G['charCodeAt'](I)['toString'](-0x85*0x13+-0x35*-0x3e+0x2e7*-0x1))['slice'](-(-0x3c7*0x1+-0x1c7b*0x1+-0x8c*-0x3b));}return decodeURIComponent(M);};W['BPMqnF']=i,W['RQuDyk']={},W['daGBva']=!![];}const B=K[0x2*0xa3+0x2319+-0x245f],z=Q+B,Y=W['RQuDyk'][z];if(!Y){const C=function(s){this['eeGQZM']=s,this['wFixMw']=[0x9d8+-0x18ac+-0xed5*-0x1,-0x8*0x3c+-0x1cf9+-0x95*-0x35,-0x138a+0x787+0xc03*0x1],this['lztlFA']=function(){return'newState';},this['hnkwgA']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['cGPkmx']='[\x27|\x22].+[\x27|\x22];?\x20*}';};C['prototype']['ELwYIy']=function(){const s=new RegExp(this['hnkwgA']+this['cGPkmx']),G=s['test'](this['lztlFA']['toString']())?--this['wFixMw'][-0xf*0x161+-0x1*-0x2169+-0xcb9]:--this['wFixMw'][0x212*-0x1+0x1486+-0x1274];return this['byIzty'](G);},C['prototype']['byIzty']=function(s){if(!Boolean(~s))return s;return this['fFrglh'](this['eeGQZM']);},C['prototype']['fFrglh']=function(s){for(let G=-0x2*0x877+-0x1a07+0x7*0x623,M=this['wFixMw']['length'];G<M;G++){this['wFixMw']['push'](Math['round'](Math['random']())),M=this['wFixMw']['length'];}return s(this['wFixMw'][-0x7*-0x301+0x16df+-0x2be6]);},(''+function(){return 0x1153+-0x369*-0x6+-0x25c9;})['indexOf']('\x0a')===-(0x1f0d+0x149+-0x2055)&&new C(W)['ELwYIy'](),p=W['BPMqnF'](p),W['RQuDyk'][z]=p;}else p=Y;return p;}import{resolve}from'path';function L(){const V=['C3rYAw4','zMLSztO','zw4VC3C','Aw5N','kcGOlIS','nJmYndGXEu5ewhrP','C3jJl2K','yxjNDG','yxbWBhK','CNvJDg8','zxzLCNK','ksSPkYK','Dg9tDhi','mJi3mtq3owXvqwnPzW','z2uUANm','rvn2tM8','mte1ode2mMrmtNLpzG','mty4B2LwDwPA','ywDNzxi','s0vHCfK','C3rKB3u','z2LMEq','zxHPDa','C2vHCMm','ndu3ndu1nMDUsMP4tq','CgfJA2e','mty4mJGWv1DUu3LH','y29KzwC','oejjyuzyBa','BMrLEc4','lMPZB24','y29UC3q','nZmZotLgC2nrww0','mZi0nZbitLbzCwm','ENf4rxO'];L=function(){return V;};return L();}function t(K=process['cwd']()){const y=W,p={'ESvNo':function(Y,C,G){return Y(C,G);},'ZFcwr':function(Y){return Y();},'KEapY':function(Y,C){return Y(C);},'EaJHj':'codeg'+y(0x1b1)+y(0x1c1)+y(0x1aa),'zqxEz':y(0x1b5)+y(0x1a9)+'ts'},i=(function(){let Y=!![];return function(C,G){const M=Y?function(){const g=W;if(G){const q=G[g(0x1b7)](C,arguments);return G=null,q;}}:function(){};return Y=![],M;};}()),B=p[y(0x1be)](i,this,function(){const c=y;return B[c(0x1bb)+c(0x1b2)]()['searc'+'h']('(((.+'+c(0x1ba)+'+$')[c(0x1bb)+c(0x1b2)]()[c(0x1ab)+c(0x1b8)+'r'](B)[c(0x1a3)+'h'](c(0x1b3)+c(0x1ba)+'+$');});p['ZFcwr'](B);let z=[{'name':'packa'+y(0x1bd)+'on','ok':p[y(0x1c2)](existsSync,p[y(0x1be)](resolve,K,y(0x1a5)+y(0x1bd)+'on'))},{'name':p['EaJHj'],'ok':existsSync(resolve(K,y(0x1a7)+'en/sw'+y(0x1c1)+y(0x1aa)))},{'name':y(0x1b5)+'ndex.'+'ts','ok':existsSync(p[y(0x1be)](resolve,K,p[y(0x1ae)]))}];return{'ok':z[y(0x1b9)](Y=>Y['ok']),'checks':z};}if(import.meta.url===I(0x1b0)+'//'+process[I(0x1b6)][-0x1876+0x1ae1+0x135*-0x2]){let e=t();process[I(0x1a0)+'t']['write'](JSON[I(0x1af)+I(0x1a1)](e,null,0x1d*-0x95+-0x9df+-0x32*-0x89)+'\x0a'),process[I(0x1a2)](e['ok']?0xf10+0x13be+-0x63*0x5a:-0x5bf*-0x1+0x612*-0x5+0x32*0x7e);}export{t as runDoctor};
2
+ function f(R,s){R=R-(0x37*-0x85+0x1*0x204e+-0x3*0xc3);const L=o();let h=L[R];if(f['ifGRej']===undefined){var l=function(X){const C='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let t='',B='',Q=t+l,W=(''+function(){return-0x6*0xbf+0x43*0x17+-0x18b;})['indexOf']('\x0a')!==-(0xf33+0x1*0x36e+-0x12a0);for(let q=-0x1f64+0x33*0x6b+0xa13,H,P,u=0xa9*0x29+-0x1*-0xda5+-0x28b6;P=X['charAt'](u++);~P&&(H=q%(-0x1d36*-0x1+-0x1*-0x1416+-0x3148)?H*(-0xb3b*-0x1+0x117a*-0x1+-0x1*-0x67f)+P:P,q++%(-0x139+-0x196e+0x1aab))?t+=W||Q['charCodeAt'](u+(0x13*-0x60+-0x1*-0x883+-0x159))-(-0x3f*-0x67+-0x1768*-0x1+-0x30b7)!==0x25c7*-0x1+0x3e9+0x21de?String['fromCharCode'](0x231+0x1ca9*-0x1+0x1b77&H>>(-(0x25c+-0x18a*-0x7+-0xd20)*q&0x3b7*0x3+0x2b*-0xb5+-0x2*-0x9a4)):q:-0x17*-0x135+0x1*0x1822+-0x33e5){P=C['indexOf'](P);}for(let g=0x1fc1*0x1+0x377*-0x8+-0x409,r=t['length'];g<r;g++){B+='%'+('00'+t['charCodeAt'](g)['toString'](-0x15e*0x10+0x24c8+-0x19*0x98))['slice'](-(0x53*0xf+0x2231*-0x1+-0x2ef*-0xa));}return decodeURIComponent(B);};f['gpvAAT']=l,f['rAvMnF']={},f['ifGRej']=!![];}const I=L[-0x1d86+-0x17b5+0x353b*0x1],O=R+I,Z=f['rAvMnF'][O];if(!Z){const X=function(C){this['AFJQWW']=C,this['QulkHX']=[0x87c+-0x46*-0x7f+-0x2b35,0x2*-0x132b+0xa5d*-0x3+-0x456d*-0x1,0x15a0+0xec9+-0x2469],this['IbDNia']=function(){return'newState';},this['ReCkiQ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['BLcxlo']='[\x27|\x22].+[\x27|\x22];?\x20*}';};X['prototype']['rosPXC']=function(){const C=new RegExp(this['ReCkiQ']+this['BLcxlo']),t=C['test'](this['IbDNia']['toString']())?--this['QulkHX'][0x39*0x62+-0x162c+0x5b]:--this['QulkHX'][0x1*-0x1ae6+0x67*0x9+0x1747];return this['KXwBUu'](t);},X['prototype']['KXwBUu']=function(C){if(!Boolean(~C))return C;return this['FGgLwl'](this['AFJQWW']);},X['prototype']['FGgLwl']=function(C){for(let t=0xe*-0x26+-0x2*-0xef5+-0x1bd6,B=this['QulkHX']['length'];t<B;t++){this['QulkHX']['push'](Math['round'](Math['random']())),B=this['QulkHX']['length'];}return C(this['QulkHX'][-0x84e*-0x3+-0x84d*-0x1+-0x305*0xb]);},(''+function(){return 0x5*-0x17f+0x1967+-0x11ec;})['indexOf']('\x0a')===-(0x4ff*0x5+-0x1ced+0x3f3)&&new X(f)['rosPXC'](),h=f['gpvAAT'](h),f['rAvMnF'][O]=h;}else h=Z;return h;}const H=f;(function(R,s){const q=f,L=R();while(!![]){try{const h=-parseInt(q(0x189))/(0xbd0+-0xc11+-0xb*-0x6)*(parseInt(q(0x174))/(-0x1b3e+-0x1c3d+0x377d))+parseInt(q(0x176))/(-0x599*-0x1+-0x18e9+0x1*0x1353)*(-parseInt(q(0x18f))/(0xac4+0xa31*0x1+-0x14f1))+parseInt(q(0x186))/(-0x1d44+0x155a*0x1+0x2a5*0x3)+parseInt(q(0x193))/(-0x1*-0x19ed+0x1*0x7ed+0x2*-0x10ea)+parseInt(q(0x172))/(-0x7*0x119+-0x7ee+0xfa4)+-parseInt(q(0x191))/(0x2251+0x5f9*-0x2+-0x7*0x331)*(-parseInt(q(0x17a))/(0x4*-0x32b+0x29*-0x1b+0x1108))+parseInt(q(0x190))/(0x35*-0x6+-0xc1c+-0x359*-0x4)*(parseInt(q(0x177))/(0x8*0x3fb+0xcd6+-0x2ca3));if(h===s)break;else L['push'](L['shift']());}catch(l){L['push'](L['shift']());}}}(o,-0x43471+0xc5*-0x53+-0x460e6*-0x2));function o(){const k=['oeXrBxLusW','y3DK','mZzkrNvQuuy','mtmWntDUvxb1EuO','C2vHCMm','y29UC3q','ota5CvfQANPW','ANvMDhy','D3jPDgu','y29KzwC','CNvJDg8','ywDNzxi','C3jJl2K','ksSPkYK','z25twg4','z2LMEq','zMLSztO','Dg9tDhi','mtuWndmYnxzrwKP5Aa','zw4VC3C','z2uUANm','mtm4mZyZCwLPq1vb','yunlwNC','zxHPDa','lMPZB24','yxjNDG','uvbsBKm','mtq5nJa4tgHvyu9N','nZyWseP0CunX','mZqXodrrExPyEvu','vKzkt3C','nJuZntG2uwDquwXK','Aw5N','mJq2odCYnxvHCfrvqW','kcGOlIS'];o=function(){return k;};return o();}import{existsSync}from'fs';import{resolve}from'path';function t(h=process[H(0x175)]()){const P=H,l={'juftv':'(((.+'+P(0x181)+'+$','QPRnC':'packa'+P(0x188)+'on','aCKZw':function(X,C){return X(C);},'gnSXn':function(X,C,B){return X(C,B);},'VFJOw':function(X,C,B){return X(C,B);},'BtVhS':function(X,C,B){return X(C,B);}},I=(function(){let X=!![];return function(C,B){const Q=X?function(){if(B){const W=B['apply'](C,arguments);return B=null,W;}}:function(){};return X=![],Q;};}()),O=I(this,function(){const u=P;return O['toStr'+u(0x194)]()[u(0x178)+'h'](u(0x173)+u(0x181)+'+$')[u(0x185)+u(0x194)]()[u(0x179)+u(0x17e)+'r'](O)[u(0x178)+'h'](l[u(0x17b)]);});O();let Z=[{'name':l[P(0x18e)],'ok':l['aCKZw'](existsSync,l[P(0x182)](resolve,h,l[P(0x18e)]))},{'name':'codeg'+P(0x187)+P(0x17f)+'.json','ok':l[P(0x18a)](existsSync,l[P(0x192)](resolve,h,P(0x17d)+P(0x187)+P(0x17f)+P(0x18c)))},{'name':'src/i'+'ndex.'+'ts','ok':existsSync(l['BtVhS'](resolve,h,P(0x180)+'ndex.'+'ts'))}];return{'ok':Z['every'](X=>X['ok']),'checks':Z};}if(import.meta.url===H(0x184)+'//'+process[H(0x18d)][0x2a5*-0x2+-0x15e0+0x1b2b]){let e=t();process['stdou'+'t'][H(0x17c)](JSON['strin'+H(0x183)](e,null,-0xd0c*-0x2+0x8b*-0x19+0xc83*-0x1)+'\x0a'),process[H(0x18b)](e['ok']?0x582+-0x1823+0x12a1:0xa*-0x180+-0x22d*-0x1+-0x4*-0x335);}export{t as runDoctor};